diff modules/Action.lua @ 234:0e20f65375d5

Reworked button creation to not use goofy event driven semantics.
author Flick
date Tue, 22 Mar 2011 17:05:51 -0700
parents c4b134512c50
children 704f4a05a1d7
line wrap: on
line diff
--- a/modules/Action.lua	Tue Mar 22 11:48:09 2011 -0700
+++ b/modules/Action.lua	Tue Mar 22 17:05:51 2011 -0700
@@ -2,7 +2,6 @@
 local ReAction = addonTable.ReAction
 local L = ReAction.L
 local _G = _G
-local CreateFrame = CreateFrame
 local format = string.format
 local wipe = wipe
 
@@ -22,10 +21,6 @@
   self.handles = setmetatable({ }, weak)
 
   ReAction:RegisterBarOptionGenerator(self, "GetBarOptions")
-
-  ReAction.RegisterCallback(self, "OnCreateBar")
-  ReAction.RegisterCallback(self, "OnRefreshBar")
-  ReAction.RegisterCallback(self, "OnDestroyBar")
 end
 
 function module:OnEnable()
@@ -36,34 +31,12 @@
   ReAction:GetModule("State"):UnregisterStateProperty("page")
 end
 
-function module:OnCreateBar(event, bar, name)
-  if bar.config.type == moduleID then
-    if self.handles[bar] == nil then
-      self.handles[bar] = Handle:New(bar)
-    end
-  end
-end
-
-function module:OnRefreshBar(event, bar, name)
-  if self.handles[bar] then
-    self.handles[bar]:Refresh()
-  end
-end
-
-function module:OnDestroyBar(event, bar, name)
-  if self.handles[bar] then
-    self.handles[bar]:Destroy()
-    self.handles[bar] = nil
-  end
-end
 
 
 ---- Interface ----
 function module:GetBarOptions(bar)
-  local h = self.handles[bar]
-  if h then
-    return h:GetOptions()
-  end
+  self.handles[bar] = self.handles[bar] or Handle:New(bar)
+  return self.handles[bar]:GetOptions()
 end
 
 
@@ -204,61 +177,16 @@
   local meta = { __index = Handle }
 
   function Handle:New( bar )
-    local config = bar:GetConfig()
-    local self = setmetatable(
+    return setmetatable(
       {
         bar = bar,
-        config = config,
-        btns = { }
+        config = bar:GetConfig(),
       }, 
       meta)
-    
-    if self.config.buttons == nil then
-      self.config.buttons = { }
-    end
-    self:Refresh()
-    return self
   end
 
   function Handle:Refresh()
-    local r, c = self.bar:GetButtonGrid()
-    local n = r*c
-    local btnCfg = self.config.buttons
-    if n ~= #self.btns then
-      for i = 1, n do
-        if btnCfg[i] == nil then
-          btnCfg[i] = {}
-        end
-        if self.btns[i] == nil then
-          local lastButton = self:GetLastButton()
-          local hint = lastButton and lastButton.config.actionID
-          local b = Button:New(i, self.config, self.bar, hint)
-          self.btns[i] = b
-          self.bar:AddButton(i,b)
-        end
-      end
-      for i = n+1, #self.btns do
-        if self.btns[i] then
-          self.bar:RemoveButton(self.btns[i])
-          self.btns[i]:Destroy()
-          self.btns[i] = nil
-          btnCfg[i] = nil
-        end
-      end
-    end
-    for _, b in ipairs(self.btns) do
-      b:Refresh()
-    end
-    Button.SetupBarHeader(self.bar,self.config)
-    self:UpdateButtonLock()
-  end
-
-  function Handle:Destroy()
-    for _,b in pairs(self.btns) do
-      if b then
-        b:Destroy()
-      end
-    end
+    Button:SetupBar(bar)
   end
 
   function Handle:UpdateButtonLock()
@@ -266,7 +194,7 @@
   end
 
   function Handle:GetLastButton()
-    return self.btns[#self.btns]
+    return self.bar:GetButton(self.bar:GetNumButtons())
   end
 
     -- options handlers
@@ -282,7 +210,7 @@
   function Handle:SetHideEmpty(info, value)
     if value ~= self.config.hideEmpty then
       self.config.hideEmpty = value
-      for _, b in pairs(self.btns) do
+      for _, b in self.bar:IterateButtons() do
         b:ShowGrid(not value)
       end
     end
@@ -439,7 +367,7 @@
     local col = self.selectedColumn or 1
     local r, c = self.bar:GetButtonGrid()
     local n = (row-1) * c + col
-    local btn = self.btns[n]
+    local btn = self.bar:GetButton(n)
     if btn then
       return tostring(btn:GetActionID(self.selectedPage or 1))
     end
@@ -450,7 +378,7 @@
     local col = self.selectedColumn or 1
     local r, c = self.bar:GetButtonGrid()
     local n = (row-1) * c + col
-    local btn = self.btns[n]
+    local btn = self.bar:GetButton(n)
     if btn then
       btn:SetActionID(tonumber(value), self.selectedPage or 1)
     end
@@ -472,7 +400,7 @@
     local p = { }
     for i = 1, self.config.nPages or 1 do
       local b = { }
-      for _, btn in ipairs(self.btns) do
+      for _, btn in self.bar:IterateButtons() do
         table.insert(b, btn:GetActionID(i))
       end
       table.insert(p, table.concat(b,","))
@@ -501,17 +429,17 @@
   end
 
   function Handle:SetMultiID(info, value)
-    local p = ParseMultiID(#self.btns, self.config.nPages or 1, value)
+    local p = ParseMultiID(self.bar:GetNumButtons(), self.config.nPages or 1, value)
     for page, b in ipairs(p) do
       for button, id in ipairs(b) do
-        self.btns[button]:SetActionID(id, page)
+        self.bar:GetButton(button):SetActionID(id, page)
       end
     end
   end
 
   function Handle:ValidateMultiID(info, value)
     local bad = L["Invalid action ID list string"]
-    if value == nil or ParseMultiID(#self.btns, self.config.nPages or 1, value) == nil then
+    if value == nil or ParseMultiID(self.bar:GetNumButtons(), self.config.nPages or 1, value) == nil then
       return bad
     end
     return true