ElvUI/Modules/ActionBars/PetBar.lua

259 lines
7.4 KiB
Lua
Raw Permalink Normal View History

2020-11-13 14:27:50 -05:00
local E, L, V, P, G = unpack(select(2, ...)); --Import: Engine, Locales, PrivateDB, ProfileDB, GlobalDB
local AB = E:GetModule('ActionBars')
local _G = _G
local gsub = gsub
local ipairs = ipairs
local CreateFrame = CreateFrame
local RegisterStateDriver = RegisterStateDriver
local GetBindingKey = GetBindingKey
local PetHasActionBar = PetHasActionBar
local GetPetActionInfo = GetPetActionInfo
local IsPetAttackAction = IsPetAttackAction
local PetActionButton_StartFlash = PetActionButton_StartFlash
local PetActionButton_StopFlash = PetActionButton_StopFlash
local AutoCastShine_AutoCastStart = AutoCastShine_AutoCastStart
local AutoCastShine_AutoCastStop = AutoCastShine_AutoCastStop
local PetActionBar_ShowGrid = PetActionBar_ShowGrid
local PetActionBar_UpdateCooldowns = PetActionBar_UpdateCooldowns
local NUM_PET_ACTION_SLOTS = NUM_PET_ACTION_SLOTS
local Masque = E.Masque
local MasqueGroup = Masque and Masque:Group('ElvUI', 'Pet Bar')
local bar = CreateFrame('Frame', 'ElvUI_BarPet', E.UIParent, 'SecureHandlerStateTemplate')
bar:SetFrameStrata('LOW')
bar.buttons = {}
function AB:UpdatePet(event, unit)
if event == 'UNIT_AURA' and unit ~= 'pet' then return end
for i = 1, NUM_PET_ACTION_SLOTS, 1 do
local name, texture, isToken, isActive, autoCastAllowed, autoCastEnabled, spellID = GetPetActionInfo(i)
local buttonName = 'PetActionButton'..i
local autoCast = _G[buttonName..'AutoCastable']
local button = _G[buttonName]
button:SetAlpha(1)
button.isToken = isToken
button.icon:Show()
if not isToken then
button.icon:SetTexture(texture)
button.tooltipName = name
else
button.icon:SetTexture(_G[texture])
button.tooltipName = _G[name]
end
if spellID then
local spell = _G.Spell:CreateFromSpellID(spellID)
button.spellDataLoadedCancelFunc = spell:ContinueWithCancelOnSpellLoad(function()
button.tooltipSubtext = spell:GetSpellSubtext()
end)
end
if isActive and name ~= 'PET_ACTION_FOLLOW' then
button:SetChecked(true)
if IsPetAttackAction(i) then
PetActionButton_StartFlash(button)
end
else
button:SetChecked(false)
if IsPetAttackAction(i) then
PetActionButton_StopFlash(button)
end
end
if autoCastAllowed then
autoCast:Show()
else
autoCast:Hide()
end
if autoCastEnabled then
AutoCastShine_AutoCastStart(button.AutoCastShine)
else
AutoCastShine_AutoCastStop(button.AutoCastShine)
end
if not PetHasActionBar() and texture and name ~= 'PET_ACTION_FOLLOW' then
PetActionButton_StopFlash(button)
button.icon:SetDesaturation(true)
button:SetChecked(false)
end
end
end
function AB:PositionAndSizeBarPet()
local db = AB.db.barPet
local buttonSpacing = db.buttonspacing
local backdropSpacing = db.backdropSpacing
local buttonsPerRow = db.buttonsPerRow
local numButtons = db.buttons
local buttonWidth = db.buttonsize
local buttonHeight = db.keepSizeRatio and db.buttonsize or db.buttonHeight
local point = db.point
local visibility = db.visibility
local autoCastWidth = (buttonWidth / 2) - (buttonWidth / 7.5)
local autoCastHeight = (buttonHeight / 2) - (buttonHeight / 7.5)
bar.db = db
bar.mouseover = db.mouseover
if numButtons < buttonsPerRow then buttonsPerRow = numButtons end
if db.enabled then
bar:SetScale(1)
bar:SetAlpha(bar.db.alpha)
E:EnableMover(bar.mover:GetName())
else
bar:SetScale(0.0001)
bar:SetAlpha(0)
E:DisableMover(bar.mover:GetName())
end
bar:SetParent(db.inheritGlobalFade and AB.fadeParent or E.UIParent)
bar:EnableMouse(not db.clickThrough)
bar:SetAlpha(bar.mouseover and 0 or db.alpha)
AB:FadeBarBlings(bar, bar.mouseover and 0 or db.alpha)
bar.backdrop:SetShown(db.backdrop)
bar.backdrop:ClearAllPoints()
AB:MoverMagic(bar)
local _, horizontal, anchorUp, anchorLeft = AB:GetGrowth(point)
local button, lastButton, lastColumnButton, anchorRowButton, lastShownButton, autoCast
for i = 1, NUM_PET_ACTION_SLOTS do
button = _G['PetActionButton'..i]
lastButton = _G['PetActionButton'..i-1]
autoCast = _G['PetActionButton'..i..'AutoCastable']
lastColumnButton = _G['PetActionButton'..i-buttonsPerRow]
button.db = db
bar.buttons[i] = button
if i == 1 or i == buttonsPerRow then
anchorRowButton = button
end
if i > numButtons then
button:SetScale(0.0001)
button:SetAlpha(0)
button.handleBackdrop = nil
else
button:SetScale(1)
button:SetAlpha(bar.db.alpha)
lastShownButton = button
button.handleBackdrop = true -- keep over HandleButton
end
autoCast:SetOutside(button, autoCastWidth, autoCastHeight)
AB:HandleButton(bar, button, i, lastButton, lastColumnButton)
AB:StyleButton(button, nil, MasqueGroup and E.private.actionbar.masque.petBar)
end
AB:HandleBackdropMultiplier(bar, backdropSpacing, buttonSpacing, db.widthMult, db.heightMult, anchorUp, anchorLeft, horizontal, lastShownButton, anchorRowButton)
AB:HandleBackdropMover(bar, backdropSpacing)
visibility = gsub(visibility, '[\n\r]','')
RegisterStateDriver(bar, 'show', visibility)
if MasqueGroup and E.private.actionbar.masque.petBar then
MasqueGroup:ReSkin()
for _, btn in ipairs(bar.buttons) do
AB:TrimIcon(btn, true)
end
end
end
function AB:UpdatePetCooldownSettings()
for i = 1, NUM_PET_ACTION_SLOTS do
local button = _G['PetActionButton'..i]
if button and button.cooldown then
button.cooldown:SetDrawBling(not AB.db.hideCooldownBling)
end
end
end
function AB:UpdatePetBindings()
for i = 1, NUM_PET_ACTION_SLOTS do
if AB.db.hotkeytext then
local key = GetBindingKey('BONUSACTIONBUTTON'..i)
_G['PetActionButton'..i..'HotKey']:Show()
_G['PetActionButton'..i..'HotKey']:SetText(key)
AB:FixKeybindText(_G['PetActionButton'..i])
else
_G['PetActionButton'..i..'HotKey']:Hide()
end
end
end
function AB:CreateBarPet()
bar.backdrop = CreateFrame('Frame', nil, bar, 'BackdropTemplate')
bar.backdrop:SetTemplate(AB.db.transparent and 'Transparent')
bar.backdrop:SetFrameLevel(0)
if AB.db.bar4.enabled then
bar:Point('RIGHT', _G.ElvUI_Bar4, 'LEFT', -4, 0)
else
bar:Point('RIGHT', E.UIParent, 'RIGHT', -4, 0)
end
bar:SetAttribute('_onstate-show', [[
if newstate == 'hide' then
self:Hide()
else
self:Show()
end
]])
bar:SetScript('OnHide', function()
for i = 1, NUM_PET_ACTION_SLOTS, 1 do
local button = _G['PetActionButton'..i]
if button.spellDataLoadedCancelFunc then
button.spellDataLoadedCancelFunc()
button.spellDataLoadedCancelFunc = nil
end
end
end)
_G.PetActionBarFrame.showgrid = 1
PetActionBar_ShowGrid()
AB:RegisterEvent('PET_BAR_UPDATE', 'UpdatePet')
AB:RegisterEvent('PLAYER_CONTROL_GAINED', 'UpdatePet')
AB:RegisterEvent('PLAYER_CONTROL_LOST', 'UpdatePet')
AB:RegisterEvent('PLAYER_ENTERING_WORLD', 'UpdatePet')
AB:RegisterEvent('PLAYER_FARSIGHT_FOCUS_CHANGED', 'UpdatePet')
AB:RegisterEvent('SPELLS_CHANGED', 'UpdatePet')
AB:RegisterEvent('UNIT_FLAGS', 'UpdatePet')
AB:RegisterEvent('UNIT_PET', 'UpdatePet')
AB:RegisterEvent('PET_BAR_UPDATE_COOLDOWN', PetActionBar_UpdateCooldowns)
E:CreateMover(bar, 'PetAB', L["Pet Bar"], nil, nil, nil, 'ALL,ACTIONBARS', nil, 'actionbar,barPet')
AB:PositionAndSizeBarPet()
AB:UpdatePetBindings()
AB:HookScript(bar, 'OnEnter', 'Bar_OnEnter')
AB:HookScript(bar, 'OnLeave', 'Bar_OnLeave')
for i = 1, NUM_PET_ACTION_SLOTS do
local button = _G['PetActionButton'..i]
AB:HookScript(button, 'OnEnter', 'Button_OnEnter')
AB:HookScript(button, 'OnLeave', 'Button_OnLeave')
if MasqueGroup and E.private.actionbar.masque.petBar then
MasqueGroup:AddButton(button)
end
end
end