Quantcast

Add support for 'global' clickset, as global bindings

James Whitehead II [10-09-10 - 11:47]
Add support for 'global' clickset, as global bindings
Filename
Clique.lua
Utils.lua
diff --git a/Clique.lua b/Clique.lua
index 8aed62a..6c0dab1 100755
--- a/Clique.lua
+++ b/Clique.lua
@@ -47,6 +47,10 @@ function addon:Initialize()
     self.header = CreateFrame("Frame", addonName .. "HeaderFrame", UIParent, "SecureHandlerBaseTemplate")
     ClickCastHeader = addon.header

+    -- Create a secure action button that can be used for 'global' bindings
+    self.globutton = CreateFrame("Button", addonName .. "SABButton", UIParent, "SecureActionButtonTemplate, SecureHandlerBaseTemplate")
+    self.globutton:SetAttribute("unit", "mouseover")
+
     -- Create a table within the addon header to store the frames
     -- that are registered for click-casting
     self.header:Execute([[
@@ -80,7 +84,10 @@ function addon:Initialize()
     self.header:SetAttribute("setup_onenter", set)
     self.header:SetAttribute("setup_onleave", clr)

-    -- Clickcast registration systems
+    -- Get the override binding attributes for the global click frame
+    self.globutton.setup, self.globutton.remove = self:GetClickAttributes(true)
+    self.globutton.setbinds, self.globutton.clearbinds = self:GetBindingAttributes(true)
+
     -- Compatability with old Clique 1.x registrations
     local oldClickCastFrames = ClickCastFrames

@@ -100,6 +107,9 @@ function addon:Initialize()
     end
     self:EnableBlizzardFrames()

+    -- Update GLOBAL attributes
+    self:UpdateGlobalAttributes()
+
     -- Register for combat events to ensure we can swap between the two states
     self:RegisterEvent("PLAYER_REGEN_DISABLED", "UpdateAttributes")
     self:RegisterEvent("PLAYER_REGEN_ENABLED", "UpdateAttributes")
@@ -165,7 +175,7 @@ end

 -- This function will create an attribute that when run for a given frame
 -- will set the correct set of SAB attributes.
-function addon:GetClickAttributes()
+function addon:GetClickAttributes(global)
     local bits = {
         "local setupbutton = self:GetFrameRef('cliquesetup_button')",
         "local button = setupbutton or self",
@@ -177,7 +187,7 @@ function addon:GetClickAttributes()
     }

     for idx, entry in ipairs(self.profile.binds) do
-        if self:ShouldSetBinding(entry) then
+        if self:ShouldSetBinding(entry, global) then
             local prefix, suffix = entry.key:match("^(.-)([^%-]+)$")
             if prefix:sub(-1, -1) == "-" then
                 prefix = prefix:sub(1, -2)
@@ -223,12 +233,12 @@ local B_CLR = [[self:ClearBinding("%s");]]
 -- This function will create two attributes, the first being a "setup keybindings"
 -- script and the second being a "clear keybindings" script.

-function addon:GetBindingAttributes()
+function addon:GetBindingAttributes(global)
     local set = {}
     local clr = {}

     for idx, entry in ipairs(self.profile.binds) do
-        if self:ShouldSetBinding(entry) then
+        if self:ShouldSetBinding(entry, global) then
             if not entry.key:match("BUTTON%d+$") then
                 -- This is a key binding, so we need a binding for it
                 set[#set + 1] = B_SET:format(entry.key, "cliquebutton" .. idx)
@@ -330,6 +340,9 @@ function addon:UpdateAttributes()
         error("panic: Clique:UpdateAttributes() called during combat")
     end

+    -- Update global attributes
+    self:UpdateGlobalAttributes()
+
     -- Clear any of the previously set attributes
     self:ClearAttributes()

@@ -360,6 +373,25 @@ function addon:UpdateAttributes()
     end
 end

+function addon:ClearGlobalAttributes()
+    local globutton = self.globutton
+    globutton:Execute(globutton.remove)
+    globutton:Execute(globutton.clearbinds)
+end
+
+-- Update the global click attributes
+function addon:UpdateGlobalAttributes()
+    local globutton = self.globutton
+
+    self:ClearGlobalAttributes()
+
+    -- Get the override binding attributes for the global click frame
+    globutton.setup, globutton.remove = self:GetClickAttributes(true)
+    globutton.setbinds, globutton.clearbinds = self:GetBindingAttributes(true)
+    globutton:Execute(globutton.setup)
+    globutton:Execute(globutton.setbinds)
+end
+
 SLASH_CLIQUE1 = "/clique"
 SlashCmdList["CLIQUE"] = function(msg, editbox)
     ShowUIPanel(CliqueConfig)
diff --git a/Utils.lua b/Utils.lua
index 3323ed5..81a3fbb 100644
--- a/Utils.lua
+++ b/Utils.lua
@@ -199,9 +199,16 @@ function addon:GetBindingInfoText(binding)
 end

 -- This function examines the current state of the game
-function addon:ShouldSetBinding(binding)
+function addon:ShouldSetBinding(binding, global)
     local apply = false

+    -- Check for global bindings first
+    if binding.sets.global and global then
+        apply = true
+    elseif binding.sets.global and (not global) then
+        apply = false
+    end
+
     if binding.sets.ooc then
         if UnitAffectingCombat("player") then
             apply = false