Mercurial > wow > reaction
comparison classes/ActionButton.lua @ 128:729232aeeb5e
Action Button rewrite. (note: pet actions are probably slightly broken right now, they haven't been updated yet)
author | Flick <flickerstreak@gmail.com> |
---|---|
date | Thu, 05 Mar 2009 01:28:48 +0000 |
parents | 0c5017f6062d |
children | 28b430de5875 |
comparison
equal
deleted
inserted
replaced
127:29dacbecdb52 | 128:729232aeeb5e |
---|---|
57 else | 57 else |
58 action = self:GetAttribute("default-action") | 58 action = self:GetAttribute("default-action") |
59 end | 59 end |
60 | 60 |
61 self:SetAttribute("action",action) | 61 self:SetAttribute("action",action) |
62 local hasaction = (action > 120) or self:GetAttribute("hasaction-"..action) | 62 |
63 | 63 if not self:GetAttribute("showgrid") then |
64 if (self:GetAttribute("showgrid") + self:GetAttribute("showgrid-temp") == 0) and not hasaction then | 64 local hasaction = (action > 120) or self:GetAttribute("hasaction-"..action) |
65 self:Hide() | 65 local tempShow = self:GetAttribute("showgrid-temp") |
66 else | 66 local evtShow = self:GetAttribute("showgrid-event") |
67 self:Show() | 67 if tempShow then tempShow = (tempShow > 0) end |
68 if evtShow then evtShow = (evtShow > 0) end | |
69 | |
70 if tempShow or evtShow or hasaction then | |
71 self:Show() | |
72 else | |
73 self:Hide() | |
74 end | |
68 end | 75 end |
69 ]] | 76 ]] |
70 | 77 |
71 local _childupdate_vehicleExit = -- function(self, snippetid, message) | 78 local _childupdate_vehicleExit = -- function(self, snippetid, message) |
72 [[ | 79 [[ |
81 control:CallMethod("ShowVehicleExit",show) | 88 control:CallMethod("ShowVehicleExit",show) |
82 ]] | 89 ]] |
83 | 90 |
84 local _childupdate_showgrid = -- function(self, snippetid, message) | 91 local _childupdate_showgrid = -- function(self, snippetid, message) |
85 [[ | 92 [[ |
86 self:SetAttribute("showgrid-temp",message or 0) | 93 self:SetAttribute("showgrid-event",message) |
87 local count = (message or 0) + (self:GetAttribute("showgrid") or 0) | 94 if not self:GetAttribute("showgrid") then |
88 if count == 0 then | 95 local count = message + (self:GetAttribute("showgrid-temp") or 0) |
89 local action = self:GetAttribute("action") | 96 if count <= 0 then |
90 local hasaction = (action > 120) or self:GetAttribute("hasaction-"..action) | 97 local action = self:GetAttribute("action") |
91 if hasaction then | 98 local hasaction = (action > 120) or self:GetAttribute("hasaction-"..action) |
99 if hasaction then | |
100 self:Show() | |
101 else | |
102 self:Hide() | |
103 end | |
104 else | |
92 self:Show() | 105 self:Show() |
93 else | 106 end |
94 self:Hide() | |
95 end | |
96 else | |
97 self:Show() | |
98 end | 107 end |
99 ]] | 108 ]] |
100 | 109 |
101 local _onDragStart = -- function(self, button, kind, value, ...) | 110 local _onDragStart = -- function(self, button, kind, value, ...) |
102 [[ | 111 [[ |
109 end | 118 end |
110 ]] | 119 ]] |
111 | 120 |
112 local _onReceiveDrag = -- function(self, button, kind, value, ...) | 121 local _onReceiveDrag = -- function(self, button, kind, value, ...) |
113 [[ | 122 [[ |
114 if lockButtons and (PlayerInCombat() or not lockButtonsCombat) and not IsModifiedClick("PICKUPACTION") then | 123 if kind == "spell" or kind == "item" or kind == "macro" then |
115 return kind, value, ... | 124 -- assume it's a valid action |
116 else | 125 self:SetAttribute("hasaction-"..self:GetAttribute("action"),true) |
117 if kind == "spell" or kind == "item" or kind == "macro" then | 126 end |
118 -- assume it's a valid action | 127 return "action", self:GetAttribute("action") |
119 self:SetAttribute("hasaction-"..self:GetAttribute("action"),true) | |
120 end | |
121 return "action", self:GetAttribute("action") | |
122 end | |
123 ]] | 128 ]] |
124 | 129 |
125 -- | 130 -- |
126 -- private | 131 -- private |
127 -- | 132 -- |
152 -- | 157 -- |
153 local Super = ReAction.Button | 158 local Super = ReAction.Button |
154 local Action = setmetatable( { }, { __index = Super } ) | 159 local Action = setmetatable( { }, { __index = Super } ) |
155 ReAction.Button.Action = Action | 160 ReAction.Button.Action = Action |
156 | 161 |
157 function Action:New( idx, config, bar, idHint ) | 162 function Action:New( idx, barConfig, bar, idHint ) |
158 local name = format("ReAction_%s_Action_%d",bar:GetName(),idx) | 163 local name = format("ReAction_%s_Action_%d",bar:GetName(),idx) |
159 | 164 |
160 self = Super.New(self, name, config, bar, idx, "SecureActionButtonTemplate, ActionButtonTemplate" ) | 165 self = Super.New(self, name, barConfig, bar, idx, "SecureActionButtonTemplate, ActionButtonTemplate" ) |
161 | 166 |
162 local f = self:GetFrame() | 167 local f = self:GetFrame() |
163 local barFrame = bar:GetFrame() | 168 local barFrame = bar:GetFrame() |
169 local config = self:GetConfig() | |
164 | 170 |
165 local frames = { } | 171 local frames = { } |
166 self.frames = frames | 172 self.frames = frames |
167 frames.icon = _G[name.."Icon"] | 173 frames.icon = _G[name.."Icon"] |
168 frames.flash = _G[name.."Flash"] | 174 frames.flash = _G[name.."Flash"] |
188 f:SetAttribute("checkselfcast", true) | 194 f:SetAttribute("checkselfcast", true) |
189 f:SetAttribute("checkfocuscast", true) | 195 f:SetAttribute("checkfocuscast", true) |
190 f:SetAttribute("useparent-unit", true) | 196 f:SetAttribute("useparent-unit", true) |
191 f:SetAttribute("action", config.actionID) | 197 f:SetAttribute("action", config.actionID) |
192 f:SetAttribute("default-action", config.actionID) | 198 f:SetAttribute("default-action", config.actionID) |
193 f:SetAttribute("showgrid",0) | 199 f:SetAttribute("bar-idx",idx) |
194 f:SetAttribute("showgrid-temp",0) | 200 f:SetAttribute("showgrid-temp",0) |
195 f:SetAttribute("bar-idx",idx) | 201 f:SetAttribute("showgrid-event",0) |
202 f:SetAttribute("showgrid",not self:GetBarConfig().hideEmpty) | |
203 | |
204 self:RefreshHasActionAttributes() | |
196 | 205 |
197 -- non secure scripts | 206 -- non secure scripts |
198 f:SetScript("OnEvent", function(frame, ...) self:OnEvent(...) end) | 207 f:SetScript("OnEvent", function(frame, ...) self:OnEvent(...) end) |
199 f:SetScript("OnEnter", function(frame) self:OnEnter() end) | 208 f:SetScript("OnEnter", function(frame) self:OnEnter() end) |
200 f:SetScript("OnLeave", function(frame) self:OnLeave() end) | 209 f:SetScript("OnLeave", function(frame) self:OnLeave() end) |
203 f:SetScript("OnUpdate", function(frame, elapsed) self:OnUpdate(elapsed) end) | 212 f:SetScript("OnUpdate", function(frame, elapsed) self:OnUpdate(elapsed) end) |
204 f:SetScript("OnDragStart", function(frame) self:OnDragStart() end) | 213 f:SetScript("OnDragStart", function(frame) self:OnDragStart() end) |
205 f:SetScript("OnReceiveDrag", function(frame) self:OnReceiveDrag() end) | 214 f:SetScript("OnReceiveDrag", function(frame) self:OnReceiveDrag() end) |
206 | 215 |
207 -- secure handlers | 216 -- secure handlers |
208 f:SetAttribute("_childupate", _childupdate) | 217 f:SetAttribute("_childupdate", _childupdate) |
209 f:SetAttribute("_childupdate-showgrid",_childupdate_showgrid) | 218 f:SetAttribute("_childupdate-showgrid",_childupdate_showgrid) |
210 barFrame:WrapScript(f, "OnDragStart", _onDragStart) | 219 barFrame:WrapScript(f, "OnDragStart", _onDragStart) |
211 barFrame:WrapScript(f, "OnReceiveDrag", _onReceiveDrag) | 220 barFrame:WrapScript(f, "OnReceiveDrag", _onReceiveDrag) |
212 | 221 |
213 -- event registration | 222 -- event registration |
220 | 229 |
221 -- attach to skinner | 230 -- attach to skinner |
222 bar:SkinButton(self) | 231 bar:SkinButton(self) |
223 | 232 |
224 -- initial display | 233 -- initial display |
225 self:ShowGrid(not bar:GetConfig().hideEmpty) | |
226 if ReAction:GetConfigMode() then | 234 if ReAction:GetConfigMode() then |
227 self:ShowGrid(true) | 235 self:ShowGridTemp(true) |
228 end | 236 end |
229 | |
230 f:Show() | |
231 | 237 |
232 self:Refresh() | 238 self:Refresh() |
233 | 239 |
234 return self | 240 return self |
235 end | 241 end |
236 | 242 |
237 function Action:Destroy() | 243 function Action:Destroy() |
238 local f = self:GetFrame() | 244 local f = self:GetFrame() |
245 local c = self:GetConfig() | |
239 | 246 |
240 f:UnregisterAllEvents() | 247 f:UnregisterAllEvents() |
241 | 248 |
242 f:SetAttribute("_childupdate-vehicle",nil) | 249 f:SetAttribute("_childupdate-vehicle",nil) |
243 | 250 |
244 self:ReleaseActionID(config.actionID) | 251 self:ReleaseActionID(c.actionID) |
245 if self.config.pageactions then | 252 if c.pageactions then |
246 for _, id in ipairs(self.config.pageactions) do | 253 for _, id in ipairs(c.pageactions) do |
247 self:ReleaseActionID(id) | 254 self:ReleaseActionID(id) |
248 end | 255 end |
249 end | 256 end |
250 | 257 |
251 Super:Destroy() | 258 Super.Destroy(self) |
252 end | 259 end |
253 | 260 |
254 function Action:Refresh() | 261 function Action:Refresh() |
255 self.bar:PlaceButton(self, 36, 36) | 262 self.bar:PlaceButton(self, 36, 36) |
256 self:RefreshPages() | 263 self:RefreshPages() |
257 self:InstallVehicle() | 264 self:InstallVehicle() |
265 self:ShowGrid(not self:GetBarConfig().hideEmpty) | |
258 self:UpdateAction() | 266 self:UpdateAction() |
259 end | 267 end |
260 | 268 |
261 function Action:InstallVehicle() | 269 function Action:InstallVehicle() |
262 if self.idx == 7 and self.bar:GetConfig().vehicle then | 270 if self.idx == 7 and self:GetBarConfig().vehicle then |
263 -- install vehicle-exit button on 7th button (only) | 271 -- install vehicle-exit button on 7th button (only) |
264 f:SetAttribute("_childupdate-vehicle", _childupdate_vehicleExit) | 272 self:GetFrame():SetAttribute("_childupdate-vehicle", _childupdate_vehicleExit) |
265 barFrame.ShowVehicleExit = function(bar,show) | 273 self:GetBar():GetFrame().ShowVehicleExit = function(bar,show) |
266 self:ShowVehicleExit(show) | 274 self:ShowVehicleExit(show) |
267 end | 275 end |
268 else | 276 else |
269 f:SetAttribute("_childupdate-vehicle",nil) | 277 self:GetFrame():SetAttribute("_childupdate-vehicle",nil) |
278 end | |
279 end | |
280 | |
281 function Action:ShowGrid( show ) | |
282 if not InCombatLockdown() then | |
283 self.frame:SetAttribute("showgrid", show) | |
284 self:UpdateShowGrid() | |
285 end | |
286 end | |
287 | |
288 function Action:ShowGridTemp( show ) | |
289 -- This function only modifies the show-grid when out | |
290 -- of combat, and is ignored by the secure handler. Use | |
291 -- it for configuration modes. | |
292 if not InCombatLockdown() then | |
293 local count = self.showGridTempCount or 0 | |
294 if show then | |
295 count = count + 1 | |
296 else | |
297 count = count - 1 | |
298 end | |
299 if count < 0 then count = 0 end | |
300 self.showGridTempCount = count | |
301 self:GetFrame():SetAttribute("showgrid-temp",count) | |
302 self:UpdateShowGrid() | |
270 end | 303 end |
271 end | 304 end |
272 | 305 |
273 function Action:UpdateAll() | 306 function Action:UpdateAll() |
274 self:UpdateActionIDLabel(ReAction:GetConfigMode()) | 307 self:UpdateActionIDLabel(ReAction:GetConfigMode()) |
291 self.actionID = action | 324 self.actionID = action |
292 self:UpdateAll() | 325 self:UpdateAll() |
293 end | 326 end |
294 end | 327 end |
295 | 328 |
329 function Action:RefreshHasActionAttributes() | |
330 -- check if each action has an action or not, and flag an attribute | |
331 -- so that the showgrid secure handler can make decisions accordingly | |
332 local f = self:GetFrame() | |
333 local attr = "hasaction-"..self.config.actionID | |
334 local hasAction = HasAction(self.config.actionID) | |
335 if f:GetAttribute(attr) ~= hasAction then | |
336 f:SetAttribute(attr,hasAction) -- avoid setting attribute and triggering script handler unnecessarily | |
337 end | |
338 if self.config.pageactions then | |
339 for i = 1, self.nPages do | |
340 attr = "hasaction-"..self.config.pageactions[i] | |
341 hasAction = HasAction(self.config.pageactions[i]) | |
342 if f:GetAttribute(attr) ~= hasAction then | |
343 f:SetAttribute(attr,hasAction) | |
344 end | |
345 end | |
346 end | |
347 end | |
348 | |
296 function Action:UpdateShowGrid() | 349 function Action:UpdateShowGrid() |
297 -- this is a little bit complicated because there's no | 350 -- this is a little bit complicated because there's no |
298 -- secure driver to handle show/hide grid events. | 351 -- secure access to HasAction. |
299 if InCombatLockdown() then | 352 if InCombatLockdown() then |
300 self.showgridPending = true -- handle after combat | 353 self.showgridPending = true -- handle after combat |
301 else | 354 else |
302 self.showgridPending = false | 355 self.showgridPending = false |
303 -- check if each action has an action or not, and flag an attribute | 356 self:RefreshHasActionAttributes() |
304 -- so that the showgrid secure handler can make decisions accordingly | 357 |
305 local f = self:GetFrame() | |
306 f:SetAttribute("hasaction-"..self.config.actionID, HasAction(self.config.actionID)) | |
307 if self.config.pageactions then | |
308 for i = 1, self.nPages do | |
309 f:SetAttribute("hasaction-"..self.config.pageactions[i], HasAction(self.config.pageactions[i])) | |
310 end | |
311 end | |
312 -- the following is an out-of-combat show/hide to supplement the secure | 358 -- the following is an out-of-combat show/hide to supplement the secure |
313 -- handling and clean up after it when it guesses | 359 -- handling and clean up after it when it guesses |
314 if HasAction(self.actionID) then | 360 local f = self:GetFrame() |
361 local count = (f:GetAttribute("showgrid-event") or 0) + | |
362 (self.showGridTempCount or 0) + | |
363 (f:GetAttribute("showgrid") and 1 or 0) | |
364 | |
365 if count <= 0 and not HasAction(self.actionID) then | |
366 if f:IsShown() then | |
367 f:Hide() | |
368 end | |
369 elseif not f:IsShown() then | |
315 f:Show() | 370 f:Show() |
316 else | |
317 f:Hide() | |
318 end | 371 end |
319 end | 372 end |
320 end | 373 end |
321 | 374 |
322 function Action:UpdateIcon() | 375 function Action:UpdateIcon() |
505 end | 558 end |
506 end | 559 end |
507 end | 560 end |
508 | 561 |
509 function Action:RefreshPages( force ) | 562 function Action:RefreshPages( force ) |
510 local nPages = self.bar:GetConfig().nPages | 563 local nPages = self:GetBarConfig().nPages |
511 if nPages and (nPages ~= self.nPages or force) then | 564 if nPages and (nPages ~= self.nPages or force) then |
512 local f = self:GetFrame() | 565 local f = self:GetFrame() |
513 local c = self.config.pageactions | 566 local c = self.config.pageactions |
514 if nPages > 1 and not c then | 567 if nPages > 1 and not c then |
515 c = { } | 568 c = { } |
530 end | 583 end |
531 self.nPages = nPages | 584 self.nPages = nPages |
532 end | 585 end |
533 end | 586 end |
534 | 587 |
535 function Action.SetupBarHeader( bar ) -- call this as a static method | 588 function Action.SetupBarHeader( bar, config ) -- call this as a static method |
536 local f = bar:GetFrame() | 589 local f = bar:GetFrame() |
537 local c = bar:GetConfig() | 590 f:SetAttribute("mindcontrol",config.mindcontrol) |
538 f:SetAttribute("mindcontrol",c.mindcontrol) | 591 f:SetAttribute("vehicle",config.vehicle) |
539 f:SetAttribute("vehicle",c.vehicle) | |
540 f:Execute( | 592 f:Execute( |
541 [[ | 593 [[ |
542 doMindControl = self:GetAttribute("mindcontrol") | 594 doMindControl = self:GetAttribute("mindcontrol") |
543 doVehicle = self:GetAttribute("vehicle") | 595 doVehicle = self:GetAttribute("vehicle") |
544 control:ChildUpdate() | 596 control:ChildUpdate() |
545 ]]) | 597 ]]) |
546 | 598 |
547 f:SetAttribute("_onstate-mc", _onstate_mc) | 599 f:SetAttribute("_onstate-mc", _onstate_mc) |
548 RegisterStateDriver(f, "mc", "[target=vehicle,exists] vehicle; [bonusbar:5] mc; none") | 600 RegisterStateDriver(f, "mc", "[target=vehicle,exists] vehicle; [bonusbar:5] mc; none") |
549 | 601 |
550 f:SetAttribute("lockbuttons",c.lockButtons) | 602 f:SetAttribute("lockbuttons",config.lockButtons) |
551 f:SetAttribute("lockbuttonscombat",c.lockButtonsCombat) | 603 f:SetAttribute("lockbuttonscombat",config.lockButtonsCombat) |
552 f:Execute( | 604 f:Execute( |
553 [[ | 605 [[ |
554 lockButtons = self:GetAttribute("lockbuttons") | 606 lockButtons = self:GetAttribute("lockbuttons") |
555 lockButtonsCombat = self:GetAttribute("lockbuttonscombat") | 607 lockButtonsCombat = self:GetAttribute("lockbuttonscombat") |
556 ]]) | 608 ]]) |
570 | 622 |
571 | 623 |
572 function Action:ShowVehicleExit(show) | 624 function Action:ShowVehicleExit(show) |
573 local f = self:GetFrame() | 625 local f = self:GetFrame() |
574 local tx = f.vehicleExitTexture | 626 local tx = f.vehicleExitTexture |
575 if show and self.bar:GetConfig().vehicle then | 627 if show and self:GetBarConfig().vehicle then |
576 if not tx then | 628 if not tx then |
577 tx = f:CreateTexture(nil,"ARTWORK") | 629 tx = f:CreateTexture(nil,"ARTWORK") |
578 tx:SetAllPoints() | 630 tx:SetAllPoints() |
579 -- copied from Blizzard/VehicleMenuBar.lua SkinsData | 631 -- copied from Blizzard/VehicleMenuBar.lua SkinsData |
580 tx:SetTexture("Interface\\Vehicles\\UI-Vehicles-Button-Exit-Up") | 632 tx:SetTexture("Interface\\Vehicles\\UI-Vehicles-Button-Exit-Up") |
627 end | 679 end |
628 end | 680 end |
629 | 681 |
630 function Action:ACTIONBAR_SLOT_CHANGED(event, action) | 682 function Action:ACTIONBAR_SLOT_CHANGED(event, action) |
631 if action == 0 or action == self.actionID then | 683 if action == 0 or action == self.actionID then |
632 self:UpdateAction() | 684 self:UpdateAll() |
633 end | 685 end |
634 end | 686 end |
635 | 687 |
636 function Action:PLAYER_ENTERING_WORLD() | 688 function Action:PLAYER_ENTERING_WORLD() |
637 self:UpdateAction() | 689 self:UpdateAction() |