diff 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
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/SkeletonKey/HotKey.lua	Thu Jul 28 16:45:56 2016 -0400
@@ -0,0 +1,204 @@
+-- KrakTool
+-- HotKey.lua
+-- Created: 7/22/2016 10:28 PM
+-- %file-revision%
+-- Module for fixing actionbar hotkey text
+
+local kb, print = LibStub("LibKraken").register(KeyBinder, 'HotKey')
+local hotkey = {}
+local hotkeyText = {}
+local blizHotKey = {}
+local bindings
+
+-- 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 actionFrames = {}
+
+kb.wrap(hotkey)
+
+--- 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"},
+  ["PLAYER_ENTERING_WORLD"] = {"world","all"},
+  ["PET_UI_UPDATE"] = {"pet"},
+}
+
+do
+  local tickerQueue = {}
+  local ticker
+  local instant = false
+  hotkey.tick = function()
+
+    if #tickerQueue == 0 then
+      instant = true
+      return
+    else
+      instant = false
+    end
+    local func = tremove(tickerQueue, 1)
+    if func then
+      --print('#', #tickerQueue)
+      func()
+    end
+  end
+  hotkey.wrap = function(f)
+    if not ticker then
+      --print('create ticker')
+      ticker = C_Timer.NewTicker(0, hotkey.tick)
+    end
+    if instant then
+      f()
+    else
+      tinsert(tickerQueue, f)
+    end
+  end
+end
+
+hotkey.wrapEvent = function(event, ...)
+  kb:RegisterEvent(event)
+  hotkeyEvents[event] = {...}
+  hotkey[event] = hotkey.UpdateFromEvent
+end
+
+hotkey.unwrapEvent = function(event)
+  if not kb[event] then
+    kb:UnregisterEvent(event)
+  end
+  hotkeyEvents[event] = nil
+  hotkey[event] = nil
+end
+
+hotkey.ActionButton_Update = function(frame)
+  hotkey.wrap(function()
+    local actionType, actionID = GetActionInfo(frame.action)
+    hotkey.UpdateSkeletonKeyText(frame, actionType, actionID, HasAction(frame.action))
+  end)
+end
+
+
+hotkey.RegisterFrame = function(frame)
+  --hotkey.wrap(function()
+  --print('ActionBarButtonEventsFrame_RegisterFrame(', frame:GetName(), frame.action, frame:IsVisible(), frame:IsShown())
+  --end)
+  blizHotKey[frame] = frame.HotKey
+  loadedFrames[frame] = true
+end
+
+hotkey.UpdateFromEvent = function(self, event, ...)
+  if hotkeyEvents[event] then
+    --print('call batch', event, ...)
+    for i, func  in ipairs(hotkeyEvents[event]) do
+
+      if hotkey[func] then
+        --print(' ', func)
+        hotkey[func](self, event, ...)
+      end
+    end
+  end
+  return true
+end
+
+hotkey.variables = function()
+  bindings = kb.GetBindings()
+  for event, manifest in pairs(hotkeyEvents) do
+    kb:RegisterEvent(event)
+    hotkey[event] = hotkey.UpdateFromEvent
+  end
+  hotkey.wrapEvent('UNIT_PET', 'pet')
+end
+
+hotkey.init = function()
+  hooksecurefunc("ActionBarButtonEventsFrame_RegisterFrame", hotkey.RegisterFrame)
+end
+
+hotkey.world = function()
+  hotkeyEvents["UPDATE_BINDINGS"] = {"actionbar"}
+  hotkey.UPDATE_BINDINGS = hotkey.UpdateFromEvent
+  kb:RegisterEvent("UPDATE_BINDINGS")
+
+  hotkey.player()
+  hotkey.pet()
+
+  -- Set this after, since we already full-scanned buttons
+  hooksecurefunc("ActionButton_Update", hotkey.ActionButton_Update)
+end
+
+-- requires all these arguments since non-actionbar buttons don't have all of said methods
+hotkey.UpdateSkeletonKeyText = function(frame, actionType, actionID, hasAction)
+  if bindings[actionType] then
+    if actionType == 'macro' then
+      actionID = GetMacroInfo(actionID)
+    end
+    --print('|cFFFFFF00'..frame:GetName(), actionType, actionID, hasAction)
+    local binds = bindings[actionType][actionID]
+    if binds  then
+      if hasAction and not frame.HotKey:IsVisible() then
+        if not hotkeyText[frame] then
+          hotkeyText[frame] = frame:CreateFontString('KeyBinderHotKeyText', 'OVERLAY')
+          hotkeyText[frame]:SetFont(frame.HotKey:GetFont())
+          hotkeyText[frame]:SetTextColor(frame.HotKey:GetTextColor())
+          hotkeyText[frame]:SetPoint('TOPRIGHT', frame.HotKey, 'TOPRIGHT')
+        end
+
+        hotkeyText[frame]:SetText(kb.BindingString(unpack(binds)))
+        print('|cFF00FFFFUpdate text for', frame:GetName())
+        print(unpack(binds))
+        return
+      end
+    end
+  end
+
+  if hotkeyText[frame] then
+    hotkeyText[frame]:SetText(nil)
+    --print('|cFFFF4400cleared text from', frame:GetName())
+  end
+end
+
+hotkey.actionbar = function()
+  if ActionBarButtonEventsFrame.frames then
+    for index, frame in ipairs(ActionBarButtonEventsFrame.frames) do
+      local actionType, actionID = GetActionInfo(frame.action)
+      hotkey.UpdateSkeletonKeyText(frame, actionType, actionID, HasAction(frame.action))
+    end
+  end
+end
+
+hotkey.actionslot = function(self, event, slot)
+  --print(event, slot)
+  --print(GetActionButtonForID(slot))
+  hotkey.UpdateSkeletonKeyText(GetActionButtonForID(slot))
+end
+
+hotkey.player = function()
+  hotkey.actionbar()
+end
+
+
+hotkey.pet = function(self, event, arg1)
+  if event == 'UNIT_PET' and arg1 == 'player' then
+    if PetHasActionBar() and UnitIsVisible("pet") then
+      hotkey.wrapEvent('PET_UI_CLOSE', 'pet')
+      hotkey.wrapEvent('PET_BAR_UPDATE', 'pet')
+    else
+      hotkey.unwrapEvent('PET_UI_CLOSE')
+      hotkey.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
+
+