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.

359 lines
12 KiB

local SLE, _, E, L = unpack(select(2, ...))
local DVB = SLE.DedicatedVehicleBar
local AB = E.ActionBars
local LAB = E.Libs.LAB
local Masque = LibStub('Masque', true)
local MasqueGroup = Masque and Masque:Group('ElvUI', 'ActionBars')
local _G = _G
local format = format
local ipairs, pairs = ipairs, pairs
local strsplit = strsplit
local RegisterStateDriver = RegisterStateDriver
local UnregisterStateDriver = UnregisterStateDriver
local GetVehicleBarIndex, GetOverrideBarIndex = GetVehicleBarIndex, GetOverrideBarIndex
local CreateFrame = CreateFrame
local hooksecurefunc = hooksecurefunc
local GetCVarBool = GetCVarBool
local defaultFont, defaultFontSize, defaultFontOutline
DVB.barDefaults = {
vehicle = {
page = 1,
bindButtons = 'ACTIONBUTTON',
conditions = format('[overridebar] %d; [vehicleui] %d; [possessbar] %d; [shapeshift] 13;', GetOverrideBarIndex(), GetVehicleBarIndex(), GetVehicleBarIndex()),
position = 'BOTTOM,ElvUIParent,BOTTOM,0,34',
}
}
DVB.handledBars = {}
function DVB: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 DVB:AnimSlideIn(bar)
if not bar.anim then
DVB:Animate(bar)
end
bar.anim.out1:Stop()
bar.anim:Play()
end
function DVB:AnimSlideOut(bar)
if bar.anim then
bar.anim:Finish()
end
bar.anim:Stop()
bar.anim.out1:Play()
end
function DVB:PositionAndSizeBar()
if not DVB.bar then return end
local db = E.db.sle.actionbar.vehicle
local bar = DVB.bar
local buttonSpacing = db.buttonSpacing
local backdropSpacing = db.backdropSpacing
local buttonsPerRow = db.buttonsPerRow <= 7 and db.buttonsPerRow or 7
local point = db.point
local numButtons = 7
db.buttons = numButtons --Hard code it here for AB:HandleButton() needs it
bar.db = db
bar.mouseover = db.mouseover
bar:EnableMouse(bar.mouseover or not db.clickThrough)
bar:SetAlpha(bar.mouseover and 0 or db.alpha)
bar:SetFrameStrata(db.frameStrata or 'LOW')
bar:SetFrameLevel(db.frameLevel)
AB:FadeBarBlings(bar, bar.mouseover and 0 or db.alpha) --* Prob not needed/wanted tbh
bar.backdrop:SetShown(db.backdrop)
bar.backdrop:SetFrameStrata(db.frameStrata or 'LOW')
bar.backdrop:SetFrameLevel(db.frameLevel - 1)
bar.backdrop:ClearAllPoints()
AB:MoverMagic(bar)
local _, horizontal, anchorUp, anchorLeft = AB:GetGrowth(point)
local button, lastButton, lastColumnButton, anchorRowButton, lastShownButton
for i = 1, db.buttons do
lastButton = bar.buttons[i-1]
lastColumnButton = bar.buttons[i-buttonsPerRow]
button = bar.buttons[i]
button.db = db
if i == 1 or i == buttonsPerRow then
anchorRowButton = button
end
--! Dont think i need the first part of this check as 'i' should never be above db.buttons
if i > db.buttons then
button:Hide()
button.handleBackdrop = nil
else
button:Show()
button.handleBackdrop = true
lastShownButton = button
end
AB:HandleButton(bar, button, i, lastButton, lastColumnButton)
AB:StyleButton(button, nil, MasqueGroup and E.private.actionbar.masque.actionbars)
--* S&L Version of AB:FixKeybindText(button)
local hotkey = _G[bar.buttons[i]:GetName()..'HotKey']
local hotkeytext
local hotkeyPosition = db and db.hotkeyTextPosition or 'TOPRIGHT'
local hotkeyXOffset = db and db.hotkeyTextXOffset or 0
local hotkeyYOffset = db and db.hotkeyTextYOffset or -3
local color = db and db.useHotkeyColor and db.hotkeyColor or AB.db.fontColor
if i == 7 then
hotkeytext = _G['ElvUI_Bar1Button12HotKey']:GetText()
else
hotkeytext = _G['ElvUI_Bar1Button'..i..'HotKey']:GetText()
end
local justify = 'RIGHT'
if hotkeyPosition == 'TOPLEFT' or hotkeyPosition == 'BOTTOMLEFT' then
justify = 'LEFT'
elseif hotkeyPosition == 'TOP' or hotkeyPosition == 'BOTTOM' then
justify = 'CENTER'
end
if hotkeytext then
if hotkeytext == _G.RANGE_INDICATOR then
hotkey:SetFont(defaultFont, defaultFontSize, defaultFontOutline)
hotkey.SetVertexColor = nil
else
hotkey:FontTemplate(E.Libs.LSM:Fetch('font', db and db.hotkeyFont or AB.db.font), db and db.hotkeyFontSize or AB.db.fontSize, db and db.hotkeyFontOutline or AB.db.fontOutline)
hotkey.SetVertexColor = E.noop
end
hotkey:SetText(hotkeytext)
hotkey:SetJustifyH(justify)
end
hotkey:SetTextColor(color.r, color.g, color.b)
if db and not db.hotkeytext then
hotkey:Hide()
else
hotkey:Show()
end
if not bar.buttons[i].useMasque then
hotkey:ClearAllPoints()
hotkey:Point(hotkeyPosition, hotkeyXOffset, hotkeyYOffset)
end
end
AB:HandleBackdropMultiplier(bar, backdropSpacing, buttonSpacing, db.widthMult, db.heightMult, anchorUp, anchorLeft, horizontal, lastShownButton, anchorRowButton)
AB:HandleBackdropMover(bar, backdropSpacing)
local page = format('[overridebar] %d; [vehicleui] %d; [possessbar] %d; [shapeshift] 13;', GetOverrideBarIndex(), GetVehicleBarIndex(), GetVehicleBarIndex())
RegisterStateDriver(bar, 'page', page)
if db.enable then
E:EnableMover(bar.mover:GetName())
RegisterStateDriver(bar, 'visibility', '[petbattle] hide; [vehicleui][overridebar][shapeshift][possessbar] show; hide')
bar:Show()
else
E:DisableMover(bar.mover:GetName())
UnregisterStateDriver(bar, 'visibility')
bar:Hide()
end
--* Not sure if we want or need the SetMoverSnapOffset
E:SetMoverSnapOffset('SL_DedicatedVehicleBarMover', db.buttonSpacing / 2)
--! Did not test the masque stuff tbh (Yolo)
if MasqueGroup and E.private.actionbar.masque.actionbars then
MasqueGroup:ReSkin()
-- masque retrims them all so we have to too
for btn in pairs(AB.handledbuttons) do
AB:TrimIcon(btn, true)
end
end
end
function DVB:CreateBar()
local bar = CreateFrame('Frame', 'SL_DedicatedVehicleBar', E.UIParent, 'SecureHandlerStateTemplate')
DVB.handledBars['vehicle'] = bar
DVB.bar = bar
local defaults = DVB.barDefaults['vehicle']
local elvButton = 'ElvUI_Bar1Button'
bar.id = 1
local point, anchor, attachTo, x, y = strsplit(',', defaults.position)
bar:Point(point, anchor, attachTo, x, y)
bar:HookScript('OnShow', function(frame) self:AnimSlideIn(frame) end)
bar:CreateBackdrop(AB.db.transparent and 'Transparent', nil, nil, nil, nil, nil, nil, nil, 0)
bar.buttons = {}
AB:HookScript(bar, 'OnEnter', 'Bar_OnEnter')
AB:HookScript(bar, 'OnLeave', 'Bar_OnLeave')
for i = 1, 7 do
bar.buttons[i] = LAB:CreateButton(i, format(bar:GetName()..'Button%d', i), bar, nil)
bar.buttons[i]:SetState(0, 'action', i)
for k = 1, 18 do
bar.buttons[i]:SetState(k, 'action', (k - 1) * 12 + i)
end
if i == 7 then
bar.buttons[i]:SetState(GetVehicleBarIndex(), 'custom', AB.customExitButton)
_G[elvButton..i].slvehiclebutton = bar.buttons[i]:GetName()
else
_G[elvButton..i].slvehiclebutton = bar.buttons[i]:GetName()
end
--Masuqe Support
if MasqueGroup and E.private.actionbar.masque.actionbars then
bar.buttons[i]:AddToMasque(MasqueGroup)
end
AB:HookScript(bar.buttons[i], 'OnEnter', 'Button_OnEnter')
AB:HookScript(bar.buttons[i], 'OnLeave', 'Button_OnLeave')
end
bar:SetAttribute('_onstate-page', [[
if newstate == 'possess' or newstate == '11' then
if HasVehicleActionBar() then
newstate = GetVehicleBarIndex()
elseif HasOverrideActionBar() then
newstate = GetOverrideBarIndex()
elseif HasTempShapeshiftActionBar() then
newstate = GetTempShapeshiftBarIndex()
elseif HasBonusActionBar() then
newstate = GetBonusBarIndex()
else
newstate = 12
end
end
self:SetAttribute('state', newstate)
control:ChildUpdate('state', newstate)
]])
local db = DVB.db.vehicle
local animationDistance = db.keepSizeRatio and db.buttonSize or db.buttonHeight
DVB:Animate(bar, 0, -(animationDistance), 1)
E:CreateMover(bar, 'SL_DedicatedVehicleBarMover', L["Dedicated Vehicle Bar"], nil, nil, nil, 'ALL,ACTIONBARS,S&L,S&L MISC', nil, 'sle, modules, actionbars')
end
function DVB:UpdateButtonSettings()
if not E.private.actionbar.enable then return end
for barName, bar in pairs(DVB.handledBars) do
DVB:UpdateButtonConfig(barName, bar.bindButtons)
DVB:PositionAndSizeBar()
end
-- if AB.db.handleOverlay then
-- LAB.eventFrame:RegisterEvent('SPELL_ACTIVATION_OVERLAY_GLOW_SHOW')
-- LAB.eventFrame:RegisterEvent('SPELL_ACTIVATION_OVERLAY_GLOW_HIDE')
-- else
-- LAB.eventFrame:UnregisterEvent('SPELL_ACTIVATION_OVERLAY_GLOW_SHOW')
-- LAB.eventFrame:UnregisterEvent('SPELL_ACTIVATION_OVERLAY_GLOW_HIDE')
-- end
end
function DVB:UpdateButtonConfig(barName)
local barDB = DVB.db[barName]
local bar = DVB.handledBars[barName]
if not bar.buttonConfig then bar.buttonConfig = { hideElements = {}, colors = {} } end
bar.buttonConfig.hideElements.hotkey = not barDB.hotkeytext
bar.buttonConfig.showGrid = barDB.showGrid
bar.buttonConfig.clickOnDown = GetCVarBool('ActionButtonUseKeyDown')
bar.buttonConfig.outOfRangeColoring = (AB.db.useRangeColorText and 'hotkey') or 'button'
bar.buttonConfig.colors.range = E:SetColorTable(bar.buttonConfig.colors.range, AB.db.noRangeColor)
bar.buttonConfig.colors.mana = E:SetColorTable(bar.buttonConfig.colors.mana, AB.db.noPowerColor)
bar.buttonConfig.colors.usable = E:SetColorTable(bar.buttonConfig.colors.usable, AB.db.usableColor)
bar.buttonConfig.colors.notUsable = E:SetColorTable(bar.buttonConfig.colors.notUsable, AB.db.notUsableColor)
bar.buttonConfig.useDrawBling = not AB.db.hideCooldownBling
bar.buttonConfig.useDrawSwipeOnCharges = AB.db.useDrawSwipeOnCharges
bar.buttonConfig.handleOverlay = AB.db.handleOverlay
for _, button in ipairs(bar.buttons) do
--* Don't know if needed atm, still somewhat a wip
-- AB:ToggleCountDownNumbers(bar, button)
button:UpdateConfig(bar.buttonConfig)
end
end
--* Ghetto way to get the pushed texture to work
function DVB:LAB_MouseUp()
if not E.private.actionbar.enable or not E.db.sle.actionbar.vehicle.enable then return end
local slbutton = _G[self.slvehiclebutton]
if slbutton and slbutton.config.clickOnDown then
slbutton:GetPushedTexture():Hide()
end
end
hooksecurefunc(AB, 'LAB_MouseUp', DVB.LAB_MouseUp)
function DVB:LAB_MouseDown()
if not E.private.actionbar.enable or not E.db.sle.actionbar.vehicle.enable then return end
local slbutton = _G[self.slvehiclebutton]
if slbutton and slbutton.config.clickOnDown then
slbutton:GetPushedTexture():Show()
end
end
hooksecurefunc(AB, 'LAB_MouseDown', DVB.LAB_MouseDown)
function DVB:Initialize()
if not SLE.initialized or not E.private.actionbar.enable then return end
DVB.db = E.db.sle.actionbar
if E.locale == 'koKR' then
defaultFont, defaultFontSize, defaultFontOutline = [[Fonts\2002.TTF]], 11, "MONOCHROME, THICKOUTLINE"
elseif E.locale == 'zhTW' then
defaultFont, defaultFontSize, defaultFontOutline = [[Fonts\arheiuhk_bd.TTF]], 11, "MONOCHROME, THICKOUTLINE"
elseif E.locale == 'zhCN' then
defaultFont, defaultFontSize, defaultFontOutline = [[Fonts\FRIZQT__.TTF]], 11, 'MONOCHROME, OUTLINE'
else
defaultFont, defaultFontSize, defaultFontOutline = [[Fonts\ARIALN.TTF]], 12, "MONOCHROME, THICKOUTLINE"
end
DVB:CreateBar()
DVB:UpdateButtonSettings()
--! Def need some testing as I don't see why or where this is needed atm
-- DVB.bar:Execute(DVB.bar:GetAttribute('_onstate-page'))
-- function DVB:ForUpdateAll()
-- DVB:UpdateButtonSettings()
-- end
hooksecurefunc(AB, 'UpdateButtonSettings', DVB.UpdateButtonSettings)
end
SLE:RegisterModule(DVB:GetName())