Mercurial > wow > skeletonkey
comparison HotKey.lua @ 70:131d9190db6b
Curseforge migration
| author | Nenue |
|---|---|
| date | Wed, 28 Dec 2016 16:31:15 -0500 |
| parents | |
| children | c48913c5924c |
comparison
equal
deleted
inserted
replaced
| 69:b14d0611c8d9 | 70:131d9190db6b |
|---|---|
| 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 SkeletonHotKeyMixin = {} | |
| 8 local _G, wipe, tContains, tinsert = _G, table.wipe, tContains, tinsert | |
| 9 local hotkeyText = {} | |
| 10 local blizHotKey = {} | |
| 11 local bindings | |
| 12 | |
| 13 local _, kb = ... | |
| 14 local print = (DEVIAN_PNAME == 'SkeletonKey') and function(...) _G.print('HotKey', ...) end or nop | |
| 15 local cprint = (DEVIAN_PNAME == 'SkeletonKey') and function(...) _G.print('Cfg', ...) end or nop | |
| 16 | |
| 17 -- frames obtained via post-load hooks, created by addons like Dominos or BarTender4 | |
| 18 local loadedFrames = {} | |
| 19 -- frames divided by update categories | |
| 20 local categoryFrames = {} | |
| 21 -- frames indexed by action slot ID (just the action bar, for... reasons) | |
| 22 local actionSlots = {} | |
| 23 local actionFrames = {} | |
| 24 local actionIndex = {} | |
| 25 local hotkey = SkeletonHotKeyMixin | |
| 26 | |
| 27 --- Used to determine which groups of action buttons need updating | |
| 28 local hotkeyEvents = { | |
| 29 ["UPDATE_BONUS_ACTIONBAR"] = {"bonus"}, | |
| 30 ["UPDATE_VEHICLE_ACTIONBAR"] = {"vehicle"}, | |
| 31 ["UPDATE_OVERRIDE_ACTIONBAR"] = {"override"}, | |
| 32 ["ACTIONBAR_PAGE_CHANGED"] = {"actionbar"}, | |
| 33 ["ACTIONBAR_SLOT_CHANGED"] = {"actionslot"}, | |
| 34 ["PLAYER_ENTERING_WORLD"] = {"world","all"}, | |
| 35 ["PET_UI_UPDATE"] = {"pet"}, | |
| 36 ["PLAYER_SPECIALIZATION_CHANGED"] = {"player"}, | |
| 37 ["PLAYER_TALENTS_UPDATED"] = {"player"}, | |
| 38 } | |
| 39 | |
| 40 | |
| 41 function hotkey:wrapEvent (event, ...) | |
| 42 self:RegisterEvent(event) | |
| 43 hotkeyEvents[event] = {...} | |
| 44 self[event] = self.UpdateFromEvent | |
| 45 end | |
| 46 | |
| 47 function hotkey:unwrapEvent (event) | |
| 48 if not self[event] then | |
| 49 self:UnregisterEvent(event) | |
| 50 end | |
| 51 hotkeyEvents[event] = nil | |
| 52 self[event] = nil | |
| 53 end | |
| 54 | |
| 55 | |
| 56 hotkey.RegisterFrame = function(frame) | |
| 57 --wrap(function() | |
| 58 print('ActionBarButtonEventsFrame_RegisterFrame(', frame:GetName(), frame.action, frame:IsVisible(), frame:IsShown()) | |
| 59 --end) | |
| 60 blizHotKey[frame] = frame.HotKey | |
| 61 loadedFrames[frame] = true | |
| 62 end | |
| 63 | |
| 64 function hotkey:OnEvent (event, ...) | |
| 65 print('|cFFFF8888'..self:GetName()..':OnEvent()|r', event, ...) | |
| 66 if hotkeyEvents[event] then | |
| 67 for i, func in ipairs(hotkeyEvents[event]) do | |
| 68 | |
| 69 if self[func] then | |
| 70 print('->|cFF88FF00', func) | |
| 71 self[func](self, event, ...) | |
| 72 end | |
| 73 end | |
| 74 end | |
| 75 return true | |
| 76 end | |
| 77 | |
| 78 function hotkey:Setup () | |
| 79 print('variables') | |
| 80 bindings = kb.GetBindings() | |
| 81 self:player() | |
| 82 for event, triggers in pairs(hotkeyEvents) do | |
| 83 print('setup', event, triggers) | |
| 84 self:RegisterEvent(event) | |
| 85 end | |
| 86 | |
| 87 end | |
| 88 | |
| 89 function hotkey:OnLoad() | |
| 90 hooksecurefunc("ActionBarButtonEventsFrame_RegisterFrame", hotkey.RegisterFrame) | |
| 91 | |
| 92 end | |
| 93 | |
| 94 function hotkey:Update() | |
| 95 print('--|cFF00FF00ui|r') | |
| 96 self:player() | |
| 97 hotkey:pet() | |
| 98 hotkey:binding() | |
| 99 end | |
| 100 | |
| 101 | |
| 102 function hotkey:world() | |
| 103 print('--|cFF00FF00world|r') | |
| 104 -- needs to be delayed so it isn't fired 50 times at login | |
| 105 if not hotkeyEvents["UPDATE_BINDINGS"] then | |
| 106 hotkeyEvents["UPDATE_BINDINGS"] = {"binding"} | |
| 107 self.UPDATE_BINDINGS = self.UpdateFromEvent | |
| 108 self:RegisterEvent("UPDATE_BINDINGS") | |
| 109 end | |
| 110 | |
| 111 self:player() | |
| 112 self:pet() | |
| 113 end | |
| 114 | |
| 115 -- requires all these arguments since non-actionbar buttons don't have all of said methods | |
| 116 local kprint = (DEVIAN_WORKSPACE and function(...) _G.print('HotKeyUpdate', ...) end) or function() end | |
| 117 function hotkey:UpdateHotKey(frame, actionType, actionID, hasAction) | |
| 118 bindings = kb.GetBindings() | |
| 119 | |
| 120 if hasAction then | |
| 121 local indexKey = kb.FormatActionID(actionType, actionID) | |
| 122 | |
| 123 | |
| 124 | |
| 125 local actionName | |
| 126 if actionType == 'spell' then | |
| 127 actionName = GetSpellInfo(actionID) | |
| 128 elseif actionType == 'macro' then | |
| 129 actionName = GetMacroInfo(actionID) | |
| 130 elseif actionType == 'summonmount' then | |
| 131 actionName = C_MountJournal.GetMountInfoByID(actionID) | |
| 132 elseif actionType == 'item' then | |
| 133 actionName = GetItemInfo(actionID) | |
| 134 end | |
| 135 kprint(' actionKey:', indexKey) | |
| 136 | |
| 137 local binds = bindings[indexKey] | |
| 138 if binds and (not frame.HotKey:IsVisible()) then | |
| 139 kprint(frame:GetName(), '|cFF88FF00'..indexKey..'|r', hasAction, actionName) | |
| 140 local bindingsText = kb.BindingString(unpack(binds)) | |
| 141 | |
| 142 if not hotkeyText[frame] then | |
| 143 kprint('-new hotkey element') | |
| 144 hotkeyText[frame] = frame:CreateFontString(frame:GetName()..'SkeletonKey', 'OVERLAY') | |
| 145 hotkeyText[frame]:SetFont(frame.HotKey:GetFont()) | |
| 146 hotkeyText[frame]:SetTextColor(frame.HotKey:GetTextColor()) | |
| 147 hotkeyText[frame]:SetPoint('TOPRIGHT', frame.HotKey, 'TOPRIGHT') | |
| 148 | |
| 149 hooksecurefunc(frame.HotKey, 'SetVertexColor', function(self, r,g,b,a) | |
| 150 hotkeyText[frame]:SetTextColor(r,g,b,a) | |
| 151 end) | |
| 152 end | |
| 153 | |
| 154 if actionType == 'macro' then | |
| 155 local name, rank, spellID = GetMacroSpell(actionID) | |
| 156 if spellID and bindings['spell_'..spellID] then | |
| 157 bindingsText = kb.BindingString(unpack(bindings['spell_'..spellID])) | |
| 158 end | |
| 159 | |
| 160 end | |
| 161 | |
| 162 | |
| 163 hotkeyText[frame]:SetText(bindingsText) | |
| 164 hotkeyText[frame]:Show() | |
| 165 kprint(' |cFF00FFFF', frame:GetName(), '|cFFFFFF00'..tostring(bindingsText)..'|r') | |
| 166 | |
| 167 return | |
| 168 end | |
| 169 end | |
| 170 | |
| 171 if hotkeyText[frame] then | |
| 172 local oldText = hotkeyText[frame]:GetText() | |
| 173 if oldText then | |
| 174 hotkeyText[frame]:SetText(nil) | |
| 175 print('|cFFFF4400' .. frame:GetName() .. '|r', 'removed text', oldText) | |
| 176 end | |
| 177 end | |
| 178 end | |
| 179 | |
| 180 local foundSlots = {} | |
| 181 function hotkey:actionbar() | |
| 182 print('--|cFF00FF00actionbar|r') | |
| 183 wipe(actionFrames) | |
| 184 wipe(foundSlots) | |
| 185 | |
| 186 | |
| 187 bindings = kb.GetBindings() | |
| 188 for k,v in pairs(bindings) do | |
| 189 print(k, #v) | |
| 190 end | |
| 191 | |
| 192 | |
| 193 if ActionBarButtonEventsFrame.frames then | |
| 194 for index, frame in ipairs(ActionBarButtonEventsFrame.frames) do | |
| 195 local slot = frame.action | |
| 196 local actionType, actionID = GetActionInfo(slot) | |
| 197 local hasAction = HasAction(slot) | |
| 198 | |
| 199 actionSlots[slot] = frame | |
| 200 if hasAction then | |
| 201 local indexKey = kb.FormatActionID(actionType, actionID) | |
| 202 | |
| 203 actionFrames[indexKey] = actionFrames[indexKey] or {} | |
| 204 if not tContains(actionFrames[indexKey], frame) then | |
| 205 tinsert(actionFrames[indexKey], frame) | |
| 206 actionIndex[slot] = indexKey | |
| 207 end | |
| 208 local actionName = '' | |
| 209 if actionType == 'macro' then | |
| 210 actionName = GetMacroInfo(actionID) | |
| 211 elseif actionType == 'spell' then | |
| 212 actionName = GetSpellInfo(actionID) | |
| 213 end | |
| 214 | |
| 215 if bindings[indexKey] then | |
| 216 print(indexKey, actionName) | |
| 217 for k,v in pairs(bindings[indexKey]) do | |
| 218 print(k,v) | |
| 219 end | |
| 220 end | |
| 221 | |
| 222 | |
| 223 --tinsert(foundSlots, '|cFFFFFF00#'..index .. '|r ' .. tostring(indexKey).. '('..(bindings[indexKey] and table.concat(bindings[indexKey],' ') or '-')..')') | |
| 224 end | |
| 225 | |
| 226 | |
| 227 self:UpdateHotKey(frame, actionType, actionID, hasAction) | |
| 228 end | |
| 229 end | |
| 230 | |
| 231 --print('found slots: ', table.concat(foundSlots, ', ')) | |
| 232 end | |
| 233 | |
| 234 function hotkey:actionslot (event, slot) | |
| 235 local actionType, actionID = GetActionInfo(slot) | |
| 236 print(actionSlots[slot], event, actionType, actionID, HasAction(slot)) | |
| 237 local frame = actionSlots[slot] | |
| 238 if frame then | |
| 239 self:UpdateHotKey(frame, actionType, actionID, HasAction(slot)) | |
| 240 end | |
| 241 | |
| 242 end | |
| 243 | |
| 244 function hotkey:player() | |
| 245 print('player') | |
| 246 self:actionbar() | |
| 247 end | |
| 248 | |
| 249 | |
| 250 | |
| 251 function hotkey:pet(event, arg1) | |
| 252 print('--|cFF00FF00pet|r') | |
| 253 if event == 'UNIT_PET' and arg1 == 'player' then | |
| 254 if PetHasActionBar() and UnitIsVisible("pet") then | |
| 255 self:wrapEvent('PET_UI_CLOSE', 'pet') | |
| 256 self:wrapEvent('PET_BAR_UPDATE', 'pet') | |
| 257 else | |
| 258 self:unwrapEvent('PET_UI_CLOSE') | |
| 259 self:unwrapEvent('PET_BAR_UPDATE') | |
| 260 return | |
| 261 end | |
| 262 end | |
| 263 | |
| 264 for i=1, NUM_PET_ACTION_SLOTS, 1 do | |
| 265 local button = _G['PetActionButton'.. i] | |
| 266 --print(button:GetName()) | |
| 267 for k, v in pairs(button) do | |
| 268 --print(' ', k, type(v)) | |
| 269 end | |
| 270 end | |
| 271 end | |
| 272 | |
| 273 | |
| 274 --- used to pick up changes from user interaction | |
| 275 local changeIndex = 1 | |
| 276 function hotkey:binding () | |
| 277 local changeNum = #kb.ChangedBindings | |
| 278 cprint('--|cFF00FF00binding|r') | |
| 279 if changeNum >= changeIndex then | |
| 280 | |
| 281 | |
| 282 for i = changeIndex, changeNum do | |
| 283 cprint(changeIndex,'of', changeNum) | |
| 284 local actionType, actionID, name = unpack(kb.ChangedBindings[i]) | |
| 285 local actionKey = kb.FormatActionID(actionType, actionID) | |
| 286 local frames = actionFrames[actionKey] | |
| 287 if frames then | |
| 288 for i, frame in ipairs(frames) do | |
| 289 cprint('|cFFFF0088'..actionKey..'|r', frame) | |
| 290 if frame then | |
| 291 self:UpdateHotKey(frame , actionType, actionID, HasAction(frame.action)) | |
| 292 end | |
| 293 end | |
| 294 else | |
| 295 cprint('no frames picked up, rebuild') | |
| 296 self:actionbar() | |
| 297 end | |
| 298 | |
| 299 changeIndex = i + 1 | |
| 300 end | |
| 301 | |
| 302 end | |
| 303 end |
