220 lines
6.5 KiB
Lua
220 lines
6.5 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 pairs = pairs
|
|
local assert = assert
|
|
local unpack = unpack
|
|
local CreateFrame = CreateFrame
|
|
local C_StorePublic_IsEnabled = C_StorePublic.IsEnabled
|
|
local UpdateMicroButtonsParent = UpdateMicroButtonsParent
|
|
local GetCurrentRegionName = GetCurrentRegionName
|
|
local RegisterStateDriver = RegisterStateDriver
|
|
local InCombatLockdown = InCombatLockdown
|
|
|
|
local microBar = CreateFrame('Frame', 'ElvUI_MicroBar', E.UIParent)
|
|
microBar:SetSize(100, 100)
|
|
|
|
local function onLeaveBar()
|
|
if AB.db.microbar.mouseover then
|
|
E:UIFrameFadeOut(microBar, 0.2, microBar:GetAlpha(), 0)
|
|
end
|
|
end
|
|
|
|
local watcher = 0
|
|
local function onUpdate(self, elapsed)
|
|
if watcher > 0.1 then
|
|
if not self:IsMouseOver() then
|
|
self.IsMouseOvered = nil
|
|
self:SetScript('OnUpdate', nil)
|
|
onLeaveBar()
|
|
end
|
|
watcher = 0
|
|
else
|
|
watcher = watcher + elapsed
|
|
end
|
|
end
|
|
|
|
local function onEnter(button)
|
|
if AB.db.microbar.mouseover and not microBar.IsMouseOvered then
|
|
microBar.IsMouseOvered = true
|
|
microBar:SetScript('OnUpdate', onUpdate)
|
|
E:UIFrameFadeIn(microBar, 0.2, microBar:GetAlpha(), AB.db.microbar.alpha)
|
|
end
|
|
|
|
if button.backdrop and button:IsEnabled() then
|
|
button.backdrop:SetBackdropBorderColor(unpack(E.media.rgbvaluecolor))
|
|
end
|
|
|
|
-- bag keybind support from actionbar module
|
|
if E.private.actionbar.enable then
|
|
AB:BindUpdate(button, 'MICRO')
|
|
end
|
|
end
|
|
|
|
local function onLeave(button)
|
|
if button.backdrop and button:IsEnabled() then
|
|
button.backdrop:SetBackdropBorderColor(unpack(E.media.bordercolor))
|
|
end
|
|
end
|
|
|
|
function AB:HandleMicroButton(button)
|
|
assert(button, 'Invalid micro button name.')
|
|
|
|
local pushed = button:GetPushedTexture()
|
|
local normal = button:GetNormalTexture()
|
|
local disabled = button:GetDisabledTexture()
|
|
|
|
button:CreateBackdrop()
|
|
button.backdrop:SetAllPoints()
|
|
|
|
button:SetParent(microBar)
|
|
button:GetHighlightTexture():Kill()
|
|
button:HookScript('OnEnter', onEnter)
|
|
button:HookScript('OnLeave', onLeave)
|
|
button:SetHitRectInsets(0, 0, 0, 0)
|
|
|
|
if button.Flash then
|
|
button.Flash:SetInside()
|
|
button.Flash:SetTexture()
|
|
end
|
|
|
|
pushed:SetTexCoord(0.22, 0.81, 0.26, 0.82)
|
|
pushed:SetInside(button.backdrop)
|
|
|
|
normal:SetTexCoord(0.22, 0.81, 0.21, 0.82)
|
|
normal:SetInside(button.backdrop)
|
|
|
|
if disabled then
|
|
disabled:SetTexCoord(0.22, 0.81, 0.21, 0.82)
|
|
disabled:SetInside(button.backdrop)
|
|
end
|
|
end
|
|
|
|
function AB:MainMenuMicroButton_SetNormal()
|
|
_G.MainMenuBarPerformanceBar:Point('TOPLEFT', _G.MainMenuMicroButton, 'TOPLEFT', 9, -36)
|
|
end
|
|
|
|
function AB:MainMenuMicroButton_SetPushed()
|
|
_G.MainMenuBarPerformanceBar:Point('TOPLEFT', _G.MainMenuMicroButton, 'TOPLEFT', 8, -37)
|
|
end
|
|
|
|
function AB:UpdateMicroButtonsParent()
|
|
for _, x in pairs(_G.MICRO_BUTTONS) do
|
|
_G[x]:SetParent(microBar)
|
|
end
|
|
end
|
|
|
|
-- we use this table to sort the micro buttons on our bar to match Blizzard's button placements.
|
|
local __buttonIndex = {
|
|
[8] = 'CollectionsMicroButton',
|
|
[9] = 'EJMicroButton',
|
|
[10] = (not C_StorePublic_IsEnabled() and GetCurrentRegionName() == 'CN') and 'HelpMicroButton' or 'StoreMicroButton',
|
|
[11] = 'MainMenuMicroButton'
|
|
}
|
|
|
|
function AB:UpdateMicroBarVisibility()
|
|
if InCombatLockdown() then
|
|
AB.NeedsUpdateMicroBarVisibility = true
|
|
AB:RegisterEvent('PLAYER_REGEN_ENABLED')
|
|
return
|
|
end
|
|
|
|
local visibility = AB.db.microbar.visibility
|
|
visibility = gsub(visibility, '[\n\r]','')
|
|
|
|
RegisterStateDriver(microBar.visibility, 'visibility', (AB.db.microbar.enabled and visibility) or 'hide')
|
|
end
|
|
|
|
function AB:UpdateMicroPositionDimensions()
|
|
local db = AB.db.microbar
|
|
microBar.db = db
|
|
|
|
microBar.backdrop:SetShown(db.backdrop)
|
|
microBar.backdrop:ClearAllPoints()
|
|
|
|
AB:MoverMagic(microBar)
|
|
|
|
db.buttons = #_G.MICRO_BUTTONS-1
|
|
|
|
local backdropSpacing = db.backdropSpacing
|
|
|
|
local _, horizontal, anchorUp, anchorLeft = AB:GetGrowth(db.point)
|
|
local lastButton, anchorRowButton = microBar
|
|
for i = 1, #_G.MICRO_BUTTONS-1 do
|
|
local button = _G[__buttonIndex[i]] or _G[_G.MICRO_BUTTONS[i]]
|
|
local lastColumnButton = i - db.buttonsPerRow
|
|
lastColumnButton = _G[__buttonIndex[lastColumnButton]] or _G[_G.MICRO_BUTTONS[lastColumnButton]]
|
|
button.db = db
|
|
|
|
if i == 1 or i == db.buttonsPerRow then
|
|
anchorRowButton = button
|
|
end
|
|
|
|
button.handleBackdrop = true -- keep over HandleButton
|
|
AB:HandleButton(microBar, button, i, lastButton, lastColumnButton)
|
|
|
|
lastButton = button
|
|
end
|
|
|
|
microBar:SetAlpha((db.mouseover and not microBar.IsMouseOvered and 0) or db.alpha)
|
|
|
|
AB:HandleBackdropMultiplier(microBar, backdropSpacing, db.buttonSpacing, db.widthMult, db.heightMult, anchorUp, anchorLeft, horizontal, lastButton, anchorRowButton)
|
|
AB:HandleBackdropMover(microBar, backdropSpacing)
|
|
|
|
if microBar.mover then
|
|
if AB.db.microbar.enabled then
|
|
E:EnableMover(microBar.mover:GetName())
|
|
else
|
|
E:DisableMover(microBar.mover:GetName())
|
|
end
|
|
end
|
|
|
|
AB:UpdateMicroBarVisibility()
|
|
end
|
|
|
|
function AB:UpdateMicroButtons()
|
|
local GuildMicroButton = _G.GuildMicroButton
|
|
local GuildMicroButtonTabard = _G.GuildMicroButtonTabard
|
|
GuildMicroButtonTabard:SetInside(GuildMicroButton)
|
|
GuildMicroButtonTabard.background:SetInside(GuildMicroButton)
|
|
GuildMicroButtonTabard.background:SetTexCoord(0.17, 0.87, 0.5, 0.908)
|
|
GuildMicroButtonTabard.emblem:ClearAllPoints()
|
|
GuildMicroButtonTabard.emblem:Point('TOPLEFT', GuildMicroButton, 'TOPLEFT', 4, -4)
|
|
GuildMicroButtonTabard.emblem:Point('BOTTOMRIGHT', GuildMicroButton, 'BOTTOMRIGHT', -4, 8)
|
|
|
|
AB:UpdateMicroPositionDimensions()
|
|
end
|
|
|
|
function AB:SetupMicroBar()
|
|
microBar:CreateBackdrop(AB.db.transparent and 'Transparent')
|
|
microBar.backdrop:SetFrameLevel(0)
|
|
|
|
microBar:Point('TOPLEFT', E.UIParent, 'TOPLEFT', 4, -48)
|
|
microBar:EnableMouse(false)
|
|
|
|
microBar.visibility = CreateFrame('Frame', nil, E.UIParent, 'SecureHandlerStateTemplate')
|
|
microBar.visibility:SetScript('OnShow', function() microBar:Show() end)
|
|
microBar.visibility:SetScript('OnHide', function() microBar:Hide() end)
|
|
|
|
for _, x in pairs(_G.MICRO_BUTTONS) do
|
|
AB:HandleMicroButton(_G[x])
|
|
end
|
|
|
|
_G.MicroButtonPortrait:SetInside(_G.CharacterMicroButton.backdrop)
|
|
|
|
AB:SecureHook('UpdateMicroButtonsParent')
|
|
AB:SecureHook('MoveMicroButtons', 'UpdateMicroPositionDimensions')
|
|
AB:SecureHook('UpdateMicroButtons')
|
|
UpdateMicroButtonsParent(microBar)
|
|
AB:MainMenuMicroButton_SetNormal()
|
|
AB:UpdateMicroPositionDimensions()
|
|
|
|
-- With this method we might don't taint anything. Instead of using :Kill()
|
|
_G.MainMenuBarPerformanceBar:SetAlpha(0)
|
|
_G.MainMenuBarPerformanceBar:SetScale(0.00001)
|
|
|
|
E:CreateMover(microBar, 'MicrobarMover', L["Micro Bar"], nil, nil, nil, 'ALL,ACTIONBARS', nil, 'actionbar,microbar')
|
|
end
|