annotate classes/ActionButton.lua @ 123:943eed2c7def

Fixes for new ActionButton implementation
author Flick <flickerstreak@gmail.com>
date Mon, 23 Feb 2009 19:41:11 +0000
parents a2d2f23137c8
children 0c5017f6062d
rev   line source
flickerstreak@122 1 local ReAction = ReAction
flickerstreak@122 2 local L = ReAction.L
flickerstreak@122 3 local _G = _G
flickerstreak@122 4 local CreateFrame = CreateFrame
flickerstreak@122 5 local GetBindingKey = GetBindingKey
flickerstreak@122 6 local format = string.format
flickerstreak@122 7 local IsUsableAction = IsUsableAction
flickerstreak@122 8 local IsEquippedAction = IsEquippedAction
flickerstreak@122 9 local IsConsumableAction = IsConsumableAction
flickerstreak@122 10 local IsStackableAction = IsStackableAction
flickerstreak@122 11 local GetActionText = GetActionText
flickerstreak@122 12 local GetCVar = GetCVar
flickerstreak@122 13 local GameTooltip_SetDefaultAnchor = GameTooltip_SetDefaultAnchor
flickerstreak@122 14 local IsCurrentAction = IsCurrentAction
flickerstreak@122 15 local IsAutoRepeatAction = IsAutoRepeatAction
flickerstreak@122 16 local IsUsableAction = IsUsableAction
flickerstreak@122 17 local IsAttackAction = IsAttackAction
flickerstreak@122 18 local CooldownFrame_SetTimer = CooldownFrame_SetTimer
flickerstreak@122 19 local GetActionCooldown = GetActionCooldown
flickerstreak@122 20 local GetActionTexture = GetActionTexture
flickerstreak@122 21 local ATTACK_BUTTON_FLASH_TIME = ATTACK_BUTTON_FLASH_TIME
flickerstreak@122 22 local TOOLTIP_UPDATE_TIME = TOOLTIP_UPDATE_TIME
flickerstreak@122 23 local IsActionInRange = IsActionInRange
flickerstreak@122 24 local InCombatLockdown = InCombatLockdown
flickerstreak@122 25 local HasAction = HasAction
flickerstreak@122 26
flickerstreak@122 27 ReAction:UpdateRevision("$Revision: 154 $")
flickerstreak@122 28
flickerstreak@122 29 --
flickerstreak@122 30 -- Secure snippets
flickerstreak@122 31 -- These are run within the context of the bar's sandbox, as the
flickerstreak@122 32 -- buttons themselves do not have their own sandbox.
flickerstreak@122 33 --
flickerstreak@122 34 local _onstate_mc = -- function(self, stateid, newstate)
flickerstreak@122 35 [[
flickerstreak@122 36 local oldMcVehicleState = mcVehicleState
flickerstreak@122 37 mcVehicleState = newstate
flickerstreak@122 38 control:ChildUpdate()
flickerstreak@122 39 if oldMcVehicleState == "vehicle" or mcVehicleState == "vehicle" then
flickerstreak@122 40 control:ChildUpdate("vehicle")
flickerstreak@122 41 end
flickerstreak@122 42 ]]
flickerstreak@122 43
flickerstreak@122 44 local _childupdate = -- function(self, snippetid, message)
flickerstreak@122 45 [[
flickerstreak@122 46 local action = nil
flickerstreak@122 47 if (doVehicle and mcVehicleState == "vehicle") or
flickerstreak@122 48 (doMindControl and mcVehicleState == "mc") then
flickerstreak@122 49 local idx = self:GetAttribute("bar-idx")
flickerstreak@122 50 if idx and idx <= 12 then
flickerstreak@122 51 action = 120 + idx
flickerstreak@122 52 else
flickerstreak@122 53 action = 0
flickerstreak@122 54 end
flickerstreak@122 55 elseif page and state and page[state] then
flickerstreak@122 56 action = self:GetAttribute("action-page"..page[state])
flickerstreak@122 57 else
flickerstreak@122 58 action = self:GetAttribute("default-action")
flickerstreak@122 59 end
flickerstreak@122 60
flickerstreak@122 61 self:SetAttribute("action",action)
flickerstreak@122 62 local hasaction = (action > 120) or self:GetAttribute("hasaction-"..action)
flickerstreak@122 63
flickerstreak@122 64 if (self:GetAttribute("showgrid") + self:GetAttribute("showgrid-temp") == 0) and not hasaction then
flickerstreak@122 65 self:Hide()
flickerstreak@122 66 else
flickerstreak@122 67 self:Show()
flickerstreak@122 68 end
flickerstreak@122 69 ]]
flickerstreak@122 70
flickerstreak@122 71 local _childupdate_vehicleExit = -- function(self, snippetid, message)
flickerstreak@122 72 [[
flickerstreak@122 73 local show = (mcVehicleState == "vehicle")
flickerstreak@122 74 if show then
flickerstreak@122 75 self:SetAttribute("type","macro")
flickerstreak@122 76 self:SetAttribute("macrotext","/run VehicleExit()")
flickerstreak@122 77 self:Show()
flickerstreak@122 78 else
flickerstreak@122 79 self:SetAttribute("type","action")
flickerstreak@122 80 end
flickerstreak@122 81 control:CallMethod("ShowVehicleExit",show)
flickerstreak@122 82 ]]
flickerstreak@122 83
flickerstreak@122 84 local _childupdate_showgrid = -- function(self, snippetid, message)
flickerstreak@122 85 [[
flickerstreak@122 86 self:SetAttribute("showgrid-temp",message or 0)
flickerstreak@122 87 local count = (message or 0) + (self:GetAttribute("showgrid") or 0)
flickerstreak@122 88 if count == 0 then
flickerstreak@122 89 local action = self:GetAttribute("action")
flickerstreak@122 90 local hasaction = (action > 120) or self:GetAttribute("hasaction-"..action)
flickerstreak@122 91 if hasaction then
flickerstreak@122 92 self:Show()
flickerstreak@122 93 else
flickerstreak@122 94 self:Hide()
flickerstreak@122 95 end
flickerstreak@122 96 else
flickerstreak@122 97 self:Show()
flickerstreak@122 98 end
flickerstreak@122 99 ]]
flickerstreak@122 100
flickerstreak@122 101 local _onDragStart = -- function(self, button, kind, value, ...)
flickerstreak@122 102 [[
flickerstreak@122 103 if lockButtons and (PlayerInCombat() or not lockButtonsCombat) and not IsModifiedClick("PICKUPACTION") then
flickerstreak@122 104 return kind, value, ...
flickerstreak@122 105 else
flickerstreak@122 106 -- don't make any assumptions about hiding on grid show here, as we don't know if the
flickerstreak@122 107 -- drag gets cancelled later.
flickerstreak@122 108 return "action", self:GetAttribute("action")
flickerstreak@122 109 end
flickerstreak@122 110 ]]
flickerstreak@122 111
flickerstreak@122 112 local _onReceiveDrag = -- function(self, button, kind, value, ...)
flickerstreak@122 113 [[
flickerstreak@122 114 if lockButtons and (PlayerInCombat() or not lockButtonsCombat) and not IsModifiedClick("PICKUPACTION") then
flickerstreak@122 115 return kind, value, ...
flickerstreak@122 116 else
flickerstreak@122 117 if kind == "spell" or kind == "item" or kind == "macro" then
flickerstreak@122 118 -- assume it's a valid action
flickerstreak@122 119 self:SetAttribute("hasaction-"..self:GetAttribute("action"),true)
flickerstreak@122 120 end
flickerstreak@122 121 return "action", self:GetAttribute("action")
flickerstreak@122 122 end
flickerstreak@122 123 ]]
flickerstreak@122 124
flickerstreak@122 125 --
flickerstreak@122 126 -- private
flickerstreak@122 127 --
flickerstreak@122 128 local eventList = {
flickerstreak@122 129 "PLAYER_REGEN_ENABLED",
flickerstreak@122 130 "PLAYER_ENTERING_WORLD",
flickerstreak@122 131 "ACTIONBAR_PAGE_CHANGED",
flickerstreak@122 132 "ACTIONBAR_SLOT_CHANGED",
flickerstreak@122 133 "UPDATE_BINDINGS",
flickerstreak@122 134 "ACTIONBAR_UPDATE_STATE",
flickerstreak@122 135 "ACTIONBAR_UPDATE_USABLE",
flickerstreak@122 136 "ACTIONBAR_UPDATE_COOLDOWN",
flickerstreak@122 137 "UPDATE_INVENTORY_ALERTS",
flickerstreak@122 138 "PLAYER_TARGET_CHANGED",
flickerstreak@122 139 "TRADE_SKILL_SHOW",
flickerstreak@122 140 "TRADE_SKILL_CLOSE",
flickerstreak@122 141 "PLAYER_ENTER_COMBAT",
flickerstreak@122 142 "PLAYER_LEAVE_COMBAT",
flickerstreak@122 143 "START_AUTOREPEAT_SPELL",
flickerstreak@122 144 "STOP_AUTOREPEAT_SPELL",
flickerstreak@122 145 "UNIT_ENTERED_VEHICLE",
flickerstreak@122 146 "UNIT_EXITED_VEHICLE",
flickerstreak@122 147 "COMPANION_UPDATE",
flickerstreak@122 148 }
flickerstreak@122 149
flickerstreak@122 150 --
flickerstreak@122 151 -- Action Button class
flickerstreak@122 152 --
flickerstreak@122 153 local Super = ReAction.Button
flickerstreak@122 154 local Action = setmetatable( { }, { __index = Super } )
flickerstreak@122 155 ReAction.Button.Action = Action
flickerstreak@122 156
flickerstreak@122 157 function Action:New( idx, config, bar, idHint )
flickerstreak@123 158 local name = format("ReAction_%s_Action_%d",bar:GetName(),idx)
flickerstreak@123 159
flickerstreak@123 160 self = Super.New(self, name, config, bar, idx, "ActionButtonTemplate, SecureActionButtonTemplate" )
flickerstreak@122 161
flickerstreak@122 162 local f = self:GetFrame()
flickerstreak@122 163 local barFrame = bar:GetFrame()
flickerstreak@122 164
flickerstreak@122 165 local frames = { }
flickerstreak@122 166 self.frames = frames
flickerstreak@122 167 frames.icon = _G[name.."Icon"]
flickerstreak@122 168 frames.flash = _G[name.."Flash"]
flickerstreak@122 169 frames.hotkey = _G[name.."HotKey"]
flickerstreak@122 170 frames.count = _G[name.."Count"]
flickerstreak@122 171 frames.name = _G[name.."Name"]
flickerstreak@122 172 frames.border = _G[name.."Border"]
flickerstreak@122 173 frames.cooldown = _G[name.."Cooldown"]
flickerstreak@122 174 frames.normalTexture = _G[name.."NormalTexture"]
flickerstreak@122 175
flickerstreak@122 176 self.hotkey = frames.hotkey -- alias for Button methods
flickerstreak@122 177 self.border = frames.border -- alias for Button methods
flickerstreak@122 178
flickerstreak@122 179 self.rangeTimer = TOOLTIP_UPDATE_TIME
flickerstreak@122 180
flickerstreak@122 181 -- set up the base action ID
flickerstreak@122 182 self:SetActionIDPool("action",120)
flickerstreak@122 183 config.actionID = self:AcquireActionID(config.actionID, idHint)
flickerstreak@122 184 self.actionID = config.actionID
flickerstreak@122 185 self.nPages = 1
flickerstreak@122 186
flickerstreak@122 187 -- attribute setup
flickerstreak@122 188 f:SetAttribute("type","action")
flickerstreak@122 189 f:SetAttribute("checkselfcast", true)
flickerstreak@122 190 f:SetAttribute("checkfocuscast", true)
flickerstreak@122 191 f:SetAttribute("useparent-unit", true)
flickerstreak@122 192 f:SetAttribute("action", config.actionID)
flickerstreak@122 193 f:SetAttribute("default-action", config.actionID)
flickerstreak@122 194 f:SetAttribute("showgrid",0)
flickerstreak@122 195 f:SetAttribute("showgrid-temp",0)
flickerstreak@122 196 f:SetAttribute("bar-idx",idx)
flickerstreak@122 197
flickerstreak@122 198 -- non secure scripts
flickerstreak@122 199 f:SetScript("OnEvent", function(frame, ...) self:OnEvent(...) end)
flickerstreak@122 200 f:SetScript("OnEnter", function(frame) self:OnEnter() end)
flickerstreak@122 201 f:SetScript("OnLeave", function(frame) self:OnLeave() end)
flickerstreak@122 202 f:SetScript("OnAttributeChanged", function(frame, attr, value) self:OnAttributeChanged(attr, value) end)
flickerstreak@122 203 f:SetScript("PostClick", function(frame, ...) self:PostClick(...) end)
flickerstreak@122 204 f:SetScript("OnUpdate", function(frame, elapsed) self:OnUpdate(elapsed) end)
flickerstreak@122 205 f:SetScript("OnDragStart", function(frame) self:OnDragStart() end)
flickerstreak@123 206 f:SetScript("OnReceiveDrag", function(frame) self:OnReceiveDrag() end)
flickerstreak@122 207
flickerstreak@122 208 -- secure handlers
flickerstreak@122 209 f:SetAttribute("_childupate", _childupdate)
flickerstreak@122 210 f:SetAttribute("_childupdate-showgrid",_childupdate_showgrid)
flickerstreak@122 211 barFrame:WrapScript(f, "OnDragStart", _onDragStart)
flickerstreak@122 212 barFrame:WrapScript(f, "OnReceiveDrag", _onReceiveDrag)
flickerstreak@122 213 if idx == 7 then
flickerstreak@122 214 -- install vehicle-exit button on 7th button (only)
flickerstreak@122 215 f:SetAttribute("_childupdate-vehicle", _childupdate_vehicleExit)
flickerstreak@122 216 local button = self
flickerstreak@122 217 function barFrame:ShowVehicleExit(show)
flickerstreak@122 218 button:ShowVehicleExit(show)
flickerstreak@122 219 end
flickerstreak@122 220 end
flickerstreak@122 221
flickerstreak@122 222 -- event registration
flickerstreak@122 223 f:RegisterForDrag("LeftButton", "RightButton")
flickerstreak@122 224 f:RegisterForClicks("AnyUp")
flickerstreak@122 225 for _, evt in pairs(eventList) do
flickerstreak@122 226 f:RegisterEvent(evt)
flickerstreak@122 227 end
flickerstreak@122 228
flickerstreak@122 229 -- attach to skinner
flickerstreak@122 230 bar:SkinButton(self)
flickerstreak@122 231
flickerstreak@122 232 -- initial display
flickerstreak@123 233 self:ShowGrid(not bar:GetConfig().hideEmpty)
flickerstreak@122 234 if ReAction:GetConfigMode() then
flickerstreak@122 235 self:ShowGrid(true)
flickerstreak@122 236 end
flickerstreak@122 237
flickerstreak@123 238 f:Show()
flickerstreak@123 239
flickerstreak@122 240 self:Refresh()
flickerstreak@123 241
flickerstreak@123 242 return self
flickerstreak@122 243 end
flickerstreak@122 244
flickerstreak@122 245 function Action:Destroy()
flickerstreak@122 246 local f = self:GetFrame()
flickerstreak@122 247
flickerstreak@122 248 f:UnregisterAllEvents()
flickerstreak@122 249
flickerstreak@122 250 f:SetAttribute("_childupdate-vehicle",nil)
flickerstreak@122 251
flickerstreak@122 252 self:ReleaseActionID(config.actionID)
flickerstreak@122 253 if self.config.pageactions then
flickerstreak@122 254 for _, id in ipairs(self.config.pageactions) do
flickerstreak@122 255 self:ReleaseActionID(id)
flickerstreak@122 256 end
flickerstreak@122 257 end
flickerstreak@122 258
flickerstreak@122 259 Super:Destroy()
flickerstreak@122 260 end
flickerstreak@122 261
flickerstreak@122 262 function Action:Refresh()
flickerstreak@122 263 self.bar:PlaceButton(self, 36, 36)
flickerstreak@122 264 self:RefreshPages()
flickerstreak@122 265 self:UpdateAction()
flickerstreak@122 266 end
flickerstreak@122 267
flickerstreak@122 268 function Action:UpdateAll()
flickerstreak@122 269 self:UpdateActionIDLabel(ReAction:GetConfigMode())
flickerstreak@122 270 self:UpdateHotkey()
flickerstreak@122 271 self:UpdateShowGrid()
flickerstreak@122 272 self:UpdateIcon()
flickerstreak@122 273 self:UpdateBorder()
flickerstreak@122 274 self:UpdateMacroText()
flickerstreak@122 275 self:UpdateCount()
flickerstreak@122 276 self:UpdateTooltip()
flickerstreak@122 277 self:UpdateCheckedState()
flickerstreak@122 278 self:UpdateUsable()
flickerstreak@122 279 self:UpdateCooldown()
flickerstreak@122 280 self:UpdateFlash()
flickerstreak@122 281 end
flickerstreak@122 282
flickerstreak@122 283 function Action:UpdateAction()
flickerstreak@122 284 local action = self:GetActionID()
flickerstreak@122 285 if action ~= self.actionID then
flickerstreak@122 286 self.actionID = action
flickerstreak@122 287 self:UpdateAll()
flickerstreak@122 288 end
flickerstreak@122 289 end
flickerstreak@122 290
flickerstreak@122 291 function Action:UpdateShowGrid()
flickerstreak@122 292 -- this is a little bit complicated because there's no
flickerstreak@122 293 -- secure driver to handle show/hide grid events.
flickerstreak@122 294 if InCombatLockdown() then
flickerstreak@122 295 self.showgridPending = true -- handle after combat
flickerstreak@122 296 else
flickerstreak@122 297 self.showgridPending = false
flickerstreak@122 298 -- check if each action has an action or not, and flag an attribute
flickerstreak@122 299 -- so that the showgrid secure handler can make decisions accordingly
flickerstreak@122 300 local f = self:GetFrame()
flickerstreak@122 301 f:SetAttribute("hasaction-"..self.config.actionID, HasAction(self.config.actionID))
flickerstreak@123 302 if self.config.pageactions then
flickerstreak@123 303 for i = 1, self.nPages do
flickerstreak@123 304 f:SetAttribute("hasaction-"..self.config.pageactions[i], HasAction(self.config.pageactions[i]))
flickerstreak@123 305 end
flickerstreak@122 306 end
flickerstreak@122 307 -- the following is an out-of-combat show/hide to supplement the secure
flickerstreak@122 308 -- handling and clean up after it when it guesses
flickerstreak@122 309 if HasAction(self.actionID) then
flickerstreak@122 310 f:Show()
flickerstreak@122 311 else
flickerstreak@122 312 f:Hide()
flickerstreak@122 313 end
flickerstreak@122 314 end
flickerstreak@122 315 end
flickerstreak@122 316
flickerstreak@122 317 function Action:UpdateIcon()
flickerstreak@122 318 local action = self.actionID
flickerstreak@122 319 local texture = GetActionTexture(action)
flickerstreak@122 320 local icon = self.frames.icon
flickerstreak@122 321 local hotkey = self.frames.hotkey
flickerstreak@122 322 local f = self:GetFrame()
flickerstreak@122 323 if texture then
flickerstreak@122 324 icon:SetTexture(texture)
flickerstreak@122 325 icon:Show()
flickerstreak@122 326 self.rangeTimer = -1
flickerstreak@122 327 f:SetNormalTexture("Interface\\Buttons\\UI-Quickslot2")
flickerstreak@122 328 hotkey:SetVertexColor(1.0, 1.0, 1.0)
flickerstreak@122 329 else
flickerstreak@122 330 icon:Hide()
flickerstreak@122 331 self.frames.cooldown:Hide()
flickerstreak@122 332 self.rangeTimer = nil
flickerstreak@122 333 f:SetNormalTexture("Interface\\Buttons\\UI-Quickslot")
flickerstreak@122 334 hotkey:SetVertexColor(0.6, 0.6, 0.6)
flickerstreak@122 335 end
flickerstreak@122 336 end
flickerstreak@122 337
flickerstreak@122 338 function Action:UpdateBorder()
flickerstreak@122 339 local action = self.actionID
flickerstreak@122 340 if ReAction:GetKeybindMode() then
flickerstreak@122 341 self:UpdateKeybindModeDisplay(true)
flickerstreak@122 342 elseif IsEquippedAction(action) then
flickerstreak@122 343 self.frames.border:SetVertexColor(0, 1.0, 0, 0.35)
flickerstreak@122 344 self.frames.border:Show()
flickerstreak@122 345 else
flickerstreak@122 346 self.frames.border:Hide()
flickerstreak@122 347 end
flickerstreak@122 348 end
flickerstreak@122 349
flickerstreak@122 350 function Action:UpdateMacroText()
flickerstreak@122 351 local action = self.actionID
flickerstreak@122 352 if not IsConsumableAction(action) and not IsStackableAction(action) then
flickerstreak@122 353 self.frames.name:SetText(GetActionText(action))
flickerstreak@122 354 else
flickerstreak@122 355 self.frames.name:SetText("")
flickerstreak@122 356 end
flickerstreak@122 357 end
flickerstreak@122 358
flickerstreak@122 359 function Action:UpdateCount()
flickerstreak@122 360 local action = self.actionID
flickerstreak@122 361 if IsConsumableAction(action) or IsStackableAction(action) then
flickerstreak@122 362 self.frames.count:SetText(GetActionCount(action))
flickerstreak@122 363 else
flickerstreak@122 364 self.frames.count:SetText("")
flickerstreak@122 365 end
flickerstreak@122 366 end
flickerstreak@122 367
flickerstreak@122 368 function Action:UpdateTooltip()
flickerstreak@122 369 local f = self:GetFrame()
flickerstreak@122 370 if GameTooltip:GetOwner() == f then
flickerstreak@122 371 self:SetTooltip()
flickerstreak@122 372 end
flickerstreak@122 373 end
flickerstreak@122 374
flickerstreak@122 375 function Action:SetTooltip()
flickerstreak@122 376 local f = self:GetFrame()
flickerstreak@122 377 if GetCVar("UberTooltips") == "1" then
flickerstreak@122 378 GameTooltip_SetDefaultAnchor(GameTooltip, f)
flickerstreak@122 379 else
flickerstreak@122 380 GameTooltip:SetOwner(f)
flickerstreak@122 381 end
flickerstreak@122 382 GameTooltip:SetAction(self.actionID)
flickerstreak@122 383 end
flickerstreak@122 384
flickerstreak@122 385 function Action:UpdateCheckedState()
flickerstreak@122 386 local action = self.actionID
flickerstreak@122 387 if IsCurrentAction(action) or IsAutoRepeatAction(action) then
flickerstreak@122 388 self:GetFrame():SetChecked(1)
flickerstreak@122 389 else
flickerstreak@122 390 self:GetFrame():SetChecked(0)
flickerstreak@122 391 end
flickerstreak@122 392 end
flickerstreak@122 393
flickerstreak@122 394 function Action:UpdateUsable()
flickerstreak@122 395 local isUsable, notEnoughMana = IsUsableAction(self.actionID)
flickerstreak@122 396 if isUsable then
flickerstreak@122 397 self.frames.icon:SetVertexColor(1.0, 1.0, 1.0)
flickerstreak@122 398 self.frames.normalTexture:SetVertexColor(1.0, 1.0, 1.0)
flickerstreak@122 399 elseif notEnoughMana then
flickerstreak@122 400 self.frames.icon:SetVertexColor(0.5, 0.5, 1.0)
flickerstreak@122 401 self.frames.normalTexture:SetVertexColor(0.5, 0.5, 1.0)
flickerstreak@122 402 else
flickerstreak@122 403 self.frames.icon:SetVertexColor(0.4, 0.4, 0.4)
flickerstreak@122 404 self.frames.normalTexture:SetVertexColor(1.0, 1.0, 1.0)
flickerstreak@122 405 end
flickerstreak@122 406 end
flickerstreak@122 407
flickerstreak@122 408 function Action:UpdateCooldown()
flickerstreak@122 409 CooldownFrame_SetTimer(self.frames.cooldown, GetActionCooldown(self.actionID))
flickerstreak@122 410 end
flickerstreak@122 411
flickerstreak@122 412 function Action:UpdateFlash()
flickerstreak@122 413 local action = self.actionID
flickerstreak@122 414 self:SetFlash( (IsAttackAction(action) and IsCurrentAction(action)) or IsAutoRepeatAction(action) )
flickerstreak@122 415 end
flickerstreak@122 416
flickerstreak@122 417 function Action:SetFlash(flash)
flickerstreak@122 418 if self.flashing ~= flash then
flickerstreak@122 419 self.flashing = flash
flickerstreak@122 420 self.flashtime = 0
flickerstreak@122 421 if not flash then
flickerstreak@122 422 self.frames.flash:Hide()
flickerstreak@122 423 end
flickerstreak@122 424 self:UpdateCheckedState()
flickerstreak@122 425 end
flickerstreak@122 426 end
flickerstreak@122 427
flickerstreak@122 428 function Action:RunFlash(elapsed)
flickerstreak@122 429 if self.flashing then
flickerstreak@122 430 local flashtime = self.flashtime - elapsed
flickerstreak@122 431 self.flashtime = flashtime
flickerstreak@122 432 if flashtime <= 0 then
flickerstreak@122 433 local overtime = -flashtime
flickerstreak@122 434 if overtime >= ATTACK_BUTTON_FLASH_TIME then
flickerstreak@122 435 overtime = 0
flickerstreak@122 436 end
flickerstreak@122 437 flashtime = ATTACK_BUTTON_FLASH_TIME - overtime
flickerstreak@122 438 local flash = self.frames.flash
flickerstreak@122 439 if flash:IsShown() then
flickerstreak@122 440 flash:Hide()
flickerstreak@122 441 else
flickerstreak@122 442 flash:Show()
flickerstreak@122 443 end
flickerstreak@122 444 end
flickerstreak@122 445 end
flickerstreak@122 446 end
flickerstreak@122 447
flickerstreak@122 448 function Action:RunRangeFinder(elapsed)
flickerstreak@122 449 local rangeTimer = self.rangeTimer
flickerstreak@122 450 if rangeTimer then
flickerstreak@122 451 rangeTimer = rangeTimer - elapsed
flickerstreak@122 452 self.rangeTimer = rangeTimer
flickerstreak@122 453 if rangeTimer <= 0 then
flickerstreak@122 454 if IsActionInRange(self.actionID) == 0 then
flickerstreak@122 455 self.frames.icon:SetVertexColor(1.0,0.1,0.1)
flickerstreak@122 456 else
flickerstreak@122 457 self:UpdateUsable()
flickerstreak@122 458 end
flickerstreak@123 459 self.rangeTimer = TOOLTIP_UPDATE_TIME
flickerstreak@122 460 end
flickerstreak@122 461 end
flickerstreak@122 462 end
flickerstreak@122 463
flickerstreak@122 464 function Action:GetActionID(page)
flickerstreak@122 465 if page == nil then
flickerstreak@122 466 -- get the effective ID
flickerstreak@122 467 return self:GetFrame():GetAttribute("action")
flickerstreak@122 468 else
flickerstreak@122 469 if page == 1 then
flickerstreak@122 470 return self.config.actionID
flickerstreak@122 471 else
flickerstreak@122 472 return self.config.pageactions and self.config.pageactions[page] or self.config.actionID
flickerstreak@122 473 end
flickerstreak@122 474 end
flickerstreak@122 475 end
flickerstreak@122 476
flickerstreak@122 477 function Action:SetActionID( id, page )
flickerstreak@122 478 id = tonumber(id)
flickerstreak@122 479 page = tonumber(page)
flickerstreak@122 480 if id == nil or id < 1 or id > 120 then
flickerstreak@122 481 error("Action:SetActionID - invalid action ID")
flickerstreak@122 482 end
flickerstreak@122 483 if page and page ~= 1 then
flickerstreak@122 484 if not self.config.pageactions then
flickerstreak@122 485 self.config.pageactions = { }
flickerstreak@122 486 end
flickerstreak@122 487 self:ReleaseActionID(self.config.pageactions[page])
flickerstreak@122 488 self.config.pageactions[page] = id
flickerstreak@122 489 self:AcquireActionID(self.config.pageactions[page])
flickerstreak@122 490 self.frame:SetAttribute("action-page"..page,id)
flickerstreak@122 491 else
flickerstreak@122 492 self:ReleaseActionID(self.config.actionID)
flickerstreak@122 493 self.config.actionID = id
flickerstreak@122 494 self:AcquireActionID(self.config.actionID)
flickerstreak@122 495 self.frame:SetAttribute("action",id)
flickerstreak@122 496 self.frame:SetAttribute("default-action",id)
flickerstreak@122 497 if self.config.pageactions then
flickerstreak@122 498 self.config.pageactions[1] = id
flickerstreak@122 499 self.frame:SetAttribute("action-page1",id)
flickerstreak@122 500 end
flickerstreak@122 501 end
flickerstreak@122 502 end
flickerstreak@122 503
flickerstreak@122 504 function Action:RefreshPages( force )
flickerstreak@122 505 local nPages = self.bar:GetConfig().nPages
flickerstreak@122 506 if nPages and (nPages ~= self.nPages or force) then
flickerstreak@122 507 local f = self:GetFrame()
flickerstreak@122 508 local c = self.config.pageactions
flickerstreak@122 509 if nPages > 1 and not c then
flickerstreak@122 510 c = { }
flickerstreak@122 511 self.config.pageactions = c
flickerstreak@122 512 end
flickerstreak@122 513 for i = 1, nPages do
flickerstreak@122 514 if i > 1 then
flickerstreak@122 515 c[i] = self:AcquireActionID(c[i], self.config.actionID + (i-1)*self.bar:GetNumButtons())
flickerstreak@122 516 else
flickerstreak@122 517 c[i] = self.config.actionID -- page 1 is the same as the base actionID
flickerstreak@122 518 end
flickerstreak@122 519 f:SetAttribute(("action-page%d"):format(i),c[i])
flickerstreak@122 520 end
flickerstreak@122 521 for i = nPages+1, #c do
flickerstreak@122 522 self:ReleaseActionID(c[i])
flickerstreak@122 523 c[i] = nil
flickerstreak@122 524 f:SetAttribute(("action-page%d"):format(i),nil)
flickerstreak@122 525 end
flickerstreak@122 526 self.nPages = nPages
flickerstreak@122 527 end
flickerstreak@122 528 end
flickerstreak@122 529
flickerstreak@123 530 function Action.SetupBarHeader( bar ) -- call this as a static method
flickerstreak@122 531 local f = bar:GetFrame()
flickerstreak@122 532 local c = bar:GetConfig()
flickerstreak@122 533 f:SetAttribute("mindcontrol",c.mindcontrol)
flickerstreak@122 534 f:SetAttribute("vehicle",c.vehicle)
flickerstreak@122 535 f:Execute(
flickerstreak@122 536 [[
flickerstreak@122 537 doMindControl = self:GetAttribute("mindcontrol")
flickerstreak@122 538 doVehicle = self:GetAttribute("vehicle")
flickerstreak@122 539 control:ChildUpdate()
flickerstreak@122 540 ]])
flickerstreak@122 541
flickerstreak@122 542 f:SetAttribute("_onstate-mc", _onstate_mc)
flickerstreak@122 543 RegisterStateDriver(f, "mc", "[target=vehicle,exists] vehicle; [bonusbar:5] mc; none")
flickerstreak@122 544
flickerstreak@122 545 f:SetAttribute("lockbuttons",c.lockButtons)
flickerstreak@122 546 f:SetAttribute("lockbuttonscombat",c.lockButtonsCombat)
flickerstreak@122 547 f:Execute(
flickerstreak@122 548 [[
flickerstreak@122 549 lockButtons = self:GetAttribute("lockbuttons")
flickerstreak@122 550 lockButtonsCombat = self:GetAttribute("lockbuttonscombat")
flickerstreak@122 551 ]])
flickerstreak@122 552 end
flickerstreak@122 553
flickerstreak@122 554
flickerstreak@123 555 function Action.SetButtonLock( bar, lock, lockCombat ) -- call this as a static method
flickerstreak@123 556 local f = bar:GetFrame()
flickerstreak@123 557 f:SetAttribute("lockbuttons",lock)
flickerstreak@123 558 f:SetAttribute("lockbuttonscombat",lockCombat)
flickerstreak@123 559 f:Execute(
flickerstreak@123 560 [[
flickerstreak@123 561 lockButtons = self:GetAttribute("lockbuttons")
flickerstreak@123 562 lockButtonsCombat = self:GetAttribute("lockbuttonscombat")
flickerstreak@123 563 ]])
flickerstreak@123 564 end
flickerstreak@123 565
flickerstreak@123 566
flickerstreak@122 567 function Action:ShowVehicleExit(show)
flickerstreak@122 568 local f = self:GetFrame()
flickerstreak@122 569 local tx = f.vehicleExitTexture
flickerstreak@122 570 if show then
flickerstreak@122 571 if not tx then
flickerstreak@122 572 tx = f:CreateTexture(nil,"ARTWORK")
flickerstreak@122 573 tx:SetAllPoints()
flickerstreak@122 574 -- copied from Blizzard/VehicleMenuBar.lua SkinsData
flickerstreak@122 575 tx:SetTexture("Interface\\Vehicles\\UI-Vehicles-Button-Exit-Up")
flickerstreak@122 576 tx:SetTexCoord(0.140625, 0.859375, 0.140625, 0.859375)
flickerstreak@122 577 f.vehicleExitTexture = tx
flickerstreak@122 578 end
flickerstreak@122 579 tx:Show()
flickerstreak@122 580 f.vehicleExitMode = true
flickerstreak@122 581 elseif tx then
flickerstreak@122 582 tx:SetTexCoord(0,1,0,1)
flickerstreak@122 583 tx:Hide()
flickerstreak@122 584 f.vehicleExitMode = false
flickerstreak@122 585 end
flickerstreak@122 586 end
flickerstreak@122 587
flickerstreak@122 588 function Action:OnEnter( )
flickerstreak@122 589 self:SetTooltip()
flickerstreak@122 590 end
flickerstreak@122 591
flickerstreak@122 592 function Action:OnLeave( )
flickerstreak@122 593 GameTooltip:Hide()
flickerstreak@122 594 end
flickerstreak@122 595
flickerstreak@122 596 function Action:OnAttributeChanged( attr, value )
flickerstreak@122 597 self:UpdateAction()
flickerstreak@122 598 end
flickerstreak@122 599
flickerstreak@122 600 function Action:PostClick( )
flickerstreak@122 601 self:UpdateCheckedState()
flickerstreak@122 602 end
flickerstreak@122 603
flickerstreak@122 604 function Action:OnUpdate( elapsed )
flickerstreak@122 605 self:RunFlash(elapsed)
flickerstreak@122 606 self:RunRangeFinder(elapsed)
flickerstreak@122 607 end
flickerstreak@122 608
flickerstreak@122 609 function Action:OnDragStart()
flickerstreak@122 610 self:UpdateCheckedState()
flickerstreak@122 611 self:UpdateFlash()
flickerstreak@122 612 end
flickerstreak@122 613
flickerstreak@122 614 function Action:OnReceiveDrag()
flickerstreak@122 615 self:UpdateCheckedState()
flickerstreak@122 616 self:UpdateFlash()
flickerstreak@122 617 end
flickerstreak@122 618
flickerstreak@122 619 function Action:OnEvent(event, ...)
flickerstreak@122 620 if self[event] then
flickerstreak@122 621 self[event](self, event, ...)
flickerstreak@122 622 end
flickerstreak@122 623 end
flickerstreak@122 624
flickerstreak@122 625 function Action:ACTIONBAR_SLOT_CHANGED(event, action)
flickerstreak@122 626 if action == 0 or action == self.actionID then
flickerstreak@122 627 self:UpdateAction()
flickerstreak@122 628 end
flickerstreak@122 629 end
flickerstreak@122 630
flickerstreak@122 631 function Action:PLAYER_ENTERING_WORLD()
flickerstreak@122 632 self:UpdateAction()
flickerstreak@122 633 end
flickerstreak@122 634
flickerstreak@122 635 function Action:ACTIONBAR_PAGE_CHANGED()
flickerstreak@122 636 self:UpdateAction()
flickerstreak@122 637 end
flickerstreak@122 638
flickerstreak@122 639 function Action:UPDATE_BONUS_ACTIONBAR()
flickerstreak@122 640 self:UpdateAction()
flickerstreak@122 641 end
flickerstreak@122 642
flickerstreak@122 643 function Action:UPDATE_BINDINGS()
flickerstreak@122 644 self:UpdateHotkey()
flickerstreak@122 645 end
flickerstreak@122 646
flickerstreak@122 647 function Action:PLAYER_TARGET_CHANGED()
flickerstreak@122 648 self.rangeTimer = -1
flickerstreak@122 649 end
flickerstreak@122 650
flickerstreak@122 651 function Action:ACTIONBAR_UPDATE_STATE()
flickerstreak@122 652 self:UpdateCheckedState()
flickerstreak@122 653 end
flickerstreak@122 654 Action.TRADE_SKILL_SHOW = Action.ACTIONBAR_UPDATE_STATE
flickerstreak@122 655 Action.TRADE_SKILL_CLOSE = Action.ACTIONBAR_UPDATE_STATE
flickerstreak@122 656
flickerstreak@122 657 function Action:UNIT_ENTERED_VEHICLE(event,unit)
flickerstreak@122 658 if unit == "player" then
flickerstreak@122 659 self:UpdateCheckedState()
flickerstreak@122 660 end
flickerstreak@122 661 end
flickerstreak@122 662 Action.UNIT_EXITED_VEHICLE = Action.UNIT_ENTERED_VEHICLE
flickerstreak@122 663
flickerstreak@122 664 function Action:COMPANION_UPDATE(event,unit)
flickerstreak@122 665 if unit == "mount" then
flickerstreak@122 666 self:UpdateCheckedState()
flickerstreak@122 667 end
flickerstreak@122 668 end
flickerstreak@122 669
flickerstreak@122 670 function Action:ACTIONBAR_UPDATE_USABLE()
flickerstreak@122 671 self:UpdateUsable()
flickerstreak@122 672 end
flickerstreak@122 673
flickerstreak@122 674 function Action:ACTIONBAR_UPDATE_COOLDOWN()
flickerstreak@122 675 self:UpdateCooldown()
flickerstreak@122 676 end
flickerstreak@122 677
flickerstreak@122 678 function Action:PLAYER_ENTER_COMBAT()
flickerstreak@122 679 if IsAttackAction(self.actionID) then
flickerstreak@122 680 self:SetFlash(true)
flickerstreak@122 681 end
flickerstreak@122 682 end
flickerstreak@122 683
flickerstreak@122 684 function Action:PLAYER_LEAVE_COMBAT()
flickerstreak@122 685 if IsAttackAction(self.actionID) then
flickerstreak@122 686 self:SetFlash(false)
flickerstreak@122 687 end
flickerstreak@122 688 end
flickerstreak@122 689
flickerstreak@122 690 function Action:START_AUTOREPEAT_SPELL()
flickerstreak@122 691 if IsAutoRepeatAction(self.actionID) then
flickerstreak@122 692 self:SetFlash(true)
flickerstreak@122 693 end
flickerstreak@122 694 end
flickerstreak@122 695
flickerstreak@122 696 function Action:STOP_AUTOREPEAT_SPELL()
flickerstreak@122 697 if not IsAttackAction(self.actionID) then
flickerstreak@122 698 self:SetFlash(false)
flickerstreak@122 699 end
flickerstreak@122 700 end
flickerstreak@122 701
flickerstreak@122 702 function Action:PLAYER_REGEN_ENABLED()
flickerstreak@122 703 if self.showgridPending then
flickerstreak@122 704 self:UpdateShowGrid()
flickerstreak@122 705 end
flickerstreak@122 706 end