--[[ 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