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