X-Git-Url: https://www.aleksib.fi/git/wowui.git/blobdiff_plain/578ca7c8f329a11e54a52b035f7ce0d8161dfb90..96ad366e5121bcaaa6621ffac6d085fdbb34c34a:/OmaAB/ActionBars.lua diff --git a/OmaAB/ActionBars.lua b/OmaAB/ActionBars.lua index 50a88b6..012c5f9 100644 --- a/OmaAB/ActionBars.lua +++ b/OmaAB/ActionBars.lua @@ -16,7 +16,8 @@ local CreateFrame = CreateFrame; local RegisterStateDriver = RegisterStateDriver; local CooldownFrame_Set, CooldownFrame_Clear = CooldownFrame_Set, CooldownFrame_Clear; local CTimerAfter = C_Timer.After; -local GameTooltip = nil; +local GameTooltip = GameTooltip; +local GameTooltip_SetDefaultAnchor = GameTooltip_SetDefaultAnchor; local COOLDOWN_TYPE_LOSS_OF_CONTROL = COOLDOWN_TYPE_LOSS_OF_CONTROL; local COOLDOWN_TYPE_NORMAL = COOLDOWN_TYPE_NORMAL; local CDTexture = "Interface\\Cooldown\\edge"; @@ -120,6 +121,7 @@ local chars = { ["Stormreaver"] = { ["Vildan"] = {1, 2, 3, 4,}, ["Gedren"] = {1, 2, 3, 4,}, + ["Gazden"] = {1, 2, 3, 4,}, }, }; @@ -130,6 +132,15 @@ local ActionBars = CreateFrame("Frame", "OmaActionBars", UIParent); local inheritedFrames = "SecureActionButtonTemplate,SecureHandlerDragTemplate,SecureHandlerStateTemplate"; +local function showTooltip(secure) + GameTooltip_SetDefaultAnchor(GameTooltip, secure); + GameTooltip:SetAction(secure:GetAttribute("action")); +end + +local function hideTooltip() + GameTooltip:Hide(); +end + local numChargeCDs = 0; local function createChargeCD(parent) numChargeCDs = numChargeCDs + 1; @@ -232,22 +243,14 @@ local function updateState(button, slot) button:SetChecked(IsCurrentAction(slot) or IsAutoRepeatAction(slot)); end -local function updateGlow(button, slot, spell, hide) +local function updateGlow(button, slot) local stype, id, _ = GetActionInfo(slot); - if stype == "spell" and (spell and id == spell or IsSpellOverlayed(id)) then - if hide then - button.glow:Hide(); - else - button.glow:Show(); - end + if stype == "spell" and IsSpellOverlayed(id) then + button.glow:Show(); elseif stype == "macro" then local _, _, macroid = GetMacroSpell(id); - if macroid and (spell and macroid == spell or IsSpellOverlayed(macroid)) then - if hide then - button.glow:Hide(); - else - button.glow:Show(); - end + if macroid and IsSpellOverlayed(macroid) then + button.glow:Show(); else button.glow:Hide(); end @@ -256,6 +259,32 @@ local function updateGlow(button, slot, spell, hide) end end +local function startGlow(button, slot, spell) + local stype, id, _ = GetActionInfo(slot); + if stype == "spell" and id == spell then + button.glow:Show(); + elseif stype == "macro" then + local _, _, macroid = GetMacroSpell(id); + if macroid and macroid == spell then + button.glow:Show(); + end + end + -- TODO FlyoutHasSpell glow +end + +local function stopGlow(button, slot, spell) + local stype, id, _ = GetActionInfo(slot); + if stype == "spell" and id == spell then + button.glow:Hide(); + elseif stype == "macro" then + local _, _, macroid = GetMacroSpell(id); + if macroid and macroid == spell then + button.glow:Hide(); + end + end + -- TODO FlyoutHasSpell glow +end + local function updateButton(button, slot) if HasAction(slot) then activeButtons[slot] = button; @@ -434,6 +463,10 @@ local function createActionBar(parent, config) end if config.nomouse then secure:EnableMouse(false); + else + -- only show tooltips for bars with mouse interaction + secure:SetScript("OnEnter", showTooltip); + secure:SetScript("OnLeave", hideTooltip); end secure:SetWidth(config.size or 32); secure:SetHeight(config.size or 32); @@ -458,8 +491,8 @@ local function createActionBar(parent, config) secure.autocastable:Hide(); secure.glow = secure:CreateTexture(nil, "OVERLAY", nil, 1); secure.glow:SetPoint("CENTER"); - secure.glow:SetWidth(config.size and config.size+20 or 52); - secure.glow:SetHeight(config.size and config.size+20 or 52); + secure.glow:SetWidth(config.size and config.size+26 or 53); + secure.glow:SetHeight(config.size and config.size+26 or 53); secure.glow:SetTexture("Interface\\SpellActivationOverlay\\IconAlert"); secure.glow:SetTexCoord(0.00781250, 0.50781250, 0.27734375, 0.52634375); secure.glow:Hide(); @@ -517,23 +550,33 @@ local function setupBindings() end local mounted = false; -local throttleCD = false; +-- throttleCD 3-state, nil -> false -> true -> nil +-- this way there's not double update each time the first +-- update event comes, instead the extra throttled update comes +-- if there are >2 ACTIONBAR_UPDATE_COOLDOWN events in one frame +local throttleCD = nil; local function throttleCDDone() - throttleCD = false -- update CD once more to confirm newest CD change is taken in even with some throttling for _, button in pairs(activeButtons) do updateCooldown(button, button.slot); end end +local function throttleCDReset() + throttleCD = nil; +end local events = { ["ACTIONBAR_UPDATE_COOLDOWN"] = function() if not throttleCD then -- only update at most once/frame - throttleCD = true; - for _, button in pairs(activeButtons) do - updateCooldown(button, button.slot); + throttleCD = throttleCD == false and true or false; + if throttleCD then + CTimerAfter(0.01, throttleCDDone); -- wait one frame + else + for _, button in pairs(activeButtons) do + updateCooldown(button, button.slot); + end + CTimerAfter(0.01, throttleCDReset); -- wait one frame end - CTimerAfter(0.01, throttleCDDone); -- wait one frame end end, ["SPELL_UPDATE_CHARGES"] = function() @@ -594,17 +637,13 @@ local events = { ["SPELL_ACTIVATION_OVERLAY_GLOW_SHOW"] = function(spell) -- TODO create mapping from spellIDs to buttons for _, button in pairs(activeButtons) do - updateGlow(button, button.slot, spell); - -- CD update might be throttled, force it - updateCooldown(button, button.slot); + startGlow(button, button.slot, spell); end end, ["SPELL_ACTIVATION_OVERLAY_GLOW_HIDE"] = function(spell) -- TODO create mapping from spellIDs to buttons for _, button in pairs(activeButtons) do - updateGlow(button, button.slot, spell, true); - -- CD update might be throttled, force it - updateCooldown(button, button.slot); + stopGlow(button, button.slot, spell); end end, ["UPDATE_BINDINGS"] = function() @@ -629,7 +668,7 @@ local events = { end end, ["PLAYER_LOGIN"] = function() - GameTooltip = _G["GameTooltip"]; -- TODO use PLAYER_ENTERING_WORLD with MoveAnything + GameTooltip = _G["GameTooltip"]; initialize(); end, ["ADDON_LOADED"] = function(addon) @@ -656,8 +695,6 @@ events["UNIT_ENTERED_VEHICLE"] = function(unit) if unit == "player" then events["ACTIONBAR_UPDATE_STATE"]() end end events["UNIT_EXITED_VEHICLE"] = events["UNIT_ENTERED_VEHICLE"]; --- TODO overlay glow ? don't exactly know what it does, proc highlight? --- tooltips ActionBars:RegisterEvent("ADDON_LOADED"); ActionBars:RegisterEvent("PLAYER_LOGIN");