From 5f166ed4f8904334c0422ff716cd4e5ae8661dca Mon Sep 17 00:00:00 2001 From: James Whitehead II Date: Thu, 28 Oct 2010 10:27:35 +0100 Subject: [PATCH] Fix some issues with registering group-header-based frames This should fix the reported issues with 'AnyUp' and 'AnyDown' registration not happening properly on those frames. --- AddonCore.lua | 4 ++-- Clique.lua | 73 ++++++++++++++++++++++++++++++++------------------------- Clique.toc | 2 +- 3 files changed, 44 insertions(+), 35 deletions(-) diff --git a/AddonCore.lua b/AddonCore.lua index a17ee28..41ce831 100644 --- a/AddonCore.lua +++ b/AddonCore.lua @@ -49,7 +49,7 @@ end -- Event registration and dispatch addon.eventFrame = CreateFrame("Frame", addonName .. "EventFrame", UIParent) local eventMap = {} - + function addon:RegisterEvent(event, handler) assert(eventMap[event] == nil, "Attempt to re-register event: " .. tostring(event)) eventMap[event] = handler and handler or event @@ -79,7 +79,7 @@ addon:RegisterEvent("ADDON_LOADED", function(event, ...) if type(addon["Initialize"]) == "function" then addon["Initialize"](addon) end - + -- If this addon was loaded-on-demand, trigger 'Enable' as well if IsLoggedIn() and type(addon["Enable"]) == "function" then addon["Enable"](addon) diff --git a/Clique.lua b/Clique.lua index 51fa2f6..9e172fc 100755 --- a/Clique.lua +++ b/Clique.lua @@ -130,9 +130,19 @@ function addon:Initialize() -- 'export_unregister' attributes. self.header:SetScript("OnAttributeChanged", function(frame, name, value) if name == "export_register" and type(value) ~= nil then - self.hccframes[value] = true + -- Convert the userdata object to the global object so we have access + -- to all of the correct methods, such as 'RegisterForClicks'' + local name = value.GetName and value:GetName() + if name then + local button = _G[name] + self.hccframes[name] = button + self:UpdateRegisteredClicks(button) + end elseif name == "export_unregister" and type(value) ~= nil then - self.hccframes[value] = nil + local name = value.GetName and value:GetName() + if name then + self.hccframes[name] = nil + end end end) @@ -179,6 +189,7 @@ end -- These tables are a queue for frame registration/unregistration addon.regqueue = {} addon.unregqueue = {} +addon.regclickqueue = {} -- These function may be called during combat. When that is the case, the -- request must be queued until combat ends, and then we can attempt to @@ -624,19 +635,6 @@ function addon:UpdateCombatWatch() end end -function addon:UpdateRegisteredClicks() - for button, enabled in pairs(self.ccframes) do - local name = button.GetName and button:GetName() - if not self.settings.blacklist[name] and enabled then - if self.settings.downclick then - button:RegisterForClicks("AnyDown") - else - button:RegisterForClicks("AnyUp") - end - end - end -end - function addon:UpdateBlacklist() local bits = { "blacklist = table.wipe(blacklist)", @@ -662,13 +660,24 @@ function addon:LeavingCombat() -- Sanity check if not InCombatLockdown() then + + -- Process any frames in the registration queue for idx, button in ipairs(self.regqueue) do self:RegisterFrame(button) end + if next(self.regqueue) then table.wipe(self.regqueue) end + + -- Process any frames in the unregistration queue + for idx, button in ipairs(self.unregqueue) do + self:UnregisterFrame(button) + end + if next(self.regqueue) then table.wipe(self.regqueue) end - if #self.regqueue > 0 then - self.regqueue = {} + -- Process any frames in the clickregister queue + for idx, button in ipairs(self.regclickqueue) do + self:UpdateRegisteredClicks(button) end + if next(self.regclickqueue) then table.wipe(self.regclickqueue) end end self:UpdateAttributes() @@ -708,30 +717,30 @@ function addon:IsFrameBlacklisted(frame) return self.settings.blacklist[name] end -function addon:UpdateRegisteredClicks(frame) +function addon:UpdateRegisteredClicks(button) + if InCombatLockdown() then + table.insert(self.regclickqueue, button) + return + end + local direction = self.settings.downclick and "AnyDown" or "AnyUp" -- Short version that only updates clicks for one frame - if frame and not self:IsFrameBlacklisted(frame) then - frame:RegisterForClicks(direction) + if button and not self:IsFrameBlacklisted(button) then + button:RegisterForClicks(direction) return end - for frame in pairs(self.ccframes) do - if not self:IsFrameBlacklisted(frame) then - frame:RegisterForClicks(direction) + for button in pairs(self.ccframes) do + if not self:IsFrameBlacklisted(button) then + button:RegisterForClicks(direction) end end - for frame in pairs(self.hccframes) do - if not self:IsFrameBlacklisted(frame) then - if type(frame) == "string" then - frame = _G[frame] - end - if frame then - frame:RegisterForClicks(direction) - end - end + for name, button in pairs(self.hccframes) do + if not self:IsFrameBlacklisted(button) then + button:RegisterForClicks(direction) + end end end diff --git a/Clique.toc b/Clique.toc index e545c6e..b2dd045 100755 --- a/Clique.toc +++ b/Clique.toc @@ -1,4 +1,4 @@ -## Interface: 40000 +## Interface: 40000 ## Title: Clique ## Author: Cladhaire ## Version: @project-version@ -- 1.7.9.5