comparison modules/ReAction_Action/ReAction_Action.lua @ 75:06cd74bdc7da

- Cleaned up Bar interface - Move all attribute setting from Bar into State - Separated Moonkin and Tree of Life - Removed PossessBar module - Added some infrastructure for paged/mind control support to Action
author Flick <flickerstreak@gmail.com>
date Mon, 16 Jun 2008 18:46:08 +0000
parents 768be7eb22a0
children da8ba8783924
comparison
equal deleted inserted replaced
74:00e28094e1a3 75:06cd74bdc7da
15 15
16 -- module declaration 16 -- module declaration
17 local moduleID = "Action" 17 local moduleID = "Action"
18 local module = ReAction:NewModule( moduleID ) 18 local module = ReAction:NewModule( moduleID )
19 19
20 -- private --
21 local function GetBarConfig(bar)
22 return module.db.profile.bars[bar:GetName()]
23 end
24
25 local function RefreshLite(bar)
26 local btns = module.buttons[bar]
27 if btns then
28 for _, b in ipairs(btns) do
29 b:Refresh()
30 end
31 end
32 end
33
34
20 -- module methods 35 -- module methods
21 function module:OnInitialize() 36 function module:OnInitialize()
22 self.db = ReAction.db:RegisterNamespace( moduleID, 37 self.db = ReAction.db:RegisterNamespace( moduleID,
23 { 38 {
24 profile = { 39 profile = {
25 buttons = { } 40 buttons = { },
41 bars = { },
26 } 42 }
27 } 43 }
28 ) 44 )
29 self.buttons = { } 45 self.buttons = { }
30 46
77 local btns = self.buttons[bar] 93 local btns = self.buttons[bar]
78 local profile = self.db.profile 94 local profile = self.db.profile
79 if profile.buttons[name] == nil then 95 if profile.buttons[name] == nil then
80 profile.buttons[name] = {} 96 profile.buttons[name] = {}
81 end 97 end
98 if profile.bars[name] == nil then
99 profile.bars[name] = {}
100 end
82 local btnCfg = profile.buttons[name] 101 local btnCfg = profile.buttons[name]
102 local barCfg = profile.bars[name]
83 103
84 local r, c = bar:GetButtonGrid() 104 local r, c = bar:GetButtonGrid()
85 local n = r*c 105 local n = r*c
86 for i = 1, n do 106 for i = 1, n do
87 if btnCfg[i] == nil then 107 if btnCfg[i] == nil then
88 btnCfg[i] = {} 108 btnCfg[i] = {}
89 end 109 end
90 if btns[i] == nil then 110 if btns[i] == nil then
91 local ok, b = pcall(self.BtnClass.new, self.BtnClass, bar, i, btnCfg[i]) 111 local ok, b = pcall(self.BtnClass.New, self.BtnClass, bar, i, btnCfg[i], barCfg)
92 if ok and b then 112 if ok and b then
93 btns[i] = b 113 btns[i] = b
94 end 114 bar:AddButton(i,b)
95 else 115 end
96 btns[i]:Refresh(bar,i)
97 end 116 end
98 end 117 end
99 for i = n+1, #btns do 118 for i = n+1, #btns do
100 if btns[i] then 119 if btns[i] then
120 bar:RemoveButton(btns[i])
101 btns[i] = btns[i]:Destroy() 121 btns[i] = btns[i]:Destroy()
102 if btnCfg[i] then 122 if btnCfg[i] then
103 btnCfg[i] = nil 123 btnCfg[i] = nil
104 end 124 end
105 end 125 end
106 end 126 end
127 RefreshLite(bar)
107 end 128 end
108 end 129 end
109 130
110 function module:OnDestroyBar(event, bar, name) 131 function module:OnDestroyBar(event, bar, name)
111 if self.buttons[bar] then 132 if self.buttons[bar] then
119 end 140 end
120 end 141 end
121 142
122 function module:OnEraseBar(event, bar, name) 143 function module:OnEraseBar(event, bar, name)
123 self.db.profile.buttons[name] = nil 144 self.db.profile.buttons[name] = nil
145 self.db.profile.bars[name] = nil
124 end 146 end
125 147
126 function module:OnRenameBar(event, bar, oldname, newname) 148 function module:OnRenameBar(event, bar, oldname, newname)
127 local b = self.db.profile.buttons 149 local b = self.db.profile.buttons
150 b[newname], b[oldname] = b[oldname], nil
151
152 b = self.db.profile.bars
128 b[newname], b[oldname] = b[oldname], nil 153 b[newname], b[oldname] = b[oldname], nil
129 end 154 end
130 155
131 function module:SetHideEmptyButtons(hide) 156 function module:SetHideEmptyButtons(hide)
132 if hide ~= self.db.profile.hideEmptyButtons then 157 if hide ~= self.db.profile.hideEmptyButtons then
161 end 186 end
162 end 187 end
163 188
164 function module:showActionIDLabel(button) 189 function module:showActionIDLabel(button)
165 if not button.actionIDLabel and button:GetActionID() then 190 if not button.actionIDLabel and button:GetActionID() then
166 local label = button:GetFrame():CreateFontString(nil,"OVERLAY","GameFontNormalLarge") 191 local f = button:GetFrame()
192 local label = f:CreateFontString(nil,"OVERLAY","GameFontNormalLarge")
167 label:SetAllPoints() 193 label:SetAllPoints()
168 label:SetJustifyH("CENTER") 194 label:SetJustifyH("CENTER")
169 label:SetShadowColor(0,0,0,1) 195 label:SetShadowColor(0,0,0,1)
170 label:SetShadowOffset(2,-2) 196 label:SetShadowOffset(2,-2)
171 label:SetText(tostring(button:GetActionID())) 197 label:SetText(tostring(button:GetActionID()))
172 button.actionIDLabel = label 198 button.actionIDLabel = label
199 f:HookScript("OnAttributeChanged",
200 function(frame, attr, value)
201 if attr == "state-parent" then
202 label:SetText(tostring(button:GetActionID()))
203 end
204 end)
173 end 205 end
174 button.actionIDLabel:Show() 206 button.actionIDLabel:Show()
175 end 207 end
176 208
177 function module:hideActionIDLabel(button) 209 function module:hideActionIDLabel(button)
228 260
229 261
230 ------ Button class ------ 262 ------ Button class ------
231 local Button = { } 263 local Button = { }
232 264
233 local function Constructor( self, bar, idx, config ) 265 local function Constructor( self, bar, idx, config, barConfig )
234 self.bar, self.idx, self.config = bar, idx, config 266 self.bar, self.idx, self.config, self.barConfig = bar, idx, config, barConfig
235 267
236 local barFrame = bar:GetFrame() 268 local barFrame = bar:GetFrame()
237 269
238 config.name = config.name or ("ReAction_%s_%d"):format(bar:GetName(),idx) 270 config.name = config.name or ("ReAction_%s_%d"):format(bar:GetName(),idx)
239 self.name = config.name 271 self.name = config.name
240 config.actionID = ActionIDList[config.actionID] -- gets a free one if none configured 272 config.actionID = ActionIDList[config.actionID] -- gets a free one if none configured
273 self.nPages = 1
241 274
242 local f = CreateFrame("CheckButton", self.name, barFrame, "ActionBarButtonTemplate") 275 local f = CreateFrame("CheckButton", self.name, barFrame, "ActionBarButtonTemplate")
243 276
244 -- TODO: re-implement ActionButton event handlers that don't do secure stuff 277 -- TODO: re-implement ActionButton event handlers that don't do secure stuff
245 278
246 -- this will probably cause taint, using right now for display/debugging purposes 279 -- this will probably cause taint and/or performance problems, using right now for display/debugging purposes
247 f:SetScript("OnAttributeChanged", ActionButton_UpdateAction) 280 f:SetScript("OnAttributeChanged", ActionButton_UpdateAction)
281
248 f:SetAttribute("action", config.actionID) 282 f:SetAttribute("action", config.actionID)
283 -- install mind control action support for all buttons here just for simplicity
284 if self.idx <= 12 then
285 f:SetAttribute("action-mc", 120 + self.idx)
286 end
249 287
250 barFrame:SetAttribute("addchild",f) 288 barFrame:SetAttribute("addchild",f)
251 289
252 self.frame = f 290 self.frame = f
253 self:Refresh(bar,idx) 291 self:Refresh()
254 292
255 if not module.db.profile.hideEmptyButtons then 293 if not module.db.profile.hideEmptyButtons then
256 ActionButton_ShowGrid(self.frame) 294 ActionButton_ShowGrid(self.frame)
257 end 295 end
258 296
272 _G[self.name] = nil 310 _G[self.name] = nil
273 end 311 end
274 if self.config.actionID then 312 if self.config.actionID then
275 ActionIDList[self.config.actionID] = nil 313 ActionIDList[self.config.actionID] = nil
276 end 314 end
315 if self.config.pages then
316 for _, id in ipairs(self.config.pages) do
317 ActionIDList[id] = nil
318 end
319 end
277 self.frame = nil 320 self.frame = nil
278 self.config = nil 321 self.config = nil
279 self.bar = nil 322 self.bar = nil
280 end 323 end
281 324
282 function Button:Refresh(bar,idx) 325 function Button:Refresh()
283 bar:PlaceButton(self.frame, idx, 36, 36) 326 local f = self.frame
327 self.bar:PlaceButton(self, 36, 36)
328 if self.barConfig.mckeybinds then
329 f:SetAttribute("bindings-mc", self.barConfig.mckeybinds[self.idx])
330 end
331 self:RefreshPages()
284 end 332 end
285 333
286 function Button:GetFrame() 334 function Button:GetFrame()
287 return self.frame 335 return self.frame
288 end 336 end
290 function Button:GetName() 338 function Button:GetName()
291 return self.name 339 return self.name
292 end 340 end
293 341
294 function Button:GetActionID() 342 function Button:GetActionID()
295 return self.config.actionID 343 return SecureButton_GetModifiedAttribute(self.frame, "action")
296 end 344 end
297 345
346 function Button:RefreshPages()
347 local nPages = 1 --self.bar:GetNumPages()
348 if nPages ~= self.nPages then
349 local f = self:GetFrame()
350 local c = self.config.pages
351 if nPages > 1 and not c then
352 c = { }
353 self.config.pages = c
354 end
355 for i = 1, nPages do
356 c[i] = ActionIDList[c[i]] -- gets a free one if none configured
357 f:SetAttribute(("action-page%d"):format(i))
358 end
359 for i = nPages+1, #c do
360 ActionIDList[c[i]] = nil
361 c[i] = nil
362 f:SetAttribute(("action-page%d"):format(i))
363 end
364
365 -- TODO:
366 -- apply next-page, prev-page, and direct-page keybinds (via bar:SetStateKeybind abstraction)
367 end
368 end
298 369
299 -- export as a class-factory to module 370 -- export as a class-factory to module
300 module.BtnClass = { 371 module.BtnClass = {
301 new = function(self, ...) 372 New = function(self, ...)
302 local x = { } 373 local x = { }
303 for k,v in pairs(Button) do 374 for k,v in pairs(Button) do
304 x[k] = v 375 x[k] = v
305 end 376 end
306 Constructor(x, ...) 377 Constructor(x, ...)