Mercurial > wow > reaction
comparison modules/PetAction.lua @ 130:6e4a11b9d290
Converted PetAction to new class layout
| author | Flick <flickerstreak@gmail.com> |
|---|---|
| date | Fri, 06 Mar 2009 23:44:55 +0000 |
| parents | fb48811a8736 |
| children | 901c91dc1bf2 |
comparison
equal
deleted
inserted
replaced
| 129:28b430de5875 | 130:6e4a11b9d290 |
|---|---|
| 20 | 20 |
| 21 -- module declaration | 21 -- module declaration |
| 22 local moduleID = "PetAction" | 22 local moduleID = "PetAction" |
| 23 local module = ReAction:NewModule( moduleID ) | 23 local module = ReAction:NewModule( moduleID ) |
| 24 | 24 |
| 25 -- Button class declaration | 25 -- Button class |
| 26 local Button = { } | 26 local Button = ReAction.Button.PetAction |
| 27 | 27 |
| 28 -- private | 28 -- private |
| 29 local function UpdateButtonLock(bar) | 29 local function UpdateButtonLock(bar) |
| 30 local f = bar:GetFrame() | 30 local f = bar:GetFrame() |
| 31 f:SetAttribute("lockbuttons",bar.config.lockButtons) | 31 f:SetAttribute("lockbuttons",bar.config.lockButtons) |
| 105 for i = 1, n do | 105 for i = 1, n do |
| 106 if btnCfg[i] == nil then | 106 if btnCfg[i] == nil then |
| 107 btnCfg[i] = {} | 107 btnCfg[i] = {} |
| 108 end | 108 end |
| 109 if btns[i] == nil then | 109 if btns[i] == nil then |
| 110 local success, r = pcall(Button.New,Button,bar,i,btnCfg[i]) | 110 local success, r = pcall(Button.New,Button,i,btnCfg[i],bar,i>1 and btnCfg[i-1].actionID) |
| 111 if success and r then | 111 if success and r then |
| 112 btns[i] = r | 112 btns[i] = r |
| 113 bar:AddButton(i,r) | 113 bar:AddButton(i,r) |
| 114 else | 114 else |
| 115 n = i - 1 | 115 n = i - 1 |
| 153 b[newname], b[oldname] = b[oldname], nil | 153 b[newname], b[oldname] = b[oldname], nil |
| 154 end | 154 end |
| 155 | 155 |
| 156 | 156 |
| 157 function module:OnConfigModeChanged(event, mode) | 157 function module:OnConfigModeChanged(event, mode) |
| 158 for _, buttons in pairs(self.buttons) do | |
| 159 for _, b in pairs(buttons) do | |
| 160 b:ShowActionIDLabel(mode) | |
| 161 end | |
| 162 end | |
| 163 for _, bar in ReAction:IterateBars() do | 158 for _, bar in ReAction:IterateBars() do |
| 164 if bar and self.buttons[bar] then | 159 if bar and self.buttons[bar] then |
| 160 for b in bar:IterateButtons() do | |
| 161 b:UpdateActionIDLabel(mode) | |
| 162 end | |
| 165 local f = bar:GetFrame() | 163 local f = bar:GetFrame() |
| 166 if mode then | 164 if mode then |
| 167 UnregisterUnitWatch(f) | 165 UnregisterUnitWatch(f) |
| 168 f:Show() | 166 f:Show() |
| 169 else | 167 else |
| 201 config = bar.config | 199 config = bar.config |
| 202 }, meta) | 200 }, meta) |
| 203 end | 201 end |
| 204 | 202 |
| 205 function Handler:GetLockButtons() | 203 function Handler:GetLockButtons() |
| 206 return LOCK_ACTIONBAR == "1" or self.config.lockButtons | 204 return self.config.lockButtons |
| 207 end | 205 end |
| 208 | 206 |
| 209 function Handler:SetLockButtons(info, value) | 207 function Handler:SetLockButtons(info, value) |
| 210 self.config.lockButtons = value | 208 self.config.lockButtons = value |
| 211 UpdateButtonLock(self.bar) | 209 UpdateButtonLock(self.bar) |
| 212 end | 210 end |
| 213 | 211 |
| 214 function Handler:LockButtonsDisabled() | |
| 215 return LOCK_ACTIONBAR == "1" | |
| 216 end | |
| 217 | |
| 218 function Handler:GetLockButtonsCombat() | 212 function Handler:GetLockButtonsCombat() |
| 219 return self.config.lockButtonsCombat | 213 return self.config.lockButtonsCombat |
| 220 end | 214 end |
| 221 | 215 |
| 222 function Handler:SetLockButtonsCombat(info, value) | 216 function Handler:SetLockButtonsCombat(info, value) |
| 223 self.config.lockButtonsCombat = value | 217 self.config.lockButtonsCombat = value |
| 224 UpdateButtonLock(self.bar) | 218 UpdateButtonLock(self.bar) |
| 225 end | 219 end |
| 226 | 220 |
| 227 function Handler:LockButtonsCombatDisabled() | 221 function Handler:LockButtonsCombatDisabled() |
| 228 return LOCK_ACTIONBAR == "1" or not self.config.lockButtons | 222 return not self.config.lockButtons |
| 229 end | 223 end |
| 230 | 224 |
| 231 | 225 |
| 232 function module:GetBarOptions(bar) | 226 function module:GetBarOptions(bar) |
| 233 if bar.config.type == moduleID then | 227 if bar.config.type == moduleID then |
| 239 lockButtons = { | 233 lockButtons = { |
| 240 name = L["Lock Buttons"], | 234 name = L["Lock Buttons"], |
| 241 desc = L["Prevents picking up/dragging actions.|nNOTE: This setting is overridden by the global setting in Blizzard's Action Buttons tab"], | 235 desc = L["Prevents picking up/dragging actions.|nNOTE: This setting is overridden by the global setting in Blizzard's Action Buttons tab"], |
| 242 order = 2, | 236 order = 2, |
| 243 type = "toggle", | 237 type = "toggle", |
| 244 disabled = "LockButtonsDisabled", | |
| 245 get = "GetLockButtons", | 238 get = "GetLockButtons", |
| 246 set = "SetLockButtons", | 239 set = "SetLockButtons", |
| 247 }, | 240 }, |
| 248 lockOnlyCombat = { | 241 lockOnlyCombat = { |
| 249 name = L["Only in Combat"], | 242 name = L["Only in Combat"], |
| 258 } | 251 } |
| 259 end | 252 end |
| 260 end | 253 end |
| 261 | 254 |
| 262 | 255 |
| 263 | |
| 264 ------ Button class ------ | |
| 265 | |
| 266 -- use-count of action IDs | |
| 267 local nActionIDs = NUM_PET_ACTION_SLOTS | |
| 268 local ActionIDList = setmetatable( {}, { | |
| 269 __index = function(self, idx) | |
| 270 if idx == nil then | |
| 271 for i = 1, nActionIDs do | |
| 272 if rawget(self,i) == nil then | |
| 273 rawset(self,i,1) | |
| 274 return i | |
| 275 end | |
| 276 end | |
| 277 error("ran out of pet action IDs") | |
| 278 else | |
| 279 local c = rawget(self,idx) or 0 | |
| 280 rawset(self,idx,c+1) | |
| 281 return idx | |
| 282 end | |
| 283 end, | |
| 284 __newindex = function(self,idx,value) | |
| 285 if value == nil then | |
| 286 value = rawget(self,idx) | |
| 287 if value == 1 then | |
| 288 value = nil | |
| 289 elseif value then | |
| 290 value = value - 1 | |
| 291 end | |
| 292 end | |
| 293 rawset(self,idx,value) | |
| 294 end | |
| 295 }) | |
| 296 | |
| 297 local frameRecycler = {} | |
| 298 local trash = CreateFrame("Frame") | |
| 299 | |
| 300 local function GetActionName(f) | |
| 301 local b = f and f._reactionButton | |
| 302 if b then | |
| 303 return format("%s:%s", b.bar:GetName(), b.idx) | |
| 304 end | |
| 305 end | |
| 306 | |
| 307 local function GetHotkey(f) | |
| 308 return KB:ToShortKey(GetBindingKey(format("CLICK %s:LeftButton",f:GetName()))) | |
| 309 end | |
| 310 | |
| 311 local function OnEnter( self ) | |
| 312 if ReAction:GetKeybindMode() then | |
| 313 KB:Set(self) | |
| 314 elseif self.tooltipName then | |
| 315 local uber = GetCVar("UberTooltips") | |
| 316 if self.isToken or (uber == "0") then | |
| 317 if uber == "0" then | |
| 318 GameTooltip:SetOwner(self, "ANCHOR_RIGHT") | |
| 319 else | |
| 320 GameTooltip_SetDefaultAnchor(GameTooltip, self) | |
| 321 end | |
| 322 GameTooltip:SetText(self.tooltipName) | |
| 323 if self.tooltipSubtext then | |
| 324 GameTooltip:AddLine(self.tooltipSubtext, "", 0.5, 0.5, 0.5) | |
| 325 end | |
| 326 GameTooltip:Show() | |
| 327 else | |
| 328 GameTooltip_SetDefaultAnchor(GameTooltip, self) | |
| 329 GameTooltip:SetPetAction(self:GetID()) | |
| 330 end | |
| 331 end | |
| 332 end | |
| 333 | |
| 334 local function OnLeave() | |
| 335 GameTooltip:Hide() | |
| 336 end | |
| 337 | |
| 338 local meta = { __index = Button } | |
| 339 | |
| 340 function Button:New( bar, idx, config ) | |
| 341 -- create new self | |
| 342 self = setmetatable( | |
| 343 { | |
| 344 bar = bar, | |
| 345 idx = idx, | |
| 346 config = config, | |
| 347 }, meta ) | |
| 348 | |
| 349 local name = config.name or ("ReAction_%s_%s_%d"):format(bar:GetName(),moduleID,idx) | |
| 350 config.name = name | |
| 351 self.name = name | |
| 352 config.actionID = ActionIDList[config.actionID] -- gets a free one if none configured | |
| 353 | |
| 354 -- have to recycle frames with the same name: | |
| 355 -- otherwise you either get references to old textures because named CreateFrame() | |
| 356 -- doesn't overwrite existing globals. Can't set them to nil in the global table, | |
| 357 -- as it causes taint. | |
| 358 local parent = bar:GetFrame() | |
| 359 local f = frameRecycler[name] | |
| 360 if f then | |
| 361 f:SetParent(parent) | |
| 362 else | |
| 363 f = CreateFrame("CheckButton", name, parent, "PetActionButtonTemplate") | |
| 364 -- ditch the old hotkey text because it's tied in ActionButton_Update() to the | |
| 365 -- standard binding. We use override bindings. | |
| 366 local hotkey = _G[name.."HotKey"] | |
| 367 hotkey:SetParent(trash) | |
| 368 hotkey = f:CreateFontString(nil, "ARTWORK", "NumberFontNormalSmallGray") | |
| 369 hotkey:SetWidth(36) | |
| 370 hotkey:SetHeight(18) | |
| 371 hotkey:SetJustifyH("RIGHT") | |
| 372 hotkey:SetJustifyV("TOP") | |
| 373 hotkey:SetPoint("TOPLEFT",f,"TOPLEFT",-2,-2) | |
| 374 f.hotkey = hotkey | |
| 375 f:HookScript("OnDragStart", function() self:Update() end) | |
| 376 f:HookScript("OnReceiveDrag", function() self:Update() end) | |
| 377 f:SetScript("OnEnter", OnEnter) | |
| 378 f:SetScript("OnLeave", OnLeave) | |
| 379 end | |
| 380 if config.actionID then | |
| 381 f:SetID(config.actionID) -- PetActionButtonTemplate isn't a proper SecureActionButton | |
| 382 end | |
| 383 f:SetFrameStrata("MEDIUM") | |
| 384 self.frame = f | |
| 385 self.icon = _G[("%sIcon"):format(name)] | |
| 386 self.acTex = _G[("%sAutoCastable"):format(name)] | |
| 387 self.acModel = _G[("%sShine"):format(name)] | |
| 388 self.cooldown = _G[("%sCooldown"):format(name)] | |
| 389 self.hotkey = f.hotkey | |
| 390 self.border = _G[("%sBorder"):format(name)] | |
| 391 | |
| 392 f._reactionButton = self | |
| 393 | |
| 394 f:RegisterEvent("PLAYER_CONTROL_LOST") | |
| 395 f:RegisterEvent("PLAYER_CONTROL_GAINED") | |
| 396 f:RegisterEvent("PLAYER_FARSIGHT_FOCUS_CHANGED") | |
| 397 f:RegisterEvent("UNIT_PET") | |
| 398 f:RegisterEvent("UNIT_FLAGS") | |
| 399 f:RegisterEvent("UNIT_AURA") | |
| 400 f:RegisterEvent("PET_BAR_UPDATE") | |
| 401 f:RegisterEvent("PET_BAR_UPDATE_COOLDOWN") | |
| 402 | |
| 403 f:SetScript("OnEvent", | |
| 404 function(event,arg1) | |
| 405 if event =="PET_BAR_UPDATE_COOLDOWN" then | |
| 406 self:UpdateCooldown() | |
| 407 elseif event == "UPDATE_BINDINGS" then | |
| 408 self:UpdateHotkey() | |
| 409 else | |
| 410 self:Update() | |
| 411 end | |
| 412 end) | |
| 413 | |
| 414 -- install drag wrappers to lock buttons | |
| 415 bar:GetFrame():WrapScript(f, "OnDragStart", | |
| 416 -- OnDragStart(self, button, kind, value, ...) | |
| 417 [[ | |
| 418 if lockButtons and (PlayerInCombat() or not lockButtonsCombat) and not IsModifiedClick("PICKUPACTION") then | |
| 419 return "clear" | |
| 420 end | |
| 421 ]]) | |
| 422 | |
| 423 -- attach to skinner | |
| 424 bar:SkinButton(self, | |
| 425 { | |
| 426 HotKey = self.hotkey, | |
| 427 } | |
| 428 ) | |
| 429 | |
| 430 self:Refresh() | |
| 431 self:UpdateHotkey() | |
| 432 self:SetKeybindMode(ReAction:GetKeybindMode()) | |
| 433 | |
| 434 return self | |
| 435 end | |
| 436 | |
| 437 function Button:Destroy() | |
| 438 local f = self.frame | |
| 439 f:UnregisterAllEvents() | |
| 440 f:Hide() | |
| 441 f:SetParent(UIParent) | |
| 442 f:ClearAllPoints() | |
| 443 if self.name then | |
| 444 frameRecycler[self.name] = f | |
| 445 _G[self.name] = nil | |
| 446 end | |
| 447 if self.config.actionID then | |
| 448 ActionIDList[self.config.actionID] = nil | |
| 449 end | |
| 450 f._reactionButton = nil | |
| 451 self.frame = nil | |
| 452 self.config = nil | |
| 453 self.bar = nil | |
| 454 end | |
| 455 | |
| 456 function Button:Refresh() | |
| 457 self.bar:PlaceButton(self, 30, 30) | |
| 458 self:Update() | |
| 459 self:UpdateHotkey() | |
| 460 self.frame:Show() | |
| 461 end | |
| 462 | |
| 463 function Button:GetFrame() | |
| 464 return self.frame | |
| 465 end | |
| 466 | |
| 467 function Button:GetName() | |
| 468 return self.name | |
| 469 end | |
| 470 | |
| 471 function Button:GetConfig() | |
| 472 return self.config | |
| 473 end | |
| 474 | |
| 475 function Button:GetActionID() | |
| 476 return self.config.actionID | |
| 477 end | |
| 478 | |
| 479 function Button:Update() | |
| 480 local id = self.frame:GetID() | |
| 481 local name, subtext, texture, isToken, isActive, autoCastAllowed, autoCastEnabled = GetPetActionInfo(id) | |
| 482 local f = self.frame | |
| 483 | |
| 484 if isToken then | |
| 485 self.icon:SetTexture(_G[texture]) | |
| 486 f.tooltipName = _G[name] | |
| 487 else | |
| 488 self.icon:SetTexture(texture) | |
| 489 f.tooltipName = name | |
| 490 end | |
| 491 | |
| 492 f.isToken = isToken | |
| 493 f.tooltipSubtext = subtext | |
| 494 f:SetChecked( isActive and 1 or 0) | |
| 495 | |
| 496 if autoCastAllowed then | |
| 497 self.acTex:Show() | |
| 498 else | |
| 499 self.acTex:Hide() | |
| 500 end | |
| 501 | |
| 502 if autoCastEnabled then | |
| 503 AutoCastShine_AutoCastStart(self.acModel) | |
| 504 else | |
| 505 AutoCastShine_AutoCastStop(self.acModel) | |
| 506 end | |
| 507 | |
| 508 if texture then | |
| 509 if GetPetActionSlotUsable(id) then | |
| 510 SetDesaturation(self.icon,nil) | |
| 511 else | |
| 512 SetDesaturation(self.icon,1) | |
| 513 end | |
| 514 self.icon:Show() | |
| 515 f:SetNormalTexture("Interface\\Buttons\\UI-Quickslot2") | |
| 516 else | |
| 517 self.icon:Hide() | |
| 518 f:SetNormalTexture("Interface\\Buttons\\UI-Quickslot") | |
| 519 end | |
| 520 | |
| 521 self:UpdateCooldown() | |
| 522 end | |
| 523 | |
| 524 function Button:UpdateCooldown() | |
| 525 local start, duration, enable = GetPetActionCooldown(self.frame:GetID()) | |
| 526 CooldownFrame_SetTimer(self.cooldown, start, duration, enable) | |
| 527 end | |
| 528 | |
| 529 function Button:UpdateHotkey() | |
| 530 self.hotkey:SetText(GetHotkey(self.frame) or "") | |
| 531 end | |
| 532 | |
| 533 function Button:ShowActionIDLabel(show) | |
| 534 if show then | |
| 535 -- store the action ID label in the frame due to frame recycling | |
| 536 if not self.actionIDLabel and self:GetActionID() then | |
| 537 local label = self.frame:CreateFontString(nil,"OVERLAY","GameFontNormalLarge") | |
| 538 label:SetAllPoints() | |
| 539 label:SetJustifyH("CENTER") | |
| 540 label:SetShadowColor(0,0,0,1) | |
| 541 label:SetShadowOffset(2,-2) | |
| 542 label:SetText(tostring(self:GetActionID())) | |
| 543 self.actionIDLabel = label | |
| 544 end | |
| 545 self.actionIDLabel:Show() | |
| 546 elseif self.actionIDLabel then | |
| 547 self.actionIDLabel:Hide() | |
| 548 end | |
| 549 end | |
| 550 | |
| 551 | |
| 552 function Button:SetKeybindMode(mode) | |
| 553 if mode then | |
| 554 local f = self.frame | |
| 555 f.GetActionName = GetActionName | |
| 556 f.GetHotkey = GetHotkey | |
| 557 self.border:SetVertexColor(KB:GetColorKeyBoundMode()) | |
| 558 self.border:Show() | |
| 559 else | |
| 560 self.border:Hide() | |
| 561 end | |
| 562 end | |
| 563 |
