--[[ // BaseScreen.lua // Creates a base screen with breadcrumbs and title. Do not use for a pane/tab ]] local CoreGui = game:GetService("CoreGui") local GuiRoot = CoreGui:FindFirstChild("RobloxGui") local Modules = GuiRoot:FindFirstChild("Modules") local ShellModules = Modules:FindFirstChild("Shell") local ContextActionService = game:GetService("ContextActionService") local GuiService = game:GetService('GuiService') local ScreenManager = require(ShellModules:FindFirstChild('ScreenManager')) local Strings = require(ShellModules:FindFirstChild('LocalizedStrings')) local Utility = require(ShellModules:FindFirstChild('Utility')) local Analytics = require(ShellModules:FindFirstChild('Analytics')) local function createBaseScreen(usingMVC) local this = {} local inFocus = false local isShown = false local defaultSelectionObject = nil local lastParent = nil local BackText = "" this.view = nil this.fixPosition = false function this:GetBackText() return BackText end local function GetView() if not this.view then local Templates = ShellModules:FindFirstChild("Templates") local BaseScreen = require(Templates:FindFirstChild('BaseScreen')) this.view = BaseScreen(this) end return this.view end if not usingMVC then this.Container = GetView().Container end local function CloseScreen() if inFocus then ScreenManager:CloseCurrent() end end --[[ Public API ]]-- function this:GetView() return GetView() end function this:GetTitle() return GetView().TitleText.Text end function this:SetTitle(newTitle) GetView().TitleText.Text = newTitle end function this:SetTitleZIndex(newZIndex) -- this needs some explantion... -- we recently changed the way z ordering works. In the old system if you had a text label and a image at the -- same zindex the text would render on top of the image. This is no longer the case. So in some cases -- we need to render this text last, but as it's a base class, it becomes hard to reorder the child add order. -- Instead I'm opting to allow changing the zindex GetView().TitleText.ZIndex = newZIndex end function this:SetBackText(newText) BackText = newText GetView():SetBackText(BackText) end function this:GetDefaultSelectionObject() return defaultSelectionObject end function this:Destroy() GetView().Container:Destroy() end --[[ Public API - Screen Management ]]-- function this:SetPosition(newPosition) GetView().Container.Position = newPosition end function this:SetParent(newParent) lastParent = newParent end function this:GetName() return GetView().TitleText.Text end function this:GetAnalyticsInfo() return {[Analytics.WidgetNames('WidgetId')] = GetView().TitleText.Text} end function this:IsFocused() return inFocus end -- View stuff -- function this:ReloadView(newView) local currentView = this.view local currentViewIsShown = isShown local currentViewIsFocused = inFocus if currentView then if currentViewIsFocused then currentView:RemoveFocus() end if currentViewIsShown then currentView:Hide() end end if newView then if currentViewIsShown then newView:Show() end if currentViewIsFocused then newView:Focus() end end this.view = newView end function this:OnBackButtonClick() CloseScreen() end ---------------- function this:Show() isShown = true local prevScreen = ScreenManager:GetScreenBelow(self) if prevScreen and prevScreen.GetName then self:SetBackText(prevScreen:GetName()) else self:SetBackText(Strings:LocalizedString("BackWord")) end GetView().Container.Parent = lastParent ScreenManager:DefaultCancelFade(self.TransitionTweens) if self.fixPosition then self.TransitionTweens = ScreenManager:FadeInSitu(GetView().Container) else self.TransitionTweens = ScreenManager:DefaultFadeIn(GetView().Container) end ScreenManager:PlayDefaultOpenSound() end function this:Hide() isShown = false GetView().Container.Parent = nil ScreenManager:DefaultCancelFade(self.TransitionTweens) self.TransitionTweens = nil end function this:Focus() inFocus = true if self.SavedSelectedObject and self.SavedSelectedObject:IsDescendantOf(GetView().Container) then Utility.SetSelectedCoreObject(self.SavedSelectedObject) else Utility.SetSelectedCoreObject(self:GetDefaultSelectionObject()) end ContextActionService:BindCoreAction("ReturnFromScreen", function(actionName, inputState, inputObject) if inputState == Enum.UserInputState.End then CloseScreen() end end, false, Enum.KeyCode.ButtonB) end function this:RemoveFocus() inFocus = false local selectedObject = GuiService.SelectedCoreObject if selectedObject and selectedObject:IsDescendantOf(GetView().Container) then self.SavedSelectedObject = selectedObject Utility.SetSelectedCoreObject(nil) end ContextActionService:UnbindCoreAction("ReturnFromScreen") end return this end return createBaseScreen