annotate modules/PetAction.lua @ 218:e63aefb8a555

Demodularization of buttons - register class instead of config
author Flick <flickerstreak@gmail.com>
date Fri, 19 Nov 2010 23:06:24 -0800
parents df68b5a40490
children d08a74e86c96
rev   line source
flickerstreak@28 1 --[[
flickerstreak@53 2 ReAction Pet Action button module
flickerstreak@53 3
flickerstreak@53 4 The button module implements standard action button functionality by wrapping Blizzard's
flickerstreak@77 5 PetActionButton frame and associated functions.
flickerstreak@28 6
flickerstreak@28 7 --]]
flickerstreak@28 8
flickerstreak@28 9 -- local imports
flickerstreak@175 10 local addonName, addonTable = ...
flickerstreak@175 11 local ReAction = addonTable.ReAction
flickerstreak@28 12 local L = ReAction.L
flickerstreak@28 13 local _G = _G
flickerstreak@53 14 local CreateFrame = CreateFrame
flickerstreak@95 15 local format = string.format
flickerstreak@28 16
flickerstreak@28 17 -- module declaration
flickerstreak@28 18 local moduleID = "PetAction"
flickerstreak@28 19 local module = ReAction:NewModule( moduleID )
flickerstreak@28 20
flickerstreak@130 21 -- Button class
flickerstreak@130 22 local Button = ReAction.Button.PetAction
flickerstreak@77 23
flickerstreak@102 24 -- private
flickerstreak@102 25 local function UpdateButtonLock(bar)
flickerstreak@102 26 local f = bar:GetFrame()
flickerstreak@102 27 f:SetAttribute("lockbuttons",bar.config.lockButtons)
flickerstreak@102 28 f:SetAttribute("lockbuttonscombat",bar.config.lockButtonsCombat)
flickerstreak@102 29 f:Execute(
flickerstreak@102 30 [[
flickerstreak@102 31 lockButtons = self:GetAttribute("lockbuttons")
flickerstreak@102 32 lockButtonsCombat = self:GetAttribute("lockbuttonscombat")
flickerstreak@102 33 ]])
flickerstreak@102 34 end
flickerstreak@102 35
flickerstreak@28 36 -- module methods
flickerstreak@28 37 function module:OnInitialize()
flickerstreak@53 38 self.db = ReAction.db:RegisterNamespace( moduleID,
flickerstreak@28 39 {
flickerstreak@28 40 profile = {
flickerstreak@28 41 buttons = { }
flickerstreak@28 42 }
flickerstreak@28 43 }
flickerstreak@28 44 )
flickerstreak@53 45 self.buttons = { }
flickerstreak@63 46
flickerstreak@63 47 ReAction:RegisterBarOptionGenerator(self, "GetBarOptions")
flickerstreak@63 48
flickerstreak@63 49 ReAction.RegisterCallback(self, "OnCreateBar")
flickerstreak@63 50 ReAction.RegisterCallback(self, "OnDestroyBar")
flickerstreak@63 51 ReAction.RegisterCallback(self, "OnRefreshBar")
flickerstreak@63 52 ReAction.RegisterCallback(self, "OnEraseBar")
flickerstreak@63 53 ReAction.RegisterCallback(self, "OnRenameBar")
flickerstreak@28 54 end
flickerstreak@28 55
flickerstreak@28 56 function module:OnEnable()
flickerstreak@218 57 ReAction:RegisterBarType(Button)
flickerstreak@28 58 end
flickerstreak@28 59
flickerstreak@28 60 function module:OnDisable()
flickerstreak@218 61 ReAction:UnregisterBarType(Button)
flickerstreak@28 62 end
flickerstreak@28 63
flickerstreak@63 64 function module:OnCreateBar(event, bar, name)
flickerstreak@53 65 if bar.config.type == moduleID then
flickerstreak@53 66 -- auto show/hide when pet exists
flickerstreak@148 67 bar:RegisterUnitWatch("pet",true)
flickerstreak@63 68 self:OnRefreshBar(event, bar, name)
flickerstreak@28 69 end
flickerstreak@28 70 end
flickerstreak@28 71
flickerstreak@63 72 function module:OnRefreshBar(event, bar, name)
flickerstreak@53 73 if bar.config.type == moduleID then
flickerstreak@53 74 if self.buttons[bar] == nil then
flickerstreak@53 75 self.buttons[bar] = { }
flickerstreak@53 76 end
flickerstreak@53 77 local btns = self.buttons[bar]
flickerstreak@53 78 local profile = self.db.profile
flickerstreak@63 79 if profile.buttons[name] == nil then
flickerstreak@63 80 profile.buttons[name] = {}
flickerstreak@53 81 end
flickerstreak@63 82 local btnCfg = profile.buttons[name]
flickerstreak@53 83
flickerstreak@53 84 local r, c = bar:GetButtonGrid()
flickerstreak@53 85 local n = r*c
flickerstreak@53 86 for i = 1, n do
flickerstreak@53 87 if btnCfg[i] == nil then
flickerstreak@53 88 btnCfg[i] = {}
flickerstreak@53 89 end
flickerstreak@53 90 if btns[i] == nil then
flickerstreak@130 91 local success, r = pcall(Button.New,Button,i,btnCfg[i],bar,i>1 and btnCfg[i-1].actionID)
flickerstreak@94 92 if success and r then
flickerstreak@94 93 btns[i] = r
flickerstreak@94 94 bar:AddButton(i,r)
flickerstreak@94 95 else
flickerstreak@94 96 n = i - 1
flickerstreak@94 97 bar:ClipNButtons(n)
flickerstreak@94 98 break
flickerstreak@94 99 end
flickerstreak@53 100 end
flickerstreak@77 101 btns[i]:Refresh()
flickerstreak@53 102 end
flickerstreak@53 103 for i = n+1, #btns do
flickerstreak@53 104 if btns[i] then
flickerstreak@77 105 bar:RemoveButton(btns[i])
flickerstreak@53 106 btns[i] = btns[i]:Destroy()
flickerstreak@53 107 if btnCfg[i] then
flickerstreak@53 108 btnCfg[i] = nil
flickerstreak@53 109 end
flickerstreak@53 110 end
flickerstreak@53 111 end
flickerstreak@102 112 UpdateButtonLock(bar)
flickerstreak@53 113 end
flickerstreak@53 114 end
flickerstreak@53 115
flickerstreak@63 116 function module:OnDestroyBar(event, bar, name)
flickerstreak@53 117 if self.buttons[bar] then
flickerstreak@53 118 local btns = self.buttons[bar]
flickerstreak@53 119 for _,b in pairs(btns) do
flickerstreak@53 120 if b then
flickerstreak@53 121 b:Destroy()
flickerstreak@53 122 end
flickerstreak@53 123 end
flickerstreak@53 124 self.buttons[bar] = nil
flickerstreak@53 125 end
flickerstreak@53 126 end
flickerstreak@53 127
flickerstreak@63 128 function module:OnEraseBar(event, bar, name)
flickerstreak@63 129 self.db.profile.buttons[name] = nil
flickerstreak@53 130 end
flickerstreak@53 131
flickerstreak@63 132 function module:OnRenameBar(event, bar, oldname, newname)
flickerstreak@53 133 local b = self.db.profile.buttons
flickerstreak@53 134 b[newname], b[oldname] = b[oldname], nil
flickerstreak@53 135 end
flickerstreak@53 136
flickerstreak@53 137
flickerstreak@60 138 ---- Options ----
flickerstreak@102 139 local Handler = { }
flickerstreak@102 140 local meta = { __index = Handler }
flickerstreak@102 141
flickerstreak@102 142 function Handler:New(bar)
flickerstreak@102 143 return setmetatable(
flickerstreak@102 144 {
flickerstreak@102 145 bar = bar,
flickerstreak@102 146 config = bar.config
flickerstreak@102 147 }, meta)
flickerstreak@102 148 end
flickerstreak@102 149
flickerstreak@102 150 function Handler:GetLockButtons()
flickerstreak@130 151 return self.config.lockButtons
flickerstreak@102 152 end
flickerstreak@102 153
flickerstreak@102 154 function Handler:SetLockButtons(info, value)
flickerstreak@102 155 self.config.lockButtons = value
flickerstreak@102 156 UpdateButtonLock(self.bar)
flickerstreak@102 157 end
flickerstreak@102 158
flickerstreak@102 159 function Handler:GetLockButtonsCombat()
flickerstreak@102 160 return self.config.lockButtonsCombat
flickerstreak@102 161 end
flickerstreak@102 162
flickerstreak@102 163 function Handler:SetLockButtonsCombat(info, value)
flickerstreak@102 164 self.config.lockButtonsCombat = value
flickerstreak@102 165 UpdateButtonLock(self.bar)
flickerstreak@102 166 end
flickerstreak@102 167
flickerstreak@102 168 function Handler:LockButtonsCombatDisabled()
flickerstreak@130 169 return not self.config.lockButtons
flickerstreak@102 170 end
flickerstreak@102 171
flickerstreak@102 172
flickerstreak@60 173 function module:GetBarOptions(bar)
flickerstreak@91 174 if bar.config.type == moduleID then
flickerstreak@91 175 return {
flickerstreak@91 176 type = "group",
flickerstreak@91 177 name = L["Pet Buttons"],
flickerstreak@102 178 handler = Handler:New(bar),
flickerstreak@91 179 args = {
flickerstreak@102 180 lockButtons = {
flickerstreak@102 181 name = L["Lock Buttons"],
flickerstreak@147 182 desc = L["Prevents picking up/dragging actions (use SHIFT to override this behavior)"],
flickerstreak@102 183 order = 2,
flickerstreak@102 184 type = "toggle",
flickerstreak@102 185 get = "GetLockButtons",
flickerstreak@102 186 set = "SetLockButtons",
flickerstreak@102 187 },
flickerstreak@102 188 lockOnlyCombat = {
flickerstreak@102 189 name = L["Only in Combat"],
flickerstreak@102 190 desc = L["Only lock the buttons when in combat"],
flickerstreak@102 191 order = 3,
flickerstreak@102 192 type = "toggle",
flickerstreak@102 193 disabled = "LockButtonsCombatDisabled",
flickerstreak@102 194 get = "GetLockButtonsCombat",
flickerstreak@102 195 set = "SetLockButtonsCombat",
flickerstreak@102 196 },
flickerstreak@91 197 }
flickerstreak@60 198 }
flickerstreak@91 199 end
flickerstreak@59 200 end
flickerstreak@59 201
flickerstreak@53 202