--[[ // SideBar.lua // Creates a side bar to be used for certain pages // Currently used by: // GameGenre // Friends ]] 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 GlobalSettings = require(ShellModules:FindFirstChild('GlobalSettings')) local Utility = require(ShellModules:FindFirstChild('Utility')) local ScreenManager = require(ShellModules:FindFirstChild('ScreenManager')) local SoundManager = require(ShellModules:FindFirstChild('SoundManager')) local Analytics = require(ShellModules:FindFirstChild('Analytics')) local CreateSideBar = function() local this = {} local buttons = {} local selectedObject = nil local inFocus = false local INSET_Y = 156 local INSET_X = 65 local BUTTON_SIZE_Y = 75 local modalOverlay = Utility.Create'Frame' { Name = "ModalOverlay"; Size = UDim2.new(1, 0, 1, 0); BackgroundTransparency = 1; BackgroundColor3 = GlobalSettings.ModalBackgroundColor; BorderSizePixel = 0; ZIndex = 4; } local container = Utility.Create'Frame' { Name = "SideBarContainer"; Size = UDim2.new(0.3, 0, 1, 0); Position = UDim2.new(1, 0, 0, 0); BorderSizePixel = 0; BackgroundColor3 = GlobalSettings.OverlayColor; ZIndex = 5; Parent = modalOverlay; } local dummySelectionImage = Utility.Create'TextButton' { Name = "DummySelectionImage"; Size = UDim2.new(0, 0, 0, 0); Visible = false; SoundManager:CreateSound('MoveSelection'); } local textLabel = Utility.Create'TextLabel' { Name = "Text"; Size = UDim2.new(1, -INSET_X - 100, 1, -INSET_Y); --make it inside the TitleSafeContainer Position = UDim2.new(0, INSET_X, 0, INSET_Y); BorderSizePixel = 0; BackgroundTransparency = 1; ZIndex = 6; Text = ""; TextXAlignment = Enum.TextXAlignment.Left; TextYAlignment = Enum.TextYAlignment.Top; TextColor3 = GlobalSettings.WhiteTextColor; Font = GlobalSettings.RegularFont; FontSize = GlobalSettings.DescriptionSize; TextWrapped = true; } local function recalcPositions() for i = 1, #buttons do buttons[i].Position = UDim2.new(0, 0, 0, INSET_Y + (BUTTON_SIZE_Y * (i - 1))) end end --[[ Public API ]]-- --Add closeEvent local closedEvent = Instance.new("BindableEvent") closedEvent.Name = "ClosedEvent" this.Closed = closedEvent.Event --Never shown, will be overwritten by child-- function this:GetAnalyticsInfo() return {[Analytics.WidgetNames('WidgetId')] = Analytics.WidgetNames('SideBarId')} end function this:AddItem(newItemName, callback) local button = Utility.Create'TextButton' { Name = "SortButton"; Size = UDim2.new(1, 0, 0, BUTTON_SIZE_Y); BorderSizePixel = 0; BackgroundColor3 = GlobalSettings.BlueButtonColor; BackgroundTransparency = 1; ZIndex = 6; Text = ""; SelectionImageObject = dummySelectionImage; Parent = container; SoundManager:CreateSound('MoveSelection'); } local text = Utility.Create'TextLabel' { Name = "SortName"; Size = UDim2.new(1, -INSET_X, 1, 0); Position = UDim2.new(0, INSET_X, 0, 0); BackgroundTransparency = 1; Text = newItemName; TextXAlignment = Enum.TextXAlignment.Left; TextColor3 = GlobalSettings.WhiteTextColor; Font = GlobalSettings.RegularFont; FontSize = GlobalSettings.MediumFontSize; ZIndex = 7; Parent = button; } button.MouseButton1Click:connect(function() SoundManager:Play('ButtonPress') ScreenManager:CloseCurrent() closedEvent:Fire() callback() end) button.SelectionGained:connect(function() button.BackgroundTransparency = 0 text.TextColor3 = GlobalSettings.TextSelectedColor end) button.SelectionLost:connect(function() button.BackgroundTransparency = 1 text.TextColor3 = GlobalSettings.WhiteTextColor end) buttons[#buttons + 1] = button recalcPositions() end function this:SetText(text) textLabel.Text = text textLabel.Parent = container end function this:ResetText() textLabel.Text = "" textLabel.Parent = nil end function this:RemoveAllItems() this:ResetText() for i,button in pairs(buttons) do button:Destroy() buttons[i] = nil end end function this:SetSelectedObject(indexToOpenTo, selectCoreObject) if #buttons > 0 then selectedObject = indexToOpenTo and buttons[indexToOpenTo] or buttons[1] --If change SelectedCoreObject and sidebar is focused if selectCoreObject == true and selectedObject and inFocus then GuiService.SelectedCoreObject = selectedObject end else selectedObject = nil end end function this:GetPriority() return GlobalSettings.OverlayPriority end function this:Show() modalOverlay.Parent = ScreenManager:GetScreenGuiByPriority(self:GetPriority()) local tweenIn = Utility.PropertyTweener(modalOverlay, "BackgroundTransparency", 1, GlobalSettings.ModalBackgroundTransparency, 0.25, Utility.EaseInOutQuad, true, nil) container:TweenPosition(UDim2.new(1 - container.Size.X.Scale, 0, 0, 0), Enum.EasingDirection.InOut, Enum.EasingStyle.Quad, 0.25, true) SoundManager:Play('SideMenuSlideIn') end function this:Hide() local tweenOut = Utility.PropertyTweener(modalOverlay, "BackgroundTransparency", 0.3, 1, 0.25, Utility.EaseInOutQuad, true, function() modalOverlay.Parent = nil end) container:TweenPosition(UDim2.new(1, 0, 0, 0), Enum.EasingDirection.InOut, Enum.EasingStyle.Sine, 0.25, true) end function this:IsFocused() return inFocus end function this:Focus() inFocus = true GuiService:AddSelectionParent("SideBar", container) if selectedObject then Utility.SetSelectedCoreObject(selectedObject) else self:SetSelectedObject(1) Utility.SetSelectedCoreObject(selectedObject) end -- connect back button ContextActionService:BindCoreAction("CloseSideBar", function(actionName, inputState, inputObject) if inputState == Enum.UserInputState.End then ScreenManager:CloseCurrent() closedEvent:Fire() end end, false, Enum.KeyCode.ButtonB) end function this:RemoveFocus() inFocus = false GuiService:RemoveSelectionGroup("SideBar") ContextActionService:UnbindCoreAction("CloseSideBar") selectedObject = nil end return this end return CreateSideBar