comparison ActionButton.lua @ 245:65f2805957a0

No real reason to store some of the code in a subdirectory.
author Flick
date Sat, 26 Mar 2011 12:35:08 -0700
parents classes/ActionButton.lua@8bde290d300c
children c918ff9ac787
comparison
equal deleted inserted replaced
244:f255cd69e890 245:65f2805957a0
1 local addonName, addonTable = ...
2 local ReAction = addonTable.ReAction
3 local L = ReAction.L
4 local _G = _G
5 local CreateFrame = CreateFrame
6 local format = string.format
7 local IsUsableAction = IsUsableAction
8 local IsEquippedAction = IsEquippedAction
9 local IsConsumableAction = IsConsumableAction
10 local IsStackableAction = IsStackableAction
11 local GetActionText = GetActionText
12 local GetCVar = GetCVar
13 local GameTooltip_SetDefaultAnchor = GameTooltip_SetDefaultAnchor
14 local IsCurrentAction = IsCurrentAction
15 local IsAutoRepeatAction = IsAutoRepeatAction
16 local IsUsableAction = IsUsableAction
17 local IsAttackAction = IsAttackAction
18 local CooldownFrame_SetTimer = CooldownFrame_SetTimer
19 local GetActionCooldown = GetActionCooldown
20 local GetActionTexture = GetActionTexture
21 local ATTACK_BUTTON_FLASH_TIME = ATTACK_BUTTON_FLASH_TIME
22 local TOOLTIP_UPDATE_TIME = TOOLTIP_UPDATE_TIME
23 local IsActionInRange = IsActionInRange
24 local InCombatLockdown = InCombatLockdown
25 local HasAction = HasAction
26
27 --
28 -- Secure snippets
29 -- These are run within the context of the bar's sandbox, as the
30 -- buttons themselves do not have their own sandbox.
31 --
32 local _onstate_mc = -- function(self, stateid, newstate)
33 [[
34 local oldMcVehicleState = mcVehicleState
35 mcVehicleState = newstate
36 control:ChildUpdate()
37 if oldMcVehicleState == "vehicle" or mcVehicleState == "vehicle" then
38 control:ChildUpdate("vehicle")
39 end
40 ]]
41
42 local _childupdate = -- function(self, snippetid, message)
43 [[
44 local action = nil
45 if (doVehicle and mcVehicleState == "vehicle") or
46 (doMindControl and mcVehicleState == "mc") then
47 local idx = self:GetAttribute("bar-idx")
48 local maxN = (doVehicle and mcVehicleState == "vehicle") and 7 or 12
49 if idx and idx <= maxN then
50 action = 120 + idx
51 else
52 action = 0
53 end
54 elseif state and settings[state] and settings[state].page then
55 action = self:GetAttribute("action-"..settings[state].page)
56 end
57 if action == nil then
58 action = self:GetAttribute("default-action")
59 end
60
61 self:SetAttribute("action",action)
62
63 if not self:GetAttribute("showgrid") then
64 local tempShow = self:GetAttribute("showgrid-temp")
65 local evtShow = self:GetAttribute("showgrid-event")
66 if tempShow then tempShow = (tempShow > 0) end
67 if evtShow then evtShow = (evtShow > 0) end
68
69 if tempShow or evtShow or HasAction(action) then
70 self:Show()
71 else
72 self:Hide()
73 end
74 end
75 ]]
76
77 local _childupdate_vehicleExit = -- function(self, snippetid, message)
78 [[
79 local show = (mcVehicleState == "vehicle")
80 if show and doVehicle then
81 self:SetAttribute("type","macro")
82 self:Show()
83 else
84 self:SetAttribute("type","action")
85 end
86 control:CallMethod("ShowVehicleExit",show)
87 ]]
88
89 local _childupdate_showgrid = -- function(self, snippetid, message)
90 [[
91 showgrid_event = message
92 self:SetAttribute("showgrid-event",message)
93 if not self:GetAttribute("showgrid") then
94 local count = message + (self:GetAttribute("showgrid-temp") or 0)
95 if count <= 0 then
96 local action = self:GetAttribute("action")
97 -- note that HasAction is not updated on the target of a drag until after ACTIONBAR_HIDEGRID
98 -- so, we set a flag for this button in pre-click/receive-drag and check for it here
99 if HasAction(action) or self:GetAttribute("showgrid-clicked") then
100 if not self:IsShown() then
101 self:Show()
102 end
103 self:SetAttribute("showgrid-clicked",false)
104 else
105 if self:IsShown() then
106 self:Hide()
107 end
108 end
109 else
110 self:Show()
111 end
112 end
113 ]]
114
115 local _onDragStart = -- function(self, button, kind, value, ...)
116 [[
117 if lockButtons and (PlayerInCombat() or not lockButtonsCombat) and not IsModifiedClick("PICKUPACTION") then
118 return kind, value, ...
119 else
120 return "action", self:GetAttribute("action")
121 end
122 ]]
123
124 local _onReceiveDrag = -- function(self, button, kind, value, ...)
125 [[
126 if kind ~= "spell" and kind ~= "item" and kind ~= "macro" and kind ~= "flyout" then
127 return kind, value, ...
128 else
129 if showgrid_event and showgrid_event > 0 then
130 self:SetAttribute("showgrid-clicked",true)
131 end
132 return "action", self:GetAttribute("action")
133 end
134 ]]
135
136 local _onClick = -- function(self, button, down)
137 [[
138 if showgrid_event and showgrid_event > 0 then
139 self:SetAttribute("showgrid-clicked",true)
140 end
141 return button
142 ]]
143
144 --
145 -- private
146 --
147 local eventList = {
148 "PLAYER_ENTERING_WORLD",
149 "ACTIONBAR_PAGE_CHANGED",
150 "ACTIONBAR_SLOT_CHANGED",
151 "UPDATE_BINDINGS",
152 "ACTIONBAR_UPDATE_STATE",
153 "ACTIONBAR_UPDATE_USABLE",
154 "ACTIONBAR_UPDATE_COOLDOWN",
155 "UNIT_INVENTORY_CHANGED",
156 "LEARNED_SPELL_IN_TAB",
157 "UPDATE_INVENTORY_ALERTS",
158 "PLAYER_TARGET_CHANGED",
159 "TRADE_SKILL_SHOW",
160 "TRADE_SKILL_CLOSE",
161 "PLAYER_ENTER_COMBAT",
162 "PLAYER_LEAVE_COMBAT",
163 "START_AUTOREPEAT_SPELL",
164 "STOP_AUTOREPEAT_SPELL",
165 "UNIT_ENTERED_VEHICLE",
166 "UNIT_EXITED_VEHICLE",
167 "COMPANION_UPDATE",
168 }
169
170 --
171 -- Action Button class
172 --
173 local buttonTypeID = "Action"
174 local Super = ReAction.Button
175 local Action = setmetatable(
176 {
177 defaultBarConfig = {
178 type = buttonTypeID,
179 btnWidth = 36,
180 btnHeight = 36,
181 btnRows = 1,
182 btnColumns = 12,
183 spacing = 3,
184 buttons = { },
185 },
186
187 barType = L["Action Bar"],
188 buttonTypeID = buttonTypeID
189 },
190 { __index = Super } )
191
192 ReAction.Button.Action = Action
193 ReAction:RegisterBarType(Action, true)
194
195 function Action:New( config, bar, idx, idHint )
196 local name = format("ReAction_%s_Action_%d",bar:GetName(),idx)
197
198 self = Super.New(self, name, config, bar, idx, "SecureActionButtonTemplate, ActionButtonTemplate" )
199 self.barConfig = bar:GetConfig()
200
201 local f = self:GetFrame()
202 local barFrame = bar:GetFrame()
203
204 self.rangeTimer = TOOLTIP_UPDATE_TIME
205
206 -- set up the base action ID
207 self:SetActionIDPool("action",120)
208 config.actionID = self:AcquireActionID(config.actionID, idHint)
209 self.nPages = 1
210
211 -- attribute setup
212 f:SetAttribute("type","action")
213 f:SetAttribute("checkselfcast", true)
214 f:SetAttribute("checkfocuscast", true)
215 f:SetAttribute("action", config.actionID)
216 f:SetAttribute("default-action", config.actionID)
217 f:SetAttribute("bar-idx",idx)
218 f:SetAttribute("showgrid-temp",0)
219 f:SetAttribute("showgrid-event",0)
220 f:SetAttribute("showgrid",not self:GetBarConfig().hideEmpty)
221
222 -- non secure scripts
223 f:SetScript("OnEvent", function(frame, ...) self:OnEvent(...) end)
224 f:SetScript("OnEnter", function(frame) self:OnEnter() end)
225 f:SetScript("OnLeave", function(frame) self:OnLeave() end)
226 f:SetScript("OnAttributeChanged", function(frame, attr, value) self:OnAttributeChanged(attr, value) end)
227 f:SetScript("PostClick", function(frame, ...) self:PostClick(...) end)
228 f:SetScript("OnUpdate", function(frame, elapsed) self:OnUpdate(elapsed) end)
229 f:SetScript("OnDragStart", function(frame) self:OnDragStart() end)
230 f:SetScript("OnReceiveDrag", function(frame) self:OnReceiveDrag() end)
231
232 -- event registration
233 f:EnableMouse(true)
234 f:RegisterForDrag("LeftButton", "RightButton")
235 f:RegisterForClicks("AnyUp")
236 for _, evt in pairs(eventList) do
237 f:RegisterEvent(evt)
238 end
239
240 f.action = config.actionID -- need this to support silly ActionButton_UpdateFlyout. Should not taint anything anymore.
241
242 -- secure handlers
243 f:SetAttribute("_childupdate", _childupdate)
244 f:SetAttribute("_childupdate-showgrid",_childupdate_showgrid)
245 barFrame:WrapScript(f, "OnDragStart", _onDragStart)
246 barFrame:WrapScript(f, "OnReceiveDrag", _onReceiveDrag)
247 barFrame:WrapScript(f, "OnClick", _onClick)
248
249 -- attach to skinner
250 bar:SkinButton(self)
251
252 -- initial display
253 if ReAction:GetConfigMode() then
254 self:ShowGridTemp(true)
255 end
256
257 self:Refresh()
258
259 return self
260 end
261
262 function Action:Destroy()
263 local f = self:GetFrame()
264 local c = self:GetConfig()
265
266 f:SetAttribute("_childupdate-vehicle",nil)
267 f:SetAttribute("action",c.actionID) -- so that Super.Destroy releases the right one
268
269 if c.pageactions and #c.pageactions > 1 then
270 for i = 2, #c.pageactions do
271 self:ReleaseActionID(c.pageactions[i])
272 self:ReleaseActionID(id)
273 end
274 end
275
276 Super.Destroy(self)
277 end
278
279 function Action:GetBarConfig()
280 -- this is the per-bar Action module config structure,
281 -- not the config structure of the bar itself
282 return self.barConfig
283 end
284
285 function Action:Refresh()
286 Super.Refresh(self)
287 self:RefreshPages()
288 self:InstallVehicle()
289 self:ShowGrid(not self:GetBarConfig().hideEmpty)
290 self:UpdateAction()
291 end
292
293 function Action:InstallVehicle()
294 local f = self:GetFrame()
295 if self.idx == 7 and self:GetBarConfig().vehicle then
296 if not self.vehicleInstalled then
297 self.vehicleInstalled = true
298 -- install vehicle-exit button on 7th button (only)
299 f:SetAttribute("_childupdate-vehicle", _childupdate_vehicleExit)
300 f:SetAttribute("macrotext","/run VehicleExit()")
301 self:GetBar():GetFrame().ShowVehicleExit = function(bar,show)
302 self:ShowVehicleExit(show)
303 end
304 end
305 -- setscale blows away tex coords
306 self:UpdateIcon()
307 elseif self.vehicleInstalled then
308 self.vehicleInstalled = false
309 f:SetAttribute("_childupdate-vehicle",nil)
310 f:SetAttribute("macrotext",nil)
311 end
312 end
313
314 function Action:ShowGrid( show )
315 if not InCombatLockdown() then
316 self.frame:SetAttribute("showgrid", show)
317 self:UpdateShowGrid()
318 end
319 end
320
321 function Action:ShowGridTemp( show )
322 -- This function only modifies the show-grid when out
323 -- of combat, and is ignored by the secure handler. Use
324 -- it for configuration modes.
325 if not InCombatLockdown() then
326 local count = self.showGridTempCount or 0
327 if show then
328 count = count + 1
329 else
330 count = count - 1
331 end
332 if count < 0 then count = 0 end
333 self.showGridTempCount = count
334 self:GetFrame():SetAttribute("showgrid-temp",count)
335 self:UpdateShowGrid()
336 end
337 end
338
339 function Action:UpdateAll()
340 self:UpdateActionIDLabel(ReAction:GetConfigMode())
341 self:UpdateHotkey()
342 self:UpdateShowGrid()
343 self:UpdateIcon()
344 self:UpdateBorder()
345 self:UpdateMacroText()
346 self:UpdateCount()
347 self:UpdateTooltip()
348 self:UpdateCheckedState()
349 self:UpdateUsable()
350 self:UpdateCooldown()
351 self:UpdateFlash()
352 end
353
354 function Action:UpdateAction()
355 local action = self:GetActionID()
356 if action ~= self.actionID then
357 self.actionID = action
358 self:UpdateAll()
359 end
360 end
361
362 function Action:UpdateShowGrid()
363 if not InCombatLockdown() then
364 local f = self:GetFrame()
365 local count = (f:GetAttribute("showgrid-event") or 0) +
366 (self.showGridTempCount or 0) +
367 (f:GetAttribute("showgrid") and 1 or 0)
368
369 if count <= 0 and not HasAction(self.actionID) then
370 if f:IsShown() then
371 f:Hide()
372 end
373 elseif not f:IsShown() then
374 f:Show()
375 end
376 end
377 end
378
379 function Action:UpdateIcon()
380 local texture, tLeft, tRight, tTop, tBottom = self:GetIconTexture()
381 local icon = self.frames.icon
382 local hotkey = self.frames.hotkey
383 local f = self:GetFrame()
384
385 if self.vehicleExitMode then
386 texture = "Interface\\Vehicles\\UI-Vehicles-Button-Exit-Up"
387 icon:SetTexCoord(0.140625, 0.859375, 0.140625, 0.859375)
388 icon:SetVertexColor(1,1,1)
389 else
390 icon:SetTexCoord(0,1,0,1)
391 end
392
393 if texture then
394 icon:SetTexture(texture)
395 if tLeft then
396 icon:SetTexCoord(tLeft,tRight,tTop,tBottom)
397 end
398 icon:Show()
399 self.rangeTimer = -1
400 f:SetNormalTexture("Interface\\Buttons\\UI-Quickslot2")
401 else
402 icon:Hide()
403 self.frames.cooldown:Hide()
404 self.rangeTimer = nil
405 f:SetNormalTexture("Interface\\Buttons\\UI-Quickslot")
406 end
407 end
408
409 function Action:GetIconTexture()
410 return GetActionTexture(self.actionID)
411 end
412
413 function Action:UpdateBorder()
414 local action = self.actionID
415 if ReAction:GetKeybindMode() then
416 self:UpdateKeybindModeDisplay(true)
417 elseif IsEquippedAction(action) then
418 self.frames.border:SetVertexColor(0, 1.0, 0, 0.35)
419 self.frames.border:Show()
420 else
421 self.frames.border:Hide()
422 end
423 end
424
425 function Action:UpdateMacroText()
426 local action = self.actionID
427 if not IsConsumableAction(action) and not IsStackableAction(action) then
428 self.frames.name:SetText(GetActionText(action))
429 else
430 self.frames.name:SetText("")
431 end
432 end
433
434 function Action:UpdateCount()
435 local action = self.actionID
436 if IsConsumableAction(action) or IsStackableAction(action) then
437 self.frames.count:SetText(GetActionCount(action))
438 else
439 self.frames.count:SetText("")
440 end
441 end
442
443 function Action:UpdateTooltip()
444 local f = self:GetFrame()
445 if GameTooltip:GetOwner() == f then
446 self:SetTooltip()
447 end
448 end
449
450 function Action:SetTooltip()
451 local f = self:GetFrame()
452 if GetCVar("UberTooltips") == "1" then
453 GameTooltip_SetDefaultAnchor(GameTooltip, f)
454 else
455 GameTooltip:SetOwner(f,"ANCHOR_RIGHT")
456 end
457 GameTooltip:SetAction(self.actionID)
458 end
459
460 function Action:UpdateCheckedState()
461 local action = self.actionID
462 if IsCurrentAction(action) or IsAutoRepeatAction(action) then
463 self:GetFrame():SetChecked(1)
464 else
465 self:GetFrame():SetChecked(0)
466 end
467 end
468
469 function Action:UpdateUsable()
470 local isUsable, notEnoughMana = self:GetUsable()
471 local noRange = self:GetInRange()
472
473 isUsable = self.vehicleExitMode or (isUsable and not noRange)
474
475 if isUsable then
476 if self.usableStatus ~= "usable" then
477 self.frames.icon:SetVertexColor(1.0, 1.0, 1.0)
478 self.frames.normalTexture:SetVertexColor(1.0, 1.0, 1.0)
479 self.usableStatus = "usable"
480 end
481 elseif noRange then
482 if self.usableStatus ~= "norange" then
483 self.frames.icon:SetVertexColor(1.0,0.1,0.1)
484 self.frames.normalTexture:SetVertexColor(1.0, 1.0, 1.0)
485 self.usableStatus = "norange"
486 end
487 elseif notEnoughMana then
488 if self.usableStatus ~= "oom" then
489 self.frames.icon:SetVertexColor(0.5, 0.5, 1.0)
490 self.frames.normalTexture:SetVertexColor(0.5, 0.5, 1.0)
491 self.usableStatus = "oom"
492 end
493 else
494 if self.usableStatus ~= "unusable" then
495 self.frames.icon:SetVertexColor(0.4, 0.4, 0.4)
496 self.frames.normalTexture:SetVertexColor(1.0, 1.0, 1.0)
497 self.usableStatus = "unusable"
498 end
499 end
500 end
501
502 function Action:GetUsable()
503 return IsUsableAction(self.actionID)
504 end
505
506 function Action:GetInRange()
507 return IsActionInRange(self.actionID) == 0
508 end
509
510 function Action:UpdateCooldown()
511 CooldownFrame_SetTimer(self.frames.cooldown, self:GetCooldown())
512 end
513
514 function Action:GetCooldown()
515 return GetActionCooldown(self.actionID)
516 end
517
518 function Action:UpdateFlash()
519 local action = self.actionID
520 self:SetFlash( (IsAttackAction(action) and IsCurrentAction(action)) or IsAutoRepeatAction(action) )
521 end
522
523 function Action:SetFlash(flash)
524 if self.flashing ~= flash then
525 self.flashing = flash
526 self.flashtime = 0
527 if not flash then
528 self.frames.flash:Hide()
529 end
530 self:UpdateCheckedState()
531 end
532 end
533
534 function Action:RunFlash(elapsed)
535 if self.flashing then
536 local flashtime = self.flashtime - elapsed
537 self.flashtime = flashtime
538 if flashtime <= 0 then
539 local overtime = -flashtime
540 if overtime >= ATTACK_BUTTON_FLASH_TIME then
541 overtime = 0
542 end
543 flashtime = ATTACK_BUTTON_FLASH_TIME - overtime
544 local flash = self.frames.flash
545 if flash:IsShown() then
546 flash:Hide()
547 else
548 flash:Show()
549 end
550 end
551 end
552 end
553
554 function Action:RunRangeFinder(elapsed)
555 local rangeTimer = self.rangeTimer
556 if rangeTimer then
557 rangeTimer = rangeTimer - elapsed
558 self.rangeTimer = rangeTimer
559 if rangeTimer <= 0 then
560 self:UpdateUsable()
561 self.rangeTimer = TOOLTIP_UPDATE_TIME
562 end
563 end
564 end
565
566 function Action:GetActionID(page)
567 if page == nil then
568 -- get the effective ID
569 return self:GetFrame():GetAttribute("action")
570 else
571 if page == 1 then
572 return self.config.actionID
573 else
574 return self.config.pageactions and self.config.pageactions[page] or self.config.actionID
575 end
576 end
577 end
578
579 function Action:SetActionID( id, page )
580 id = tonumber(id)
581 page = tonumber(page)
582 if id == nil or id < 1 or id > 120 then
583 ReAction:UserError(L["Action ID range is 1-120"])
584 return
585 end
586 if page and page ~= 1 then
587 if not self.config.pageactions then
588 self.config.pageactions = { }
589 end
590 self:ReleaseActionID(self.config.pageactions[page])
591 self.config.pageactions[page] = id
592 self:AcquireActionID(self.config.pageactions[page])
593 self.frame:SetAttribute("action-page"..page,id)
594 else
595 self:ReleaseActionID(self.config.actionID)
596 self.config.actionID = id
597 self:AcquireActionID(self.config.actionID)
598 self.frame:SetAttribute("action",id)
599 self.frame:SetAttribute("default-action",id)
600 if self.config.pageactions then
601 self.config.pageactions[1] = id
602 self.frame:SetAttribute("action-page1",id)
603 end
604 end
605 end
606
607 function Action:RefreshPages( force )
608 local nPages = self:GetBarConfig().nPages
609 if nPages and (nPages ~= self.nPages or force) then
610 local f = self:GetFrame()
611 local c = self.config.pageactions
612 if nPages > 1 and not c then
613 c = { }
614 self.config.pageactions = c
615 end
616 for i = 1, nPages do
617 if i > 1 then
618 c[i] = self:AcquireActionID(c[i], self.config.actionID + (i-1)*self.bar:GetNumButtons())
619 else
620 c[i] = self.config.actionID -- page 1 is the same as the base actionID
621 end
622 f:SetAttribute("action-page"..i,c[i])
623 end
624 for i = nPages+1, #c do
625 self:ReleaseActionID(c[i])
626 c[i] = nil
627 f:SetAttribute("action-page"..i,nil)
628 end
629 self.nPages = nPages
630 end
631 end
632
633 function Action:SetupBar( bar )
634 Super.SetupBar(self,bar)
635
636 local f = bar:GetFrame()
637 local config = bar:GetConfig()
638 f:SetAttribute("mindcontrol",config.mindcontrol)
639 f:SetAttribute("vehicle",config.vehicle)
640 f:Execute(
641 [[
642 doMindControl = self:GetAttribute("mindcontrol")
643 doVehicle = self:GetAttribute("vehicle")
644 control:ChildUpdate()
645 ]])
646
647 f:SetAttribute("_onstate-mc", _onstate_mc)
648 RegisterStateDriver(f, "mc", "[vehicleui] vehicle; [bonusbar:5] mc; none")
649
650 f:SetAttribute("lockbuttons",config.lockButtons)
651 f:SetAttribute("lockbuttonscombat",config.lockButtonsCombat)
652 f:Execute(
653 [[
654 lockButtons = self:GetAttribute("lockbuttons")
655 lockButtonsCombat = self:GetAttribute("lockbuttonscombat")
656 ]])
657 end
658
659
660 function Action:SetButtonLock( bar, lock, lockCombat )
661 local f = bar:GetFrame()
662 f:SetAttribute("lockbuttons",lock)
663 f:SetAttribute("lockbuttonscombat",lockCombat)
664 f:Execute(
665 [[
666 lockButtons = self:GetAttribute("lockbuttons")
667 lockButtonsCombat = self:GetAttribute("lockbuttonscombat")
668 ]])
669 end
670
671
672 function Action:ShowVehicleExit(show)
673 self.vehicleExitMode = show and self:GetBarConfig().vehicle
674 self:UpdateIcon()
675 end
676
677 function Action:OnEnter( )
678 self:SetTooltip()
679 end
680
681 function Action:OnLeave( )
682 GameTooltip:Hide()
683 end
684
685 function Action:OnAttributeChanged( attr, value )
686 if attr ~= "statehidden" then
687 self:UpdateAction()
688 end
689 local f = self:GetFrame()
690 f.action = f:GetAttribute("action") -- support ActionButton_UpdateFlyout
691 end
692
693 function Action:PostClick( )
694 self:UpdateCheckedState()
695 end
696
697 function Action:OnUpdate( elapsed )
698 self:RunFlash(elapsed)
699 self:RunRangeFinder(elapsed)
700 end
701
702 function Action:OnDragStart()
703 self:UpdateCheckedState()
704 self:UpdateFlash()
705 end
706
707 function Action:OnReceiveDrag()
708 self:UpdateCheckedState()
709 self:UpdateFlash()
710 end
711
712 function Action:OnEvent(event, ...)
713 if self[event] then
714 self[event](self, event, ...)
715 end
716 end
717
718 function Action:ACTIONBAR_SLOT_CHANGED(event, action)
719 if action == 0 or action == self.actionID then
720 self:UpdateAll()
721 end
722 end
723
724 function Action:PLAYER_ENTERING_WORLD()
725 self:UpdateAction()
726 end
727
728 function Action:ACTIONBAR_PAGE_CHANGED()
729 self:UpdateAction()
730 end
731
732 function Action:UPDATE_BONUS_ACTIONBAR()
733 self:UpdateAction()
734 end
735
736 function Action:UPDATE_BINDINGS()
737 self:UpdateHotkey()
738 end
739
740 function Action:PLAYER_TARGET_CHANGED()
741 self.rangeTimer = -1
742 end
743
744 function Action:ACTIONBAR_UPDATE_STATE()
745 self:UpdateCheckedState()
746 end
747
748 function Action:TRADE_SKILL_SHOW()
749 self:UpdateCheckedState()
750 end
751 Action.TRADE_SKILL_CLOSE = Action.TRADE_SKILL_CLOSE
752
753 function Action:UNIT_ENTERED_VEHICLE(event,unit)
754 if unit == "player" then
755 self:UpdateCheckedState()
756 end
757 end
758 Action.UNIT_EXITED_VEHICLE = Action.UNIT_ENTERED_VEHICLE
759
760 function Action:COMPANION_UPDATE(event,unit)
761 if unit == "mount" then
762 self:UpdateCheckedState()
763 end
764 end
765
766 function Action:ACTIONBAR_UPDATE_USABLE()
767 self:UpdateUsable()
768 end
769
770 function Action:ACTIONBAR_UPDATE_COOLDOWN()
771 self:UpdateCooldown()
772 end
773
774 function Action:PLAYER_ENTER_COMBAT()
775 if IsAttackAction(self.actionID) then
776 self:SetFlash(true)
777 end
778 end
779
780 function Action:PLAYER_LEAVE_COMBAT()
781 if IsAttackAction(self.actionID) then
782 self:SetFlash(false)
783 end
784 end
785
786 function Action:START_AUTOREPEAT_SPELL()
787 if IsAutoRepeatAction(self.actionID) then
788 self:SetFlash(true)
789 end
790 end
791
792 function Action:STOP_AUTOREPEAT_SPELL()
793 if not IsAttackAction(self.actionID) then
794 self:SetFlash(false)
795 end
796 end
797
798 function Action:UNIT_INVENTORY_CHANGED(unit)
799 if unit == "player" then
800 self:UpdateTooltip()
801 end
802 end
803
804 function Action:LEARNED_SPELL_IN_TAB()
805 self:UpdateTooltip()
806 end