259 lines
7.4 KiB
Lua
259 lines
7.4 KiB
Lua
|
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
|