You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
205 lines
6.3 KiB
205 lines
6.3 KiB
local SLE, T, E, L, V, P, G = unpack(select(2, ...))
|
|
local EVB = SLE.EnhancedVehicleBar
|
|
local AB = E.ActionBars
|
|
local LAB = LibStub('LibActionButton-1.0-ElvUI')
|
|
local Masque = LibStub('Masque', true)
|
|
local MasqueGroup = Masque and Masque:Group('ElvUI', 'ActionBars')
|
|
|
|
--GLOBALS: CreateFrame, hooksecurefunc, UIParent
|
|
local format = format
|
|
local RegisterStateDriver = RegisterStateDriver
|
|
local UnregisterStateDriver = UnregisterStateDriver
|
|
local GetVehicleBarIndex, GetOverrideBarIndex = GetVehicleBarIndex, GetOverrideBarIndex
|
|
|
|
-- Regular Button for these bars are 52. 52 * .71 = ~37.. I just rounded it up to 40 and called it good.
|
|
function EVB:Animate(bar, x, y, duration)
|
|
bar.anim = bar:CreateAnimationGroup('Move_In')
|
|
bar.anim.in1 = bar.anim:CreateAnimation('Translation')
|
|
bar.anim.in1:SetDuration(0)
|
|
bar.anim.in1:SetOrder(1)
|
|
bar.anim.in2 = bar.anim:CreateAnimation('Translation')
|
|
bar.anim.in2:SetDuration(duration)
|
|
bar.anim.in2:SetOrder(2)
|
|
bar.anim.in2:SetSmoothing('OUT')
|
|
bar.anim.out1 = bar:CreateAnimationGroup('Move_Out')
|
|
bar.anim.out2 = bar.anim.out1:CreateAnimation('Translation')
|
|
bar.anim.out2:SetDuration(duration)
|
|
bar.anim.out2:SetOrder(1)
|
|
bar.anim.out2:SetSmoothing('IN')
|
|
bar.anim.in1:SetOffset(x, y)
|
|
bar.anim.in2:SetOffset(-x, -y)
|
|
bar.anim.out2:SetOffset(x, y)
|
|
bar.anim.out1:SetScript('OnFinished', function() bar:Hide() end)
|
|
end
|
|
|
|
function EVB:AnimSlideIn(bar)
|
|
if not bar.anim then
|
|
EVB:Animate(bar)
|
|
end
|
|
|
|
bar.anim.out1:Stop()
|
|
bar.anim:Play()
|
|
end
|
|
|
|
function EVB:AnimSlideOut(bar)
|
|
if bar.anim then
|
|
bar.anim:Finish()
|
|
end
|
|
|
|
bar.anim:Stop()
|
|
bar.anim.out1:Play()
|
|
end
|
|
|
|
function EVB:CreateExtraButtonSet()
|
|
local bar = self.bar
|
|
bar.buttons = {}
|
|
local size = E.db.sle.actionbars.vehicle.buttonsize
|
|
local spacing = E.db.sle.actionbars.vehicle.buttonspacing
|
|
|
|
for i = 1, EVB.NumButtons do
|
|
i = i == 7 and 12 or i
|
|
|
|
bar.buttons[i] = LAB:CreateButton(i, format(bar:GetName()..'Button%d', i), bar, nil)
|
|
bar.buttons[i]:SetState(0, 'action', i)
|
|
|
|
for k = 1, 14 do
|
|
bar.buttons[i]:SetState(k, 'action', (k - 1) * 12 + i)
|
|
end
|
|
|
|
if i == 12 then
|
|
bar.buttons[i]:SetState(12, 'custom', AB.customExitButton)
|
|
end
|
|
|
|
--Masuqe Support
|
|
if MasqueGroup and E.private.actionbar.masque.actionbars then
|
|
bar.buttons[i]:AddToMasque(MasqueGroup)
|
|
end
|
|
|
|
bar.buttons[i]:Size(size)
|
|
|
|
if (i == 1) then
|
|
bar.buttons[i]:SetPoint('BOTTOMLEFT', spacing, spacing)
|
|
else
|
|
local prev = i == 12 and bar.buttons[6] or bar.buttons[i-1]
|
|
bar.buttons[i]:SetPoint('LEFT', prev, 'RIGHT', spacing, 0)
|
|
end
|
|
|
|
AB:StyleButton(bar.buttons[i], nil, MasqueGroup and E.private.actionbar.masque.actionbars and true or nil)
|
|
|
|
if E.private.sle.actionbars.transparentButtons then
|
|
-- Disable this call if Masque is loaded
|
|
if IsAddOnLoaded('Masque') then return end
|
|
|
|
bar.buttons[i].backdrop:SetTemplate('Transparent')
|
|
end
|
|
|
|
bar.buttons[i]:SetCheckedTexture('')
|
|
RegisterStateDriver(bar.buttons[i], 'visibility', '[petbattle] hide; [vehicleui][overridebar][shapeshift][possessbar] show; hide')
|
|
end
|
|
end
|
|
|
|
function EVB:PositionAndSizeBar()
|
|
if not EVB.bar then return end
|
|
local bar = EVB.bar
|
|
|
|
local size = E.db.sle.actionbars.vehicle.buttonsize
|
|
local spacing = E.db.sle.actionbars.vehicle.buttonspacing
|
|
bar:SetWidth((size * EVB.NumButtons) + (spacing * (EVB.NumButtons-1)) + 4)
|
|
bar:SetHeight(size + 4)
|
|
|
|
for i, button in ipairs(bar.buttons) do
|
|
button:Size(size)
|
|
if (i == 1) then
|
|
button:SetPoint('BOTTOMLEFT', 2, 2)
|
|
else
|
|
local prev = i == 12 and bar.buttons[6] or bar.buttons[i-1]
|
|
button:SetPoint('LEFT', prev, 'RIGHT', spacing, 0)
|
|
end
|
|
end
|
|
|
|
if not bar.buttons[12] then return end
|
|
bar.buttons[12]:Size(size)
|
|
bar.buttons[12]:SetPoint('LEFT', bar.buttons[6], 'RIGHT', spacing, 0)
|
|
end
|
|
|
|
function EVB:BarBackdrop()
|
|
if not self.bar then return end
|
|
self.bar:SetTemplate(E.db.sle.actionbars.vehicle.template)
|
|
end
|
|
|
|
function EVB:CreateBar()
|
|
EVB.NumButtons = E.private.sle.vehicle.numButtons
|
|
|
|
local page = format('[overridebar] %d; [vehicleui] %d; [possessbar] %d; [shapeshift] 13;', GetOverrideBarIndex(), GetVehicleBarIndex(), GetVehicleBarIndex())
|
|
local bindButtons = 'ACTIONBUTTON'
|
|
|
|
local bar = CreateFrame('Frame', 'ElvUISL_EnhancedVehicleBar', E.UIParent, 'SecureHandlerStateTemplate, BackdropTemplate')
|
|
bar.id = 1
|
|
EVB.bar = bar
|
|
|
|
EVB:CreateExtraButtonSet()
|
|
EVB:PositionAndSizeBar()
|
|
EVB:BarBackdrop()
|
|
|
|
bar:SetPoint('BOTTOM', 0, 34)
|
|
bar:HookScript('OnShow', function(frame) self:AnimSlideIn(frame) end)
|
|
RegisterStateDriver(bar, 'visibility', '[petbattle] hide; [vehicleui][overridebar][shapeshift][possessbar] show; hide')
|
|
RegisterStateDriver(bar, 'page', page)
|
|
|
|
bar:SetAttribute('_onstate-page', [[
|
|
if HasTempShapeshiftActionBar() and self:GetAttribute('hasTempBar') then
|
|
newstate = GetTempShapeshiftBarIndex() or newstate
|
|
end
|
|
|
|
if newstate ~= 0 then
|
|
self:SetAttribute('state', newstate)
|
|
control:ChildUpdate('state', newstate)
|
|
else
|
|
local newCondition = self:GetAttribute('newCondition')
|
|
if newCondition then
|
|
newstate = SecureCmdOptionParse(newCondition)
|
|
self:SetAttribute('state', newstate)
|
|
control:ChildUpdate('state', newstate)
|
|
end
|
|
end
|
|
]])
|
|
|
|
EVB:Animate(bar, 0, -(bar:GetHeight()), 1)
|
|
|
|
E:CreateMover(bar, 'EnhancedVehicleBar_Mover', L["Enhanced Vehicle Bar"], nil, nil, nil, 'ALL,S&L,S&L MISC', nil, 'sle, modules, actionbars, vehicle')
|
|
|
|
AB:UpdateButtonConfig(bar, bindButtons)
|
|
AB:PositionAndSizeBar('bar1')
|
|
end
|
|
|
|
function EVB:Initialize()
|
|
if not SLE.initialized then return end
|
|
if not E.private.sle.vehicle.enable or not E.private.actionbar.enable then return end
|
|
|
|
local visibility = '[petbattle] hide; [vehicleui][overridebar][shapeshift][possessbar] hide;'
|
|
hooksecurefunc(AB, 'PositionAndSizeBar', function(_, barName)
|
|
local bar = AB['handledBars'][barName]
|
|
if (E.db.actionbar[barName].enabled) and (barName == 'bar1') then
|
|
UnregisterStateDriver(bar, 'visibility')
|
|
RegisterStateDriver(bar, 'visibility', visibility..E.db.actionbar[barName].visibility)
|
|
end
|
|
end)
|
|
|
|
EVB:CreateBar()
|
|
|
|
if UnitHasVehicleUI('player') then
|
|
EVB.bar:SetAttribute('page', (HasOverrideActionBar() and GetOverrideBarIndex() or GetVehicleBarIndex()))
|
|
RegisterStateDriver(EVB.bar, 'page', (HasOverrideActionBar() and GetOverrideBarIndex() or GetVehicleBarIndex()))
|
|
|
|
for _, button in pairs(EVB.bar.buttons) do
|
|
button:UpdateAction()
|
|
end
|
|
end
|
|
|
|
function EVB:ForUpdateAll()
|
|
EVB:PositionAndSizeBar()
|
|
EVB:BarBackdrop()
|
|
end
|
|
end
|
|
|
|
SLE:RegisterModule(EVB:GetName())
|
|
|