view modules/ReAction_Action/ReAction_Action.lua @ 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
children 21bcaf8215ff
line wrap: on
line source
--[[
  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