Mercurial > wow > skeletonkey
comparison SkeletonKey/HotKey.lua @ 6:f6d1c192afc6
Refactored file layout:
- frame display logic in UI.lua
- player data in Cache.lua
- event responses in Events.lua
a lot of local tables are now stored members of KeyBinder for that to work
| author | Nenue |
|---|---|
| date | Thu, 28 Jul 2016 16:45:56 -0400 |
| parents | |
| children | eeec4a600064 |
comparison
equal
deleted
inserted
replaced
| 5:9ac29fe77455 | 6:f6d1c192afc6 |
|---|---|
| 1 -- KrakTool | |
| 2 -- HotKey.lua | |
| 3 -- Created: 7/22/2016 10:28 PM | |
| 4 -- %file-revision% | |
| 5 -- Module for fixing actionbar hotkey text | |
| 6 | |
| 7 local kb, print = LibStub("LibKraken").register(KeyBinder, 'HotKey') | |
| 8 local hotkey = {} | |
| 9 local hotkeyText = {} | |
| 10 local blizHotKey = {} | |
| 11 local bindings | |
| 12 | |
| 13 -- frames obtained via post-load hooks, created by addons like Dominos or BarTender4 | |
| 14 local loadedFrames = {} | |
| 15 -- frames divided by update categories | |
| 16 local categoryFrames = {} | |
| 17 -- frames indexed by action slot ID (just the action bar, for... reasons) | |
| 18 local actionFrames = {} | |
| 19 | |
| 20 kb.wrap(hotkey) | |
| 21 | |
| 22 --- Used to determine which groups of action buttons need updating | |
| 23 local hotkeyEvents = { | |
| 24 ["UPDATE_BONUS_ACTIONBAR"] = {"bonus"}, | |
| 25 ["UPDATE_VEHICLE_ACTIONBAR"] = {"vehicle"}, | |
| 26 ["UPDATE_OVERRIDE_ACTIONBAR"] = {"override"}, | |
| 27 ["ACTIONBAR_PAGE_CHANGED"] = {"actionbar"}, | |
| 28 ["PLAYER_ENTERING_WORLD"] = {"world","all"}, | |
| 29 ["PET_UI_UPDATE"] = {"pet"}, | |
| 30 } | |
| 31 | |
| 32 do | |
| 33 local tickerQueue = {} | |
| 34 local ticker | |
| 35 local instant = false | |
| 36 hotkey.tick = function() | |
| 37 | |
| 38 if #tickerQueue == 0 then | |
| 39 instant = true | |
| 40 return | |
| 41 else | |
| 42 instant = false | |
| 43 end | |
| 44 local func = tremove(tickerQueue, 1) | |
| 45 if func then | |
| 46 --print('#', #tickerQueue) | |
| 47 func() | |
| 48 end | |
| 49 end | |
| 50 hotkey.wrap = function(f) | |
| 51 if not ticker then | |
| 52 --print('create ticker') | |
| 53 ticker = C_Timer.NewTicker(0, hotkey.tick) | |
| 54 end | |
| 55 if instant then | |
| 56 f() | |
| 57 else | |
| 58 tinsert(tickerQueue, f) | |
| 59 end | |
| 60 end | |
| 61 end | |
| 62 | |
| 63 hotkey.wrapEvent = function(event, ...) | |
| 64 kb:RegisterEvent(event) | |
| 65 hotkeyEvents[event] = {...} | |
| 66 hotkey[event] = hotkey.UpdateFromEvent | |
| 67 end | |
| 68 | |
| 69 hotkey.unwrapEvent = function(event) | |
| 70 if not kb[event] then | |
| 71 kb:UnregisterEvent(event) | |
| 72 end | |
| 73 hotkeyEvents[event] = nil | |
| 74 hotkey[event] = nil | |
| 75 end | |
| 76 | |
| 77 hotkey.ActionButton_Update = function(frame) | |
| 78 hotkey.wrap(function() | |
| 79 local actionType, actionID = GetActionInfo(frame.action) | |
| 80 hotkey.UpdateSkeletonKeyText(frame, actionType, actionID, HasAction(frame.action)) | |
| 81 end) | |
| 82 end | |
| 83 | |
| 84 | |
| 85 hotkey.RegisterFrame = function(frame) | |
| 86 --hotkey.wrap(function() | |
| 87 --print('ActionBarButtonEventsFrame_RegisterFrame(', frame:GetName(), frame.action, frame:IsVisible(), frame:IsShown()) | |
| 88 --end) | |
| 89 blizHotKey[frame] = frame.HotKey | |
| 90 loadedFrames[frame] = true | |
| 91 end | |
| 92 | |
| 93 hotkey.UpdateFromEvent = function(self, event, ...) | |
| 94 if hotkeyEvents[event] then | |
| 95 --print('call batch', event, ...) | |
| 96 for i, func in ipairs(hotkeyEvents[event]) do | |
| 97 | |
| 98 if hotkey[func] then | |
| 99 --print(' ', func) | |
| 100 hotkey[func](self, event, ...) | |
| 101 end | |
| 102 end | |
| 103 end | |
| 104 return true | |
| 105 end | |
| 106 | |
| 107 hotkey.variables = function() | |
| 108 bindings = kb.GetBindings() | |
| 109 for event, manifest in pairs(hotkeyEvents) do | |
| 110 kb:RegisterEvent(event) | |
| 111 hotkey[event] = hotkey.UpdateFromEvent | |
| 112 end | |
| 113 hotkey.wrapEvent('UNIT_PET', 'pet') | |
| 114 end | |
| 115 | |
| 116 hotkey.init = function() | |
| 117 hooksecurefunc("ActionBarButtonEventsFrame_RegisterFrame", hotkey.RegisterFrame) | |
| 118 end | |
| 119 | |
| 120 hotkey.world = function() | |
| 121 hotkeyEvents["UPDATE_BINDINGS"] = {"actionbar"} | |
| 122 hotkey.UPDATE_BINDINGS = hotkey.UpdateFromEvent | |
| 123 kb:RegisterEvent("UPDATE_BINDINGS") | |
| 124 | |
| 125 hotkey.player() | |
| 126 hotkey.pet() | |
| 127 | |
| 128 -- Set this after, since we already full-scanned buttons | |
| 129 hooksecurefunc("ActionButton_Update", hotkey.ActionButton_Update) | |
| 130 end | |
| 131 | |
| 132 -- requires all these arguments since non-actionbar buttons don't have all of said methods | |
| 133 hotkey.UpdateSkeletonKeyText = function(frame, actionType, actionID, hasAction) | |
| 134 if bindings[actionType] then | |
| 135 if actionType == 'macro' then | |
| 136 actionID = GetMacroInfo(actionID) | |
| 137 end | |
| 138 --print('|cFFFFFF00'..frame:GetName(), actionType, actionID, hasAction) | |
| 139 local binds = bindings[actionType][actionID] | |
| 140 if binds then | |
| 141 if hasAction and not frame.HotKey:IsVisible() then | |
| 142 if not hotkeyText[frame] then | |
| 143 hotkeyText[frame] = frame:CreateFontString('KeyBinderHotKeyText', 'OVERLAY') | |
| 144 hotkeyText[frame]:SetFont(frame.HotKey:GetFont()) | |
| 145 hotkeyText[frame]:SetTextColor(frame.HotKey:GetTextColor()) | |
| 146 hotkeyText[frame]:SetPoint('TOPRIGHT', frame.HotKey, 'TOPRIGHT') | |
| 147 end | |
| 148 | |
| 149 hotkeyText[frame]:SetText(kb.BindingString(unpack(binds))) | |
| 150 print('|cFF00FFFFUpdate text for', frame:GetName()) | |
| 151 print(unpack(binds)) | |
| 152 return | |
| 153 end | |
| 154 end | |
| 155 end | |
| 156 | |
| 157 if hotkeyText[frame] then | |
| 158 hotkeyText[frame]:SetText(nil) | |
| 159 --print('|cFFFF4400cleared text from', frame:GetName()) | |
| 160 end | |
| 161 end | |
| 162 | |
| 163 hotkey.actionbar = function() | |
| 164 if ActionBarButtonEventsFrame.frames then | |
| 165 for index, frame in ipairs(ActionBarButtonEventsFrame.frames) do | |
| 166 local actionType, actionID = GetActionInfo(frame.action) | |
| 167 hotkey.UpdateSkeletonKeyText(frame, actionType, actionID, HasAction(frame.action)) | |
| 168 end | |
| 169 end | |
| 170 end | |
| 171 | |
| 172 hotkey.actionslot = function(self, event, slot) | |
| 173 --print(event, slot) | |
| 174 --print(GetActionButtonForID(slot)) | |
| 175 hotkey.UpdateSkeletonKeyText(GetActionButtonForID(slot)) | |
| 176 end | |
| 177 | |
| 178 hotkey.player = function() | |
| 179 hotkey.actionbar() | |
| 180 end | |
| 181 | |
| 182 | |
| 183 hotkey.pet = function(self, event, arg1) | |
| 184 if event == 'UNIT_PET' and arg1 == 'player' then | |
| 185 if PetHasActionBar() and UnitIsVisible("pet") then | |
| 186 hotkey.wrapEvent('PET_UI_CLOSE', 'pet') | |
| 187 hotkey.wrapEvent('PET_BAR_UPDATE', 'pet') | |
| 188 else | |
| 189 hotkey.unwrapEvent('PET_UI_CLOSE') | |
| 190 hotkey.unwrapEvent('PET_BAR_UPDATE') | |
| 191 return | |
| 192 end | |
| 193 end | |
| 194 | |
| 195 for i=1, NUM_PET_ACTION_SLOTS, 1 do | |
| 196 local button = _G['PetActionButton'.. i] | |
| 197 --print(button:GetName()) | |
| 198 for k, v in pairs(button) do | |
| 199 --print(' ', k, type(v)) | |
| 200 end | |
| 201 end | |
| 202 end | |
| 203 | |
| 204 |
