Files
coa-bartender/PetButton.lua
T
florian.berthold 57a5cdabdf ascension: 4.4.2 → vendored 4.4.2-2-g3b02ee4 (in-game AddOns dir)
Imported from /srv/add01/wow-ascension/Interface/AddOns/Bartender4 — the
build Ascension's WotLK 3.3.5 client ships.

Single vendored drop: Ascension's build process bundles their custom
patches with the standard CurseForge packager output (embedded libs),
and the individual patches aren't published separately.

Net delta vs Nevcairiel 4.4.2, excluding bundled libs and CRLF
normalization: 21 files, 2213+/52- — the Ascension-specific
adaptations for WotLK 3.3.5 hero classes / custom action systems.

License: All rights reserved (per .toc).
2026-05-08 03:45:58 +02:00

267 lines
7.2 KiB
Lua

--[[
Copyright (c) 2009, Hendrik "Nevcairiel" Leppkes < h.leppkes at gmail dot com >
All rights reserved.
]]
--[[
Pet Button template
]]
local PetButtonPrototype = CreateFrame("CheckButton")
local PetButton_MT = {__index = PetButtonPrototype}
local LBF = LibStub("LibButtonFacade", true)
local KeyBound = LibStub("LibKeyBound-1.0")
-- upvalues
local _G = _G
local format = string.format
local function onEnter(self, ...)
if not (Bartender4.db.profile.tooltip == "nocombat" and InCombatLockdown()) and Bartender4.db.profile.tooltip ~= "disabled" then
self:OnEnter(...)
end
KeyBound:Set(self)
end
local function onDragStart(self)
if InCombatLockdown() then return end
if not Bartender4.db.profile.buttonlock or IsModifiedClick("PICKUPACTION") then
self:SetChecked(0)
PickupPetAction(self.id)
self:Update()
end
end
local function onReceiveDrag(self)
if InCombatLockdown() then return end
self:SetChecked(0)
PickupPetAction(self.id)
self:Update()
end
Bartender4.PetButton = {}
Bartender4.PetButton.prototype = PetButtonPrototype
function Bartender4.PetButton:Create(id, parent)
local name = "BT4PetButton" .. id
local button = setmetatable(CreateFrame("CheckButton", name, parent, "PetActionButtonTemplate"), PetButton_MT)
button.showgrid = 0
button.id = id
button.parent = parent
button:SetFrameStrata("MEDIUM")
button:SetID(id)
button:UnregisterAllEvents()
button:SetScript("OnEvent", nil)
button.OnEnter = button:GetScript("OnEnter")
button:SetScript("OnEnter", onEnter)
button:SetScript("OnDragStart", onDragStart)
button:SetScript("OnReceiveDrag", onReceiveDrag)
button.flash = _G[name .. "Flash"]
button.cooldown = _G[name .. "Cooldown"]
button.icon = _G[name .. "Icon"]
button.autocastable = _G[name .. "AutoCastable"]
button.autocast = _G[name .. "Shine"]
button.hotkey = _G[name .. "HotKey"]
button:SetNormalTexture("")
local oldNT = button:GetNormalTexture()
oldNT:Hide()
button.normalTexture = button:CreateTexture(("%sBTNT"):format(name))
button.normalTexture:SetAllPoints(oldNT)
button.pushedTexture = button:GetPushedTexture()
button.highlightTexture = button:GetHighlightTexture()
button.textureCache = {}
button.textureCache.pushed = button.pushedTexture:GetTexture()
button.textureCache.highlight = button.highlightTexture:GetTexture()
if LBF then
local group = parent.LBFGroup
button.LBFButtonData = {
Button = button,
Normal = button.normalTexture,
}
group:AddButton(button, button.LBFButtonData)
end
return button
end
function PetButtonPrototype:Update()
local name, subtext, texture, isToken, isActive, autoCastAllowed, autoCastEnabled = GetPetActionInfo(self.id)
if not isToken then
self.icon:SetTexture(texture)
self.tooltipName = name;
else
self.icon:SetTexture(_G[texture])
self.tooltipName = _G[name]
end
self.isToken = isToken
self.tooltipSubtext = subtext
self:SetChecked(isActive and 1 or 0)
if autoCastAllowed and not autoCastEnabled then
self.autocastable:Show()
AutoCastShine_AutoCastStop(self.autocast)
elseif autoCastAllowed then
self.autocastable:Hide()
AutoCastShine_AutoCastStart(self.autocast)
else
self.autocastable:Hide()
AutoCastShine_AutoCastStop(self.autocast)
end
if texture then
if GetPetActionsUsable() then
SetDesaturation(self.icon, nil)
else
SetDesaturation(self.icon, 1)
end
self.icon:Show()
self.normalTexture:SetTexture("Interface\\Buttons\\UI-Quickslot2")
self.normalTexture:SetTexCoord(0, 0, 0, 0)
self:ShowButton()
self.normalTexture:Show()
if self.overlay then
self.overlay:Show()
end
else
self.icon:Hide()
self.normalTexture:SetTexture("Interface\\Buttons\\UI-Quickslot")
self.normalTexture:SetTexCoord(-0.1, 1.1, -0.1, 1.12)
self:HideButton()
if self.showgrid == 0 and not self.parent.config.showgrid then
self.normalTexture:Hide()
if self.overlay then
self.overlay:Hide()
end
end
end
self:UpdateCooldown()
self:UpdateHotkeys()
end
function PetButtonPrototype:UpdateHotkeys()
local key = self:GetHotkey() or ""
local hotkey = self.hotkey
if key == "" or self.parent.config.hidehotkey then
hotkey:Hide()
else
hotkey:SetText(key)
hotkey:Show()
end
end
function PetButtonPrototype:ShowButton()
self.pushedTexture:SetTexture(self.textureCache.pushed)
self.highlightTexture:SetTexture(self.textureCache.highlight)
if LBF then
local backdrop, gloss = LBF:GetBackdropLayer(self), LBF:GetGlossLayer(self)
if backdrop then
backdrop:Show()
end
if gloss then
gloss:Show()
end
end
end
function PetButtonPrototype:HideButton()
self.textureCache.pushed = self.pushedTexture:GetTexture()
self.textureCache.highlight = self.highlightTexture:GetTexture()
self.pushedTexture:SetTexture("")
self.highlightTexture:SetTexture("")
if LBF then
local backdrop, gloss = LBF:GetBackdropLayer(self), LBF:GetGlossLayer(self)
if backdrop then
backdrop:Hide()
end
if gloss then
gloss:Hide()
end
end
end
function PetButtonPrototype:ShowGrid()
self.showgrid = self.showgrid + 1
self.normalTexture:Show()
end
function PetButtonPrototype:HideGrid()
if self.showgrid > 0 then self.showgrid = self.showgrid - 1 end
if self.showgrid == 0 and not (GetPetActionInfo(self.id)) and not self.parent.config.showgrid then
self.normalTexture:Hide()
end
end
function PetButtonPrototype:UpdateCooldown()
local start, duration, enable = GetPetActionCooldown(self.id)
CooldownFrame_SetTimer(self.cooldown, start, duration, enable)
end
function PetButtonPrototype:GetHotkey()
local key = GetBindingKey(format("BONUSACTIONBUTTON%d", self.id)) or GetBindingKey("CLICK "..self:GetName()..":LeftButton")
return key and KeyBound:ToShortKey(key)
end
function PetButtonPrototype:GetBindings()
local keys, binding = ""
binding = format("BONUSACTIONBUTTON%d", self.id)
for i = 1, select('#', GetBindingKey(binding)) do
local hotKey = select(i, GetBindingKey(binding))
if keys ~= "" then
keys = keys .. ', '
end
keys = keys .. GetBindingText(hotKey,'KEY_')
end
binding = "CLICK "..self:GetName()..":LeftButton"
for i = 1, select('#', GetBindingKey(binding)) do
local hotKey = select(i, GetBindingKey(binding))
if keys ~= "" then
keys = keys .. ', '
end
keys = keys.. GetBindingText(hotKey,'KEY_')
end
return keys
end
function PetButtonPrototype:SetKey(key)
SetBinding(key, format("BONUSACTIONBUTTON%d", self.id))
end
function PetButtonPrototype:ClearBindings()
local binding = format("BONUSACTIONBUTTON%d", self:GetID())
while GetBindingKey(binding) do
SetBinding(GetBindingKey(binding), nil)
end
binding = "CLICK "..self:GetName()..":LeftButton"
while GetBindingKey(binding) do
SetBinding(GetBindingKey(binding), nil)
end
end
local actionTmpl = "Pet Button %d (%s)"
function PetButtonPrototype:GetActionName()
local id = self.id
local name, _, _, token = GetPetActionInfo(id)
if token and name then name = _G[name] end
return format(actionTmpl, id, name or "empty")
end
function PetButtonPrototype:ClearSetPoint(...)
self:ClearAllPoints()
self:SetPoint(...)
end