diff HotKey.lua @ 70:131d9190db6b

Curseforge migration
author Nenue
date Wed, 28 Dec 2016 16:31:15 -0500
parents
children c48913c5924c
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HotKey.lua	Wed Dec 28 16:31:15 2016 -0500
@@ -0,0 +1,303 @@
+-- KrakTool
+-- HotKey.lua
+-- Created: 7/22/2016 10:28 PM
+-- %file-revision%
+-- Module for fixing actionbar hotkey text
+
+SkeletonHotKeyMixin = {}
+local _G, wipe, tContains, tinsert = _G, table.wipe, tContains, tinsert
+local hotkeyText = {}
+local blizHotKey = {}
+local bindings
+
+local _, kb = ...
+local print = (DEVIAN_PNAME == 'SkeletonKey') and function(...) _G.print('HotKey', ...) end or nop
+local cprint = (DEVIAN_PNAME == 'SkeletonKey') and function(...) _G.print('Cfg', ...) end or nop
+
+-- frames obtained via post-load hooks, created by addons like Dominos or BarTender4
+local loadedFrames = {}
+-- frames divided by update categories
+local categoryFrames = {}
+-- frames indexed by action slot ID (just the action bar, for... reasons)
+local actionSlots = {}
+local actionFrames = {}
+local actionIndex = {}
+local hotkey = SkeletonHotKeyMixin
+
+--- Used to determine which groups of action buttons need updating
+local hotkeyEvents = {
+  ["UPDATE_BONUS_ACTIONBAR"] = {"bonus"},
+  ["UPDATE_VEHICLE_ACTIONBAR"] = {"vehicle"},
+  ["UPDATE_OVERRIDE_ACTIONBAR"] = {"override"},
+  ["ACTIONBAR_PAGE_CHANGED"] = {"actionbar"},
+  ["ACTIONBAR_SLOT_CHANGED"] = {"actionslot"},
+  ["PLAYER_ENTERING_WORLD"] = {"world","all"},
+  ["PET_UI_UPDATE"] = {"pet"},
+  ["PLAYER_SPECIALIZATION_CHANGED"] = {"player"},
+  ["PLAYER_TALENTS_UPDATED"] = {"player"},
+}
+
+
+function hotkey:wrapEvent (event, ...)
+  self:RegisterEvent(event)
+  hotkeyEvents[event] = {...}
+  self[event] = self.UpdateFromEvent
+end
+
+function hotkey:unwrapEvent (event)
+  if not self[event] then
+    self:UnregisterEvent(event)
+  end
+  hotkeyEvents[event] = nil
+  self[event] = nil
+end
+
+
+hotkey.RegisterFrame = function(frame)
+  --wrap(function()
+  print('ActionBarButtonEventsFrame_RegisterFrame(', frame:GetName(), frame.action, frame:IsVisible(), frame:IsShown())
+  --end)
+  blizHotKey[frame] = frame.HotKey
+  loadedFrames[frame] = true
+end
+
+function hotkey:OnEvent (event, ...)
+  print('|cFFFF8888'..self:GetName()..':OnEvent()|r', event, ...)
+  if hotkeyEvents[event] then
+    for i, func  in ipairs(hotkeyEvents[event]) do
+
+      if self[func] then
+        print('->|cFF88FF00', func)
+        self[func](self, event, ...)
+      end
+    end
+  end
+  return true
+end
+
+function hotkey:Setup ()
+  print('variables')
+  bindings = kb.GetBindings()
+  self:player()
+  for event, triggers in pairs(hotkeyEvents) do
+    print('setup', event, triggers)
+    self:RegisterEvent(event)
+  end
+
+end
+
+function hotkey:OnLoad()
+  hooksecurefunc("ActionBarButtonEventsFrame_RegisterFrame", hotkey.RegisterFrame)
+
+end
+
+function hotkey:Update()
+  print('--|cFF00FF00ui|r')
+  self:player()
+  hotkey:pet()
+  hotkey:binding()
+end
+
+
+function hotkey:world()
+  print('--|cFF00FF00world|r')
+  -- needs to be delayed so it isn't fired 50 times at login
+  if not hotkeyEvents["UPDATE_BINDINGS"] then
+    hotkeyEvents["UPDATE_BINDINGS"] = {"binding"}
+    self.UPDATE_BINDINGS = self.UpdateFromEvent
+    self:RegisterEvent("UPDATE_BINDINGS")
+  end
+
+  self:player()
+  self:pet()
+end
+
+-- requires all these arguments since non-actionbar buttons don't have all of said methods
+local kprint = (DEVIAN_WORKSPACE and function(...) _G.print('HotKeyUpdate', ...) end) or function() end
+function hotkey:UpdateHotKey(frame, actionType, actionID, hasAction)
+  bindings = kb.GetBindings()
+
+  if hasAction then
+    local indexKey = kb.FormatActionID(actionType, actionID)
+
+
+
+    local actionName
+    if actionType == 'spell' then
+      actionName = GetSpellInfo(actionID)
+    elseif actionType == 'macro' then
+      actionName = GetMacroInfo(actionID)
+    elseif actionType == 'summonmount' then
+      actionName = C_MountJournal.GetMountInfoByID(actionID)
+    elseif actionType == 'item' then
+      actionName = GetItemInfo(actionID)
+    end
+    kprint('  actionKey:', indexKey)
+
+    local binds = bindings[indexKey]
+    if binds and (not frame.HotKey:IsVisible()) then
+      kprint(frame:GetName(), '|cFF88FF00'..indexKey..'|r',  hasAction, actionName)
+      local bindingsText = kb.BindingString(unpack(binds))
+
+      if not hotkeyText[frame] then
+        kprint('-new hotkey element')
+        hotkeyText[frame] = frame:CreateFontString(frame:GetName()..'SkeletonKey', 'OVERLAY')
+        hotkeyText[frame]:SetFont(frame.HotKey:GetFont())
+        hotkeyText[frame]:SetTextColor(frame.HotKey:GetTextColor())
+        hotkeyText[frame]:SetPoint('TOPRIGHT', frame.HotKey, 'TOPRIGHT')
+
+        hooksecurefunc(frame.HotKey, 'SetVertexColor', function(self, r,g,b,a)
+          hotkeyText[frame]:SetTextColor(r,g,b,a)
+        end)
+      end
+
+      if actionType == 'macro' then
+        local name, rank, spellID = GetMacroSpell(actionID)
+        if spellID and bindings['spell_'..spellID] then
+          bindingsText = kb.BindingString(unpack(bindings['spell_'..spellID]))
+        end
+
+      end
+
+
+      hotkeyText[frame]:SetText(bindingsText)
+      hotkeyText[frame]:Show()
+      kprint('   |cFF00FFFF', frame:GetName(), '|cFFFFFF00'..tostring(bindingsText)..'|r')
+
+      return
+    end
+  end
+
+  if hotkeyText[frame] then
+    local oldText = hotkeyText[frame]:GetText()
+    if oldText then
+      hotkeyText[frame]:SetText(nil)
+      print('|cFFFF4400' .. frame:GetName() .. '|r', 'removed text', oldText)
+    end
+  end
+end
+
+local foundSlots = {}
+function hotkey:actionbar()
+  print('--|cFF00FF00actionbar|r')
+  wipe(actionFrames)
+  wipe(foundSlots)
+
+
+  bindings = kb.GetBindings()
+  for k,v in pairs(bindings) do
+    print(k, #v)
+  end
+
+
+  if ActionBarButtonEventsFrame.frames then
+    for index, frame in ipairs(ActionBarButtonEventsFrame.frames) do
+      local slot = frame.action
+      local actionType, actionID = GetActionInfo(slot)
+      local hasAction = HasAction(slot)
+
+      actionSlots[slot] = frame
+      if hasAction then
+        local indexKey = kb.FormatActionID(actionType, actionID)
+
+        actionFrames[indexKey] = actionFrames[indexKey] or {}
+        if not tContains(actionFrames[indexKey], frame) then
+          tinsert(actionFrames[indexKey], frame)
+          actionIndex[slot] = indexKey
+        end
+        local actionName = ''
+        if actionType == 'macro' then
+          actionName = GetMacroInfo(actionID)
+          elseif actionType == 'spell' then
+          actionName = GetSpellInfo(actionID)
+        end
+
+        if bindings[indexKey] then
+          print(indexKey, actionName)
+        for k,v in pairs(bindings[indexKey]) do
+          print(k,v)
+        end
+        end
+
+
+       --tinsert(foundSlots, '|cFFFFFF00#'..index .. '|r ' .. tostring(indexKey).. '('..(bindings[indexKey] and table.concat(bindings[indexKey],' ') or '-')..')')
+      end
+
+
+      self:UpdateHotKey(frame, actionType, actionID, hasAction)
+    end
+  end
+
+  --print('found slots: ', table.concat(foundSlots, ', '))
+end
+
+function hotkey:actionslot (event, slot)
+  local actionType, actionID = GetActionInfo(slot)
+  print(actionSlots[slot], event, actionType, actionID, HasAction(slot))
+  local frame = actionSlots[slot]
+  if frame then
+    self:UpdateHotKey(frame, actionType, actionID, HasAction(slot))
+  end
+
+end
+
+function hotkey:player()
+  print('player')
+  self:actionbar()
+end
+
+
+
+function hotkey:pet(event, arg1)
+  print('--|cFF00FF00pet|r')
+  if event == 'UNIT_PET' and arg1 == 'player' then
+    if PetHasActionBar() and UnitIsVisible("pet") then
+      self:wrapEvent('PET_UI_CLOSE', 'pet')
+      self:wrapEvent('PET_BAR_UPDATE', 'pet')
+    else
+      self:unwrapEvent('PET_UI_CLOSE')
+      self:unwrapEvent('PET_BAR_UPDATE')
+      return
+    end
+  end
+
+  for i=1, NUM_PET_ACTION_SLOTS, 1 do
+    local button = _G['PetActionButton'.. i]
+    --print(button:GetName())
+    for k, v in pairs(button) do
+      --print(' ', k, type(v))
+    end
+  end
+end
+
+
+--- used to pick up changes from user interaction
+local changeIndex = 1
+function hotkey:binding ()
+  local changeNum = #kb.ChangedBindings
+  cprint('--|cFF00FF00binding|r')
+  if changeNum >= changeIndex then
+
+
+    for i = changeIndex, changeNum do
+      cprint(changeIndex,'of', changeNum)
+      local actionType, actionID, name = unpack(kb.ChangedBindings[i])
+      local actionKey = kb.FormatActionID(actionType, actionID)
+      local frames = actionFrames[actionKey]
+      if frames then
+        for i, frame in ipairs(frames) do
+          cprint('|cFFFF0088'..actionKey..'|r', frame)
+          if frame then
+            self:UpdateHotKey(frame , actionType, actionID, HasAction(frame.action))
+          end
+        end
+      else
+        cprint('no frames picked up, rebuild')
+        self:actionbar()
+      end
+
+      changeIndex = i + 1
+    end
+
+  end
+end
\ No newline at end of file