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.

231 lines
9.7 KiB

--[[ Configure.lua contains rematch:ConfigureFrame() and supporting functions to
define the layout of the standalone frame. ]]
local _,L = ...
local rematch = Rematch
local frame = RematchFrame
local settings
-- these values define the overall configuration of the standalone window
frame.config = {
bottomOffset = nil, -- bottom anchor above red panel buttons or toolbar buttons
topOffset = nil, -- top anchor below toolbar buttons or titlebar
frameWidth = nil, -- width of standalone frame
frameHeight = nil, -- height of standalone frame
panelWidth = nil, -- width of individual panels
panelHeight = nil, -- height of an entire panel (including sub-panels)
}
local config = frame.config
-- these are layouts for each numbered tab, with "left"/"right" in the index of a rematch.panel to show
-- from Main.lua panels are ordered: PetPanel, LoadoutPanel, TeamPanel, QueuePanel, OptionPanel
frame.dualLayout = {{"left","right"},{nil,"left","right"},{"left",nil,nil,"right"},{nil,"left",nil,nil,"right"}}
-- for SinglePanel tab only shows one panel at a time
frame.singleLayout = {"PetPanel","TeamPanel","QueuePanel","OptionPanel"}
rematch:InitModule(function()
rematch.Frame = frame
settings = RematchSettings
end)
function frame:ConfigureFrame()
-- if PetJournal is up, then it needs to hide before standalone frame can show
if rematch.Journal:IsVisible() or (PetJournal and PetJournal:IsVisible()) then
HideUIPanel(CollectionsJournal)
end
-- to start, hide all the things
rematch:HideWidgets()
rematch:HideDialog()
rematch:HideNotes(settings.NotesNoESC)
-- hide all panels too (except for the standalone frame) for a fresh start
for _,panel in pairs(rematch.panels) do
if panel~="RematchFrame" then
_G[panel]:ClearAllPoints()
_G[panel]:Hide()
end
end
local bottomToolbar = settings.BottomToolbar or settings.Minimized
-- offset from bottom of frame to anchor panels (offset past toolbar vs red panel buttons)
config.bottomOffset = bottomToolbar and 40 or 26
-- offset from top of frame to anchor panels (with BottomToolbar panels anchor to very top, otherwise past toolbar)
config.topOffset = bottomToolbar and -24 or -58
-- height of a full panel
config.panelHeight = bottomToolbar and 540 or 520
local frameWidth, frameHeight, panelWidth
if settings.Minimized then -- minimized view
frame:ConfigureMinimized()
elseif settings.SinglePanel and settings.UseMiniQueue then -- single panel with pets+queue combined
frame:ConfigureSinglePanelWithMiniQueue()
elseif settings.SinglePanel then -- standard single panel
frame:ConfigureSinglePanel()
else -- standard dual panel standalone frame
frame:ConfigureDualPanel()
end
rematch:SetTitlebarButtonIcon(frame.TitleBar.MinimizeButton,settings.Minimized and "maximize" or "minimize")
frame.TitleBar:SetShown(not settings.Minimized or not settings.MiniMinimized)
frame.PanelTabs:SetShown(not settings.Minimized or not settings.MiniMinimized)
frame:UpdateSinglePanelButton()
frame.TitleBar.Title:SetPoint("TOP",settings.Minimized and -10 or 0,-5)
-- set the size of the whole standalone window
frame:SetSize(config.frameWidth,config.frameHeight)
-- update tabs across the bottom
rematch:SelectPanelTab(frame.PanelTabs,not settings.Minimized and settings.ActivePanel or 0)
if not settings.Minimized and (settings.ActivePanel==2 or settings.AlwaysTeamTabs) then
rematch.TeamTabs:Configure(frame)
end
-- if toolbar buttons are at the bottom, show the "streaks" behind them
frame.BottomTileStreaks:SetShown(bottomToolbar)
frame.ShadowCornerBottomLeft:SetShown(bottomToolbar)
frame.ShadowCornerBottomRight:SetShown(bottomToolbar)
-- if a pet is on the cursor, sync the slot glows
local petID = rematch:GetCursorPet()
if petID then
for i=1,3 do
rematch.LoadoutPanel.Loadouts[i].DropButton.Glow:Stop()
rematch.LoadoutPanel.Loadouts[i].DropButton.Glow:Play()
end
if rematch:PetCanLevel(petID) then
rematch.QueuePanel.DropButton.Glow:Stop()
rematch.QueuePanel.DropButton.Glow:Play()
end
end
-- reaffirm saved position
frame:ClearAllPoints()
frame:SetPoint(settings.CornerPos,UIParent,"BOTTOMLEFT",settings.XPos,settings.YPos)
-- finally do an UpdateUI to update/refresh the contents of all shown panels
rematch:UpdateUI()
-- gross hack to fix issue of queue's height changing causing scrollbar to be disabled/enabled
-- when there was enough to fit before resize but not enough after resize; waiting a frame and
-- then updating queue again when hitrect calculated properly
-- ** REMOVE
-- if queueStartingHeight ~= rematch.QueuePanel.List:GetHeight() then
-- C_Timer.After(0,rematch.QueuePanel.UpdateList)
-- end
end
--[[ Major configurations ]]
-- minimized (Minimized=true, SinglePanel=any, UseMiniQueue=any)
function frame:ConfigureMinimized()
config.frameWidth, config.frameHeight, config.panelWidth = 269, 184, 260
-- config.bottomOffset, config.topOffset, config.panelHeight = 4, -24, 92
config.bottomOffset, config.panelHeight = 4, 92
frame:PlaceMiniPanel()
rematch.Toolbar:Resize(config.frameWidth)
rematch:Reparent(rematch.Toolbar,frame,"BOTTOM",-1,4)
end
-- standard single panel (Minimized=false, SinglePanel=true, UseMiniQueue=false)
function frame:ConfigureSinglePanel()
config.frameWidth, config.frameHeight, config.panelWidth = 347, 604, 337
frame:PlaceMiniPanelOrOptions()
frame:PlaceSinglePanel()
end
-- single panel with combined pets+queue (Minimized=false, SinglePanel=true, UseMiniQueue=true)
function frame:ConfigureSinglePanelWithMiniQueue()
config.frameWidth, config.frameHeight, config.panelWidth = 378, 604, 368
if settings.ActivePanel==3 then
settings.ActivePanel = 1 -- switch to Pets tab if we were on Queue tab
end
frame:PlaceMiniPanelOrOptions()
frame:PlaceSinglePanel()
end
-- dual panel (Minimized=false, SinglePanel=false, UseMiniQueue=false)
function frame:ConfigureDualPanel()
config.frameWidth, config.frameHeight, config.panelWidth = 572, 604, 280
frame:PlaceToolbarAndBottomPanel(true)
for i=1,5 do -- going through first 5 panels as defined in Main.lua (Pet,Loadout,Team,Queue,Option)
local panel = _G[rematch.panels[i]]
local layout = frame.dualLayout[settings.ActivePanel]
if layout and layout[i] then
rematch:Reparent(panel,frame,"BOTTOMLEFT",frame,"BOTTOMLEFT",layout[i]=="left" and 4 or 286,config.bottomOffset)
panel:SetHeight(config.panelHeight)
if panel.Resize then -- LoadoutPanel has no Resize
panel:Resize(config.panelWidth)
end
end
end
-- special case for queue tab (show MiniPanel and LoadedTeamPanel at top)
if settings.ActivePanel==3 then
rematch:Reparent(rematch.MiniPanel,frame,"TOPLEFT",frame,"TOPLEFT",286,config.topOffset-28) -- (28 is LoadedTeamPanel(26)+2)
rematch.MiniPanel:Resize(config.panelWidth)
rematch:Reparent(rematch.LoadedTeamPanel,frame,"TOPLEFT",frame,"TOPLEFT",286,config.topOffset)
rematch.LoadedTeamPanel.maxWidth = config.panelWidth
rematch.QueuePanel:SetPoint("TOPLEFT",rematch.MiniPanel,"BOTTOMLEFT",0,-2)
elseif not rematch.LoadoutPanel.targetMode then -- for the rest, move LoadedTeamPanel to the top of the Loadouts in the LoadoutPanel (too many Loads!)
rematch:Reparent(rematch.LoadedTeamPanel,frame,"BOTTOMLEFT",rematch.LoadoutPanel.Loadouts[1],"TOPLEFT",0,2)
rematch.LoadedTeamPanel.maxWidth = config.panelWidth
end
end
--[[ Sub-panel placement ]]
-- positions the MiniPanel to the top of the frame (adjusted by anything that will be at the top)
-- used by minimize and both single panel views
function frame:PlaceMiniPanel()
rematch:Reparent(rematch.MiniPanel,frame,"TOPLEFT",frame,"TOPLEFT",4,config.topOffset-28) -- (28 is LoadedTeamPanel(26)+2)
rematch.MiniPanel:Resize(config.panelWidth)
rematch:Reparent(rematch.LoadedTeamPanel,frame,"TOPLEFT",frame,"TOPLEFT",4,config.topOffset)
rematch.LoadedTeamPanel.maxWidth = config.panelWidth
end
-- used by both single panel views to place minipanel at top of frame unless we're in options tab
function frame:PlaceMiniPanelOrOptions()
if settings.ActivePanel~=4 then -- if not in options put MiniPanel at top
frame:PlaceMiniPanel()
else -- if options then hide MiniPanel and LoadedTeamPanel
rematch.OptionPanel:SetHeight(config.panelHeight)
end
end
-- sets up major panels in a SinglePanel view
function frame:PlaceSinglePanel()
for i=1,4 do
local panel = rematch[frame.singleLayout[i]]
if i==settings.ActivePanel then
rematch:Reparent(panel,frame,"BOTTOMLEFT",frame,"BOTTOMLEFT",4,config.bottomOffset)
if i~=4 then -- for all but options, anchor top of panel to bottom of MiniPanel
panel:SetPoint("TOPLEFT",rematch.MiniPanel,"BOTTOMLEFT",0,-2)
end
if settings.UseMiniQueue and i==1 then -- if on PetPanel and UseMiniQueue enabeld
panel:Resize(290 - (settings.SlimListButtons and 10 or 8)) -- resize PetPanel to fit MiniQueue
rematch:Reparent(rematch.MiniQueue,panel,"TOPRIGHT",rematch.MiniPanel,"BOTTOMRIGHT",0,-2)
rematch.MiniQueue:SetPoint("BOTTOMLEFT",rematch.PetPanel,"BOTTOMRIGHT",2,0)
else -- for all other panels resize to panelWidth
panel:Resize(config.panelWidth)
end
panel:SetHeight(config.panelHeight)
end
end
frame:PlaceToolbarAndBottomPanel()
end
-- places the toolbar at top/bottom and bottom red buttons depending on BottomToolar setting
function frame:PlaceToolbarAndBottomPanel(showSummon)
rematch.Toolbar:Resize(config.frameWidth)
if not settings.BottomToolbar then
rematch:Reparent(rematch.BottomPanel,frame,"BOTTOMLEFT")
rematch.BottomPanel:SetPoint("BOTTOMRIGHT")
rematch.BottomPanel:Resize(config.frameWidth,nil,showSummon)
rematch:Reparent(rematch.Toolbar,frame,"TOPLEFT",5,-25)
else
rematch:Reparent(rematch.Toolbar,frame,"BOTTOM",-1,4)
end
end