changeset 24:9e1984088124

added *more* missing files from 1.0 dev tree...
author Flick <flickerstreak@gmail.com>
date Fri, 07 Mar 2008 22:18:23 +0000
parents dba04d85c799
children bf997ea151ca
files modules/ReAction_Action/ReAction_Action.lua modules/ReAction_Action/ReAction_Action.toc
diffstat 2 files changed, 262 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/modules/ReAction_Action/ReAction_Action.lua	Fri Mar 07 22:18:23 2008 +0000
@@ -0,0 +1,251 @@
+--[[
+  ReAction Action-button module.
+
+  The button module implements standard action button functionality by wrapping Blizzard's 
+  ActionButton frame and associated functions. It also provides some button layout
+  modification tools.
+
+--]]
+
+-- local imports
+local ReAction = ReAction
+local L = ReAction.L
+local _G = _G
+local AceOO = AceLibrary("AceOO-2.0")
+local CreateFrame = CreateFrame
+local print = ReAction.print
+
+-- module declaration
+local moduleID = "Action"
+local module = ReAction:NewModule( moduleID,
+  "AceEvent-2.0"
+)
+
+--
+-- action button class declaration
+--
+local BtnClass = AceOO.Class()
+local Button = BtnClass.prototype
+module.BtnClass = BtnClass
+
+
+
+-- module methods
+function module:OnInitialize()
+  self.db = ReAction:AcquireDBNamespace(moduleID)
+  ReAction:RegisterDefaults(moduleID,"profile", 
+    { 
+      buttons = { }
+    }
+  )
+
+  self.buttons = { }
+end
+
+function module:OnEnable()
+end
+
+function module:OnDisable()
+end
+
+function module:OnProfileEnable()
+end
+
+function module:ApplyToBar(bar)
+  self:RefreshBar(bar)
+end
+
+function module:RefreshBar(bar)
+  if self.buttons[bar] == nil then
+    self.buttons[bar] = { }
+  end
+  local btns = self.buttons[bar]
+  local profile = self.db.profile
+  local barName = bar:GetName()
+  if profile.buttons[barName] == nil then
+    profile.buttons[barName] = {}
+  end
+  local btnCfg = profile.buttons[barName]
+
+  local r, c = bar:GetButtonGrid()
+  local n = r*c
+  for i = 1, n do
+    if btnCfg[i] == nil then
+      btnCfg[i] = {}
+    end
+    if btns[i] == nil then
+      btns[i] = self.BtnClass:new(bar,i,btnCfg[i])
+    else
+      btns[i]:Refresh(bar,i)
+    end
+  end
+  for i = n+1, #btns do
+    btns[i] = btns[i]:Destroy()
+    if btnCfg[i] then
+      btnCfg[i] = nil
+    end
+  end
+end
+
+function module:RemoveFromBar(bar)
+  if self.buttons[bar] then
+    local btns = self.buttons[bar]
+    for _,b in pairs(btns) do
+      if b then
+        b:Destroy()
+      end
+    end
+    self.buttons[bar] = nil
+  end
+end
+
+function module:EraseBarConfig(barName)
+  self.db.profile.buttons[barName] = nil
+end
+
+function module:ApplyConfigMode(mode,bars)
+  for _, btns in pairs(self.buttons) do
+    if btn then
+      for _, b in pairs(btns) do
+        if b then
+          if mode then
+            if not b.actionIDLabel then
+              local label = b:GetFrame():CreateFontString(nil,"OVERLAY","GameFontNormalLarge")
+              label:SetAllPoints()
+              label:SetJustifyH("CENTER")
+              label:SetShadowColor(0,0,0,1)
+              label:SetShadowOffset(2,-2)
+              label:SetText(tostring(b:GetActionID()))
+              b.actionIDLabel = label
+            end
+            b.actionIDLabel:Show()
+          elseif b.actionIDLabel then
+            b.actionIDLabel:Hide()
+          end
+        end
+      end
+    end
+  end
+end
+
+function module:GetGlobalBarOptions(opts)  
+  if self.globalBarOpts == nil then
+    self.globalBarOpts = {
+      newActionBar = {
+        type = "execute",
+        name = L["New Action Bar"],
+        desc = L["Create a new bar of standard action buttons"],
+        func = function()
+                 ReAction:GetModule("Bar"):CreateBar()
+               end,
+        disabled = InCombatLockdown,
+      }
+    }
+  end
+  return self.globalBarOpts
+end
+
+function module:GetBarMenuOptions(bar)
+  if not bar.modMenuOpts[moduleID] then
+    bar.modMenuOpts[moduleID] = {
+    }
+  end
+  return bar.modMenuOpts[moduleID]
+end
+
+function module:GetBarConfigOptions(bar)
+  if not bar.modConfigOpts[moduleID] then
+    bar.modConfigOpts[moduleID] = {
+    }
+  end
+  return bar.modConfigOpts[moduleID]
+end
+
+
+
+-- use-count of action IDs
+local ActionIDList = setmetatable( {}, {
+  __index = function(self, idx)
+    if idx == nil then
+      for i = 1, 120 do
+        if rawget(self,i) == nil then
+          rawset(self,i,1)
+          return i
+        end
+      end
+    else
+      local c = rawget(self,idx) or 0
+      rawset(self,idx,c+1)
+      return idx
+    end
+  end,
+  __newindex = function(self,idx,value)
+    if value == nil then
+      value = rawget(self,idx)
+      if value == 1 then
+        value = nil
+      elseif value then
+        value = value - 1
+      end
+    end
+    rawset(self,idx,value)
+  end
+})
+
+
+
+-- button class methods
+function Button:init( bar, idx, config )
+  BtnClass.super.prototype.init(self)
+  self.bar, self.idx, self.config = bar, idx, config
+
+  local barFrame = bar:GetFrame()
+
+  self.name = config.name or "ReAction_"..bar:GetName().."_"..idx
+  config.actionID = ActionIDList[config.actionID] -- gets a free one if none configured
+  
+  local f = CreateFrame("CheckButton", self.name, barFrame, "ActionBarButtonTemplate")
+  -- TODO: re-implement ActionButton event handlers that don't do secure stuff
+
+  -- this will probably cause taint, using right now for display/debugging purposes
+  f:SetScript("OnAttributeChanged",
+    function()
+      ActionButton_UpdateAction()
+    end
+  )
+  f:SetAttribute("action", config.actionID)
+  barFrame:SetAttribute("addchild",f)
+  self.frame = f
+  self:Refresh(bar,idx)
+end
+
+function Button:Destroy()
+  local f = self.frame
+  f:UnregisterAllEvents()
+  f:Hide()
+  f:SetParent(UIParent)
+  f:ClearAllPoints()
+  if self.config.name then
+    _G[self.config.name] = nil
+  end
+  ActionIDList[self.config.actionID] = nil
+  self.frame = nil
+  self.config = nil
+  self.bar = nil
+end
+
+function Button:Refresh(bar,idx)
+  bar:PlaceButton(self.frame, idx, 36, 36)
+end
+
+function Button:GetFrame()
+  return self.frame
+end
+
+function Button:GetName()
+  return self.name
+end
+
+function Button:GetActionID()
+  return self.config.actionID
+end
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/modules/ReAction_Action/ReAction_Action.toc	Fri Mar 07 22:18:23 2008 +0000
@@ -0,0 +1,11 @@
+## Interface: 20300
+## Title: ReAction: Action
+## Notes: Action button module for ReAction
+## DefaultState: enabled
+## LoadOnDemand: 1
+## Author: Flick
+## Version: 1.0
+## X-Category: Action Bars
+## Dependencies: ReAction
+
+ReAction_Action.lua