annotate ActionButton.lua @ 297:f7a5676c9517

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