ElvUI/Layout/Layout.lua

424 lines
14 KiB
Lua
Raw Normal View History

2020-11-13 14:27:50 -05:00
local E, L, V, P, G = unpack(select(2, ...)); --Import: Engine, Locales, PrivateDB, ProfileDB, GlobalDB
local LO = E:GetModule('Layout')
local DT = E:GetModule('DataTexts')
local CH = E:GetModule('Chat')
local _G = _G
local CreateFrame = CreateFrame
local FCF_SavePositionAndDimensions = FCF_SavePositionAndDimensions
-- GLOBALS: HideLeftChat, HideRightChat, HideBothChat
local BAR_HEIGHT = 22
local TOGGLE_WIDTH = 18
local function Panel_OnShow(self)
self:SetFrameLevel(200)
self:SetFrameStrata('BACKGROUND')
end
function LO:Initialize()
LO.Initialized = true
LO:CreateChatPanels()
LO:CreateMinimapPanels()
LO:SetDataPanelStyle()
LO.BottomPanel = CreateFrame('Frame', 'ElvUI_BottomPanel', E.UIParent, 'BackdropTemplate')
LO.BottomPanel:SetTemplate('Transparent')
LO.BottomPanel:Point('BOTTOMLEFT', E.UIParent, 'BOTTOMLEFT', -1, -1)
LO.BottomPanel:Point('BOTTOMRIGHT', E.UIParent, 'BOTTOMRIGHT', 1, -1)
LO.BottomPanel:Height(BAR_HEIGHT)
LO.BottomPanel:SetScript('OnShow', Panel_OnShow)
E.FrameLocks.ElvUI_BottomPanel = true
Panel_OnShow(LO.BottomPanel)
LO:BottomPanelVisibility()
LO.TopPanel = CreateFrame('Frame', 'ElvUI_TopPanel', E.UIParent, 'BackdropTemplate')
LO.TopPanel:SetTemplate('Transparent')
LO.TopPanel:Point('TOPLEFT', E.UIParent, 'TOPLEFT', -1, 1)
LO.TopPanel:Point('TOPRIGHT', E.UIParent, 'TOPRIGHT', 1, 1)
LO.TopPanel:Height(BAR_HEIGHT)
LO.TopPanel:SetScript('OnShow', Panel_OnShow)
Panel_OnShow(LO.TopPanel)
E.FrameLocks.ElvUI_TopPanel = true
LO:TopPanelVisibility()
end
function LO:BottomPanelVisibility()
LO.BottomPanel:SetShown(E.db.general.bottomPanel)
end
function LO:TopPanelVisibility()
LO.TopPanel:SetShown(E.db.general.topPanel)
end
local function finishFade(self)
if self:GetAlpha() == 0 then
self:Hide()
end
end
local function fadeChatPanel(self, duration, alpha)
if alpha == 1 then
self.parent:Show()
end
E:UIFrameFadeOut(self.parent, duration, self.parent:GetAlpha(), alpha)
if E.db.chat.fadeChatToggles then
E:UIFrameFadeOut(self, duration, self:GetAlpha(), alpha)
end
end
local function ChatButton_OnEnter(self)
if E.db[self.parent:GetName()..'Faded'] then
fadeChatPanel(self, 0.3, 1)
end
if not _G.GameTooltip:IsForbidden() then
_G.GameTooltip:SetOwner(self, 'ANCHOR_TOPLEFT', 0, 4)
_G.GameTooltip:ClearLines()
_G.GameTooltip:AddDoubleLine(L["Left Click:"], L["Toggle Chat Frame"], 1, 1, 1)
_G.GameTooltip:Show()
end
end
local function ChatButton_OnLeave(self)
if E.db[self.parent:GetName()..'Faded'] then
fadeChatPanel(self, 0.3, 0)
end
if not _G.GameTooltip:IsForbidden() then
_G.GameTooltip:Hide()
end
end
local function ChatButton_OnClick(self)
local name = self.parent:GetName()..'Faded'
if E.db[name] then
E.db[name] = nil
fadeChatPanel(self, 0.2, 1)
else
E.db[name] = true
fadeChatPanel(self, 0.2, 0)
end
if not _G.GameTooltip:IsForbidden() then
_G.GameTooltip:Hide()
end
end
-- these are used by the bindings and options
function HideLeftChat()
ChatButton_OnClick(_G.LeftChatToggleButton)
end
function HideRightChat()
ChatButton_OnClick(_G.RightChatToggleButton)
end
function HideBothChat()
ChatButton_OnClick(_G.LeftChatToggleButton)
ChatButton_OnClick(_G.RightChatToggleButton)
end
function LO:ToggleChatTabPanels(rightOverride, leftOverride)
if leftOverride or not E.db.chat.panelTabBackdrop then
_G.LeftChatTab:Hide()
else
_G.LeftChatTab:Show()
end
if rightOverride or not E.db.chat.panelTabBackdrop then
_G.RightChatTab:Hide()
else
_G.RightChatTab:Show()
end
end
do
local function DataPanelStyle(panel, db)
panel.forcedBorderColors = (db.border == false and {0,0,0,0}) or nil
panel:SetTemplate(db.backdrop and (db.panelTransparency and 'Transparent' or 'Default') or 'NoBackdrop', true)
if db.border ~= nil then
if panel.iborder then panel.iborder:SetShown(db.border) end
if panel.oborder then panel.oborder:SetShown(db.border) end
end
end
function LO:SetDataPanelStyle()
DataPanelStyle(_G.LeftChatToggleButton, E.db.datatexts.panels.LeftChatDataPanel)
DataPanelStyle(_G.RightChatToggleButton, E.db.datatexts.panels.RightChatDataPanel)
end
end
local barHeight = BAR_HEIGHT + 1
local toggleWidth = TOGGLE_WIDTH + 1
function LO:RefreshChatMovers()
local LeftChatPanel = _G.LeftChatPanel
local RightChatPanel = _G.RightChatPanel
local LeftChatMover = _G.LeftChatMover
local RightChatMover = _G.RightChatMover
local Left = LeftChatPanel:GetPoint()
local Right = RightChatPanel:GetPoint()
local showRightPanel = E.db.datatexts.panels.RightChatDataPanel.enable
local showLeftPanel = E.db.datatexts.panels.LeftChatDataPanel.enable
if not showLeftPanel or E.db.chat.LeftChatDataPanelAnchor == 'ABOVE_CHAT' then
LeftChatPanel:Point(Left, LeftChatMover, 0, 0)
elseif showLeftPanel then
LeftChatPanel:Point(Left, LeftChatMover, 0, barHeight)
end
if not showRightPanel or E.db.chat.RightChatDataPanelAnchor == 'ABOVE_CHAT' then
RightChatPanel:Point(Right, RightChatMover, 0, 0)
elseif showRightPanel then
RightChatPanel:Point(Right, RightChatMover, 0, barHeight)
end
-- mover sizes: same as in CH.PositionChats for panels but including the datatext bar height
LeftChatMover:Size(E.db.chat.panelWidth, E.db.chat.panelHeight + (showLeftPanel and barHeight or 0))
if E.db.chat.separateSizes then
RightChatMover:Size(E.db.chat.panelWidthRight, E.db.chat.panelHeightRight + (showRightPanel and barHeight or 0))
else
RightChatMover:Size(E.db.chat.panelWidth, E.db.chat.panelHeight + (showRightPanel and barHeight or 0))
end
end
function LO:RepositionChatDataPanels()
local LeftChatTab = _G.LeftChatTab
local RightChatTab = _G.RightChatTab
local LeftChatPanel = _G.LeftChatPanel
local RightChatPanel = _G.RightChatPanel
local LeftChatDataPanel = _G.LeftChatDataPanel
local RightChatDataPanel = _G.RightChatDataPanel
local LeftChatToggleButton = _G.LeftChatToggleButton
local RightChatToggleButton = _G.RightChatToggleButton
if E.private.chat.enable then
LeftChatTab:ClearAllPoints()
RightChatTab:ClearAllPoints()
LeftChatTab:Point('TOPLEFT', LeftChatPanel, 'TOPLEFT', 2, -2)
LeftChatTab:Point('BOTTOMRIGHT', LeftChatPanel, 'TOPRIGHT', -2, -BAR_HEIGHT-2)
RightChatTab:Point('TOPRIGHT', RightChatPanel, 'TOPRIGHT', -2, -2)
RightChatTab:Point('BOTTOMLEFT', RightChatPanel, 'TOPLEFT', 2, -BAR_HEIGHT-2)
end
LeftChatDataPanel:ClearAllPoints()
RightChatDataPanel:ClearAllPoints()
local SPACING = E.PixelMode and 1 or -1
local sideButton = E.db.chat.hideChatToggles and 0 or toggleWidth
if E.db.chat.LeftChatDataPanelAnchor == 'ABOVE_CHAT' then
LeftChatDataPanel:Point('BOTTOMRIGHT', LeftChatPanel, 'TOPRIGHT', 0, -SPACING)
LeftChatDataPanel:Point('TOPLEFT', LeftChatPanel, 'TOPLEFT', sideButton, barHeight)
LeftChatToggleButton:Point('BOTTOMRIGHT', LeftChatDataPanel, 'BOTTOMLEFT', SPACING, 0)
LeftChatToggleButton:Point('TOPLEFT', LeftChatDataPanel, 'TOPLEFT', -toggleWidth, 0)
else
LeftChatDataPanel:Point('TOPRIGHT', LeftChatPanel, 'BOTTOMRIGHT', 0, SPACING)
LeftChatDataPanel:Point('BOTTOMLEFT', LeftChatPanel, 'BOTTOMLEFT', sideButton, -barHeight)
LeftChatToggleButton:Point('TOPRIGHT', LeftChatDataPanel, 'TOPLEFT', SPACING, 0)
LeftChatToggleButton:Point('BOTTOMLEFT', LeftChatDataPanel, 'BOTTOMLEFT', -toggleWidth, 0)
end
if E.db.chat.RightChatDataPanelAnchor == 'ABOVE_CHAT' then
RightChatDataPanel:Point('BOTTOMLEFT', RightChatPanel, 'TOPLEFT', 0, -SPACING)
RightChatDataPanel:Point('TOPRIGHT', RightChatPanel, 'TOPRIGHT', -sideButton, barHeight)
RightChatToggleButton:Point('BOTTOMLEFT', RightChatDataPanel, 'BOTTOMRIGHT', -SPACING, 0)
RightChatToggleButton:Point('TOPRIGHT', RightChatDataPanel, 'TOPRIGHT', toggleWidth, 0)
else
RightChatDataPanel:Point('TOPLEFT', RightChatPanel, 'BOTTOMLEFT', 0, SPACING)
RightChatDataPanel:Point('BOTTOMRIGHT', RightChatPanel, 'BOTTOMRIGHT', -sideButton, -barHeight)
RightChatToggleButton:Point('TOPLEFT', RightChatDataPanel, 'TOPRIGHT', -SPACING, 0)
RightChatToggleButton:Point('BOTTOMRIGHT', RightChatDataPanel, 'BOTTOMRIGHT', toggleWidth, 0)
end
LO:RefreshChatMovers()
end
function LO:SetChatTabStyle()
local tabStyle = (E.db.chat.panelTabTransparency and 'Transparent') or nil
local glossTex = (not tabStyle and true) or nil
_G.LeftChatTab:SetTemplate(tabStyle, glossTex)
_G.RightChatTab:SetTemplate(tabStyle, glossTex)
end
function LO:ToggleChatPanels()
local showRightPanel = E.db.datatexts.panels.RightChatDataPanel.enable
local showLeftPanel = E.db.datatexts.panels.LeftChatDataPanel.enable
_G.RightChatDataPanel:SetShown(showRightPanel)
_G.LeftChatDataPanel:SetShown(showLeftPanel)
local showToggles = not E.db.chat.hideChatToggles
_G.LeftChatToggleButton:SetShown(showToggles and showLeftPanel)
_G.RightChatToggleButton:SetShown(showToggles and showRightPanel)
LO:RefreshChatMovers()
local panelBackdrop = E.db.chat.panelBackdrop
if panelBackdrop == 'SHOWBOTH' then
_G.LeftChatPanel.backdrop:Show()
_G.RightChatPanel.backdrop:Show()
LO:ToggleChatTabPanels()
elseif panelBackdrop == 'HIDEBOTH' then
_G.LeftChatPanel.backdrop:Hide()
_G.RightChatPanel.backdrop:Hide()
LO:ToggleChatTabPanels(true, true)
elseif panelBackdrop == 'LEFT' then
_G.LeftChatPanel.backdrop:Show()
_G.RightChatPanel.backdrop:Hide()
LO:ToggleChatTabPanels(true)
else
_G.LeftChatPanel.backdrop:Hide()
_G.RightChatPanel.backdrop:Show()
LO:ToggleChatTabPanels(nil, true)
end
end
function LO:ResaveChatPosition()
if not E.private.chat.enable then return end
local name, chat = self.name
if name == 'LeftChatMover' then
chat = CH.LeftChatWindow
elseif name == 'RightChatMover' then
chat = CH.RightChatWindow
end
if chat and chat:GetLeft() then
FCF_SavePositionAndDimensions(chat)
end
end
function LO:CreateChatPanels()
--Left Chat
local lchat = CreateFrame('Frame', 'LeftChatPanel', E.UIParent, 'BackdropTemplate')
lchat:SetFrameStrata('BACKGROUND')
lchat:SetFrameLevel(300)
lchat:Size(100, 100)
lchat:Point('BOTTOMLEFT', E.UIParent, 4, 4)
lchat:CreateBackdrop('Transparent')
lchat.backdrop.callbackBackdropColor = CH.Panel_ColorUpdate
lchat.backdrop:SetAllPoints()
lchat.FadeObject = {finishedFunc = finishFade, finishedArg1 = lchat, finishedFuncKeep = true}
E:CreateMover(lchat, 'LeftChatMover', L["Left Chat"], nil, nil, LO.ResaveChatPosition, nil, nil, 'chat,general', nil, true)
--Background Texture
local lchattex = lchat:CreateTexture(nil, 'OVERLAY')
lchattex:SetInside()
lchattex:SetTexture(E.db.chat.panelBackdropNameLeft)
lchattex:SetAlpha(E.db.general.backdropfadecolor.a - 0.7 > 0 and E.db.general.backdropfadecolor.a - 0.7 or 0.5)
lchat.tex = lchattex
--Left Chat Tab
CreateFrame('Frame', 'LeftChatTab', lchat, 'BackdropTemplate')
--Left Chat Data Panel
local lchatdp = CreateFrame('Frame', 'LeftChatDataPanel', lchat, 'BackdropTemplate')
DT:RegisterPanel(lchatdp, 3, 'ANCHOR_TOPLEFT', -17, 4)
--Left Chat Toggle Button
local lchattb = CreateFrame('Button', 'LeftChatToggleButton', E.UIParent, 'BackdropTemplate')
lchattb:SetNormalTexture(E.Media.Textures.ArrowUp)
lchattb:SetFrameStrata('BACKGROUND')
lchattb:SetFrameLevel(301)
lchattb:RegisterForClicks('LeftButtonUp', 'RightButtonUp')
lchattb:SetScript('OnEnter', ChatButton_OnEnter)
lchattb:SetScript('OnLeave', ChatButton_OnLeave)
lchattb:SetScript('OnClick', function(lcb, btn)
if btn == 'LeftButton' then
ChatButton_OnClick(lcb)
end
end)
local lchattbtex = lchattb:GetNormalTexture()
lchattbtex:SetRotation(E.Skins.ArrowRotation.left)
lchattbtex:ClearAllPoints()
lchattbtex:Point('CENTER')
lchattbtex:Size(12)
lchattb.texture = lchattbtex
lchattb.OnEnter = ChatButton_OnEnter
lchattb.OnLeave = ChatButton_OnLeave
lchattb.parent = lchat
--Right Chat
local rchat = CreateFrame('Frame', 'RightChatPanel', E.UIParent, 'BackdropTemplate')
rchat:SetFrameStrata('BACKGROUND')
rchat:SetFrameLevel(300)
rchat:Size(100, 100)
rchat:Point('BOTTOMRIGHT', E.UIParent, -4, 4)
rchat:CreateBackdrop('Transparent')
rchat.backdrop.callbackBackdropColor = CH.Panel_ColorUpdate
rchat.backdrop:SetAllPoints()
rchat.FadeObject = {finishedFunc = finishFade, finishedArg1 = rchat, finishedFuncKeep = true}
E:CreateMover(rchat, 'RightChatMover', L["Right Chat"], nil, nil, LO.ResaveChatPosition, nil, nil, 'chat,general', nil, true)
--Background Texture
local rchattex = rchat:CreateTexture(nil, 'OVERLAY')
rchattex:SetInside()
rchattex:SetTexture(E.db.chat.panelBackdropNameRight)
rchattex:SetAlpha(E.db.general.backdropfadecolor.a - 0.7 > 0 and E.db.general.backdropfadecolor.a - 0.7 or 0.5)
rchat.tex = rchattex
--Right Chat Tab
CreateFrame('Frame', 'RightChatTab', rchat, 'BackdropTemplate')
--Right Chat Data Panel
local rchatdp = CreateFrame('Frame', 'RightChatDataPanel', rchat, 'BackdropTemplate')
DT:RegisterPanel(rchatdp, 3, 'ANCHOR_TOPRIGHT', 17, 4)
--Right Chat Toggle Button
local rchattb = CreateFrame('Button', 'RightChatToggleButton', E.UIParent, 'BackdropTemplate')
rchattb:SetNormalTexture(E.Media.Textures.ArrowUp)
rchattb:RegisterForClicks('AnyUp')
rchattb:SetFrameStrata('BACKGROUND')
rchattb:SetFrameLevel(301)
rchattb:SetScript('OnEnter', ChatButton_OnEnter)
rchattb:SetScript('OnLeave', ChatButton_OnLeave)
rchattb:SetScript('OnClick', function(rcb, btn)
if btn == 'LeftButton' then
ChatButton_OnClick(rcb)
end
end)
local rchattbtex = rchattb:GetNormalTexture()
rchattbtex:SetRotation(E.Skins.ArrowRotation.right)
rchattbtex:ClearAllPoints()
rchattbtex:Point('CENTER')
rchattbtex:Size(12)
rchattb.texture = rchattbtex
rchattb.parent = rchat
--Load Settings
local fadeToggle = E.db.chat.fadeChatToggles
if E.db.LeftChatPanelFaded then
if fadeToggle then
_G.LeftChatToggleButton:SetAlpha(0)
end
lchat:Hide()
end
if E.db.RightChatPanelFaded then
if fadeToggle then
_G.RightChatToggleButton:SetAlpha(0)
end
rchat:Hide()
end
LO:ToggleChatPanels()
LO:SetChatTabStyle()
end
function LO:CreateMinimapPanels()
local panel = CreateFrame('Frame', 'MinimapPanel', _G.Minimap, 'BackdropTemplate')
panel:Point('TOPLEFT', _G.Minimap, 'BOTTOMLEFT', -E.Border, E.PixelMode and 0 or -3)
panel:Point('BOTTOMRIGHT', _G.Minimap, 'BOTTOMRIGHT', E.Border, -BAR_HEIGHT)
panel:Hide()
DT:RegisterPanel(panel, E.db.datatexts.panels.MinimapPanel.numPoints, 'ANCHOR_BOTTOM', 0, -4)
end
E:RegisterModule(LO:GetName())