annotate classes/ActionButton.lua @ 159:799c6ea9da7b

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