forked from aya/aya
277 lines
8.6 KiB
Lua
277 lines
8.6 KiB
Lua
--[[
|
|
Filename: SettingsPageFactory.lua
|
|
Written by: jeditkacheff
|
|
Version 1.0
|
|
Description: Base Page Functionality for all Settings Pages
|
|
--]]
|
|
----------------- SERVICES ------------------------------
|
|
local GuiService = game:GetService("GuiService")
|
|
local HttpService = game:GetService("HttpService")
|
|
local UserInputService = game:GetService("UserInputService")
|
|
|
|
local CoreGui = game:GetService("CoreGui")
|
|
local RobloxGui = CoreGui:WaitForChild("RobloxGui")
|
|
|
|
----------- UTILITIES --------------
|
|
local utility = require(RobloxGui.Modules.Utility)
|
|
|
|
|
|
----------- VARIABLES --------------
|
|
RobloxGui:WaitForChild("Modules"):WaitForChild("TenFootInterface")
|
|
local isTenFootInterface = require(RobloxGui.Modules.TenFootInterface):IsEnabled()
|
|
|
|
----------- CONSTANTS --------------
|
|
local HEADER_SPACING = 5
|
|
if utility:IsSmallTouchScreen() then
|
|
HEADER_SPACING = 0
|
|
end
|
|
|
|
----------- CLASS DECLARATION --------------
|
|
local function Initialize()
|
|
local this = {}
|
|
this.HubRef = nil
|
|
this.LastSelectedObject = nil
|
|
this.TabPosition = 0
|
|
this.Active = false
|
|
this.OpenStateChangedCount = 0
|
|
local rows = {}
|
|
local displayed = false
|
|
|
|
------ TAB CREATION -------
|
|
this.TabHeader = utility:Create'TextButton'
|
|
{
|
|
Name = "Header",
|
|
Text = "",
|
|
BackgroundTransparency = 1,
|
|
Size = UDim2.new(0,169,1,0),
|
|
Position = UDim2.new(0.5,0,0,0)
|
|
};
|
|
if utility:IsSmallTouchScreen() then
|
|
this.TabHeader.Size = UDim2.new(0,84,1,0)
|
|
elseif isTenFootInterface then
|
|
this.TabHeader.Size = UDim2.new(0,220,1,0)
|
|
end
|
|
this.TabHeader.MouseButton1Click:connect(function()
|
|
if this.HubRef then
|
|
this.HubRef:SwitchToPage(this, true)
|
|
end
|
|
end)
|
|
|
|
local icon = utility:Create'ImageLabel'
|
|
{
|
|
Name = "Icon",
|
|
BackgroundTransparency = 1,
|
|
Size = UDim2.new(0,44,0,37),
|
|
Position = UDim2.new(0,10,0.5,-18),
|
|
Image = "",
|
|
ImageTransparency = 0.5,
|
|
Parent = this.TabHeader
|
|
};
|
|
|
|
local title = utility:Create'TextLabel'
|
|
{
|
|
Name = "Title",
|
|
Text = "Change Me",
|
|
Font = Enum.Font.SourceSansBold,
|
|
FontSize = Enum.FontSize.Size24,
|
|
TextColor3 = Color3.new(1,1,1),
|
|
BackgroundTransparency = 1,
|
|
Size = UDim2.new(1.05,0,1,0),
|
|
Position = UDim2.new(1.2,0,0,0),
|
|
TextXAlignment = Enum.TextXAlignment.Left,
|
|
TextTransparency = 0.5,
|
|
Parent = icon
|
|
};
|
|
if utility:IsSmallTouchScreen() then
|
|
title.FontSize = Enum.FontSize.Size18
|
|
elseif isTenFootInterface then
|
|
title.FontSize = Enum.FontSize.Size48
|
|
end
|
|
|
|
local tabSelection = utility:Create'ImageLabel'
|
|
{
|
|
Name = "TabSelection",
|
|
Image = "ayaasset://textures/ui/Settings/MenuBarAssets/MenuSelection.png",
|
|
ScaleType = Enum.ScaleType.Slice,
|
|
SliceCenter = Rect.new(3,1,4,5),
|
|
Visible = false,
|
|
BackgroundTransparency = 1,
|
|
Size = UDim2.new(1,0,0,6),
|
|
Position = UDim2.new(0,0,1,-6),
|
|
Parent = this.TabHeader
|
|
};
|
|
|
|
------ PAGE CREATION -------
|
|
this.Page = utility:Create'Frame'
|
|
{
|
|
Name = "Page",
|
|
BackgroundTransparency = 1,
|
|
Size = UDim2.new(1,0,1,0)
|
|
};
|
|
|
|
-- make sure each page has a unique selection group (for gamepad selection)
|
|
GuiService:AddSelectionParent(HttpService:GenerateGUID(false), this.Page)
|
|
|
|
----------------- Events ------------------------
|
|
|
|
this.Displayed = Instance.new("BindableEvent")
|
|
this.Displayed.Name = "Displayed"
|
|
|
|
this.Displayed.Event:connect(function()
|
|
if not this.HubRef.Shield.Visible then return end
|
|
|
|
this:SelectARow()
|
|
end)
|
|
|
|
this.Hidden = Instance.new("BindableEvent")
|
|
this.Hidden.Event:connect(function()
|
|
if GuiService.SelectedCoreObject and GuiService.SelectedCoreObject:IsDescendantOf(this.Page) then
|
|
GuiService.SelectedCoreObject = nil
|
|
end
|
|
end)
|
|
this.Hidden.Name = "Hidden"
|
|
|
|
----------------- FUNCTIONS ------------------------
|
|
function this:SelectARow(forced) -- Selects the first row or the most recently selected row
|
|
if forced or not GuiService.SelectedCoreObject or not GuiService.SelectedCoreObject:IsDescendantOf(this.Page) then
|
|
if this.LastSelectedObject then
|
|
GuiService.SelectedCoreObject = this.LastSelectedObject
|
|
else
|
|
if rows and #rows > 0 then
|
|
local valueChangerFrame = nil
|
|
|
|
if type(rows[1].ValueChanger) ~= "table" then
|
|
valueChangerFrame = rows[1].ValueChanger
|
|
else
|
|
valueChangerFrame = rows[1].ValueChanger.SliderFrame and
|
|
rows[1].ValueChanger.SliderFrame or rows[1].ValueChanger.SelectorFrame
|
|
end
|
|
GuiService.SelectedCoreObject = valueChangerFrame
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
function this:Display(pageParent, skipAnimation)
|
|
this.OpenStateChangedCount = this.OpenStateChangedCount + 1
|
|
|
|
if this.TabHeader then
|
|
this.TabHeader.TabSelection.Visible = true
|
|
this.TabHeader.Icon.ImageTransparency = 0
|
|
this.TabHeader.Icon.Title.TextTransparency = 0
|
|
end
|
|
|
|
this.Page.Parent = pageParent
|
|
this.Page.Visible = true
|
|
|
|
local endPos = UDim2.new(0,0,0,0)
|
|
local animationComplete = function()
|
|
this.Page.Visible = true
|
|
displayed = true
|
|
this.Displayed:Fire()
|
|
end
|
|
if skipAnimation then
|
|
this.Page.Position = endPos
|
|
animationComplete()
|
|
else
|
|
this.Page:TweenPosition(endPos, Enum.EasingDirection.In, Enum.EasingStyle.Quad, 0.1, true, animationComplete)
|
|
end
|
|
end
|
|
function this:Hide(direction, newPagePos, skipAnimation, delayBeforeHiding)
|
|
this.OpenStateChangedCount = this.OpenStateChangedCount + 1
|
|
|
|
if this.TabHeader then
|
|
this.TabHeader.TabSelection.Visible = false
|
|
this.TabHeader.Icon.ImageTransparency = 0.5
|
|
this.TabHeader.Icon.Title.TextTransparency = 0.5
|
|
end
|
|
|
|
if this.Page.Parent then
|
|
local endPos = UDim2.new(1 * direction,0,0,0)
|
|
local animationComplete = function()
|
|
this.Page.Visible = false
|
|
this.Page.Position = UDim2.new(this.TabPosition - newPagePos,0,0,0)
|
|
displayed = false
|
|
this.Hidden:Fire()
|
|
end
|
|
|
|
local remove = function()
|
|
if skipAnimation then
|
|
this.Page.Position = endPos
|
|
animationComplete()
|
|
else
|
|
this.Page:TweenPosition(endPos, Enum.EasingDirection.Out, Enum.EasingStyle.Quad, 0.1, true, animationComplete)
|
|
end
|
|
end
|
|
|
|
if delayBeforeHiding then
|
|
local myOpenStateChangedCount = this.OpenStateChangedCount
|
|
delay(delayBeforeHiding, function()
|
|
if myOpenStateChangedCount == this.OpenStateChangedCount then
|
|
remove()
|
|
end
|
|
end)
|
|
else
|
|
remove()
|
|
end
|
|
end
|
|
end
|
|
|
|
function this:GetDisplayed()
|
|
return displayed
|
|
end
|
|
|
|
function this:GetVisibility()
|
|
return this.Page.Parent
|
|
end
|
|
|
|
function this:GetTabHeader()
|
|
return this.TabHeader
|
|
end
|
|
|
|
function this:SetHub(hubRef)
|
|
this.HubRef = hubRef
|
|
|
|
for i, row in next, rows do
|
|
if type(row.ValueChanger) == 'table' then
|
|
row.ValueChanger.HubRef = this.HubRef
|
|
end
|
|
end
|
|
end
|
|
|
|
function this:GetSize()
|
|
return this.Page.AbsoluteSize
|
|
end
|
|
|
|
function this:AddRow(RowFrame, RowLabel, ValueChangerInstance, ExtraRowSpacing)
|
|
rows[#rows + 1] = {SelectionFrame = RowFrame, Label = RowLabel, ValueChanger = ValueChangerInstance}
|
|
|
|
local rowFrameYSize = 0
|
|
if RowFrame then
|
|
rowFrameYSize = RowFrame.Size.Y.Offset
|
|
end
|
|
|
|
if ExtraRowSpacing then
|
|
this.Page.Size = UDim2.new(1, 0, 0, this.Page.Size.Y.Offset + rowFrameYSize + ExtraRowSpacing)
|
|
else
|
|
this.Page.Size = UDim2.new(1, 0, 0, this.Page.Size.Y.Offset + rowFrameYSize)
|
|
end
|
|
|
|
if this.HubRef and type(ValueChangerInstance) == 'table' then
|
|
ValueChangerInstance.HubRef = this.HubRef
|
|
end
|
|
end
|
|
|
|
return this
|
|
end
|
|
|
|
|
|
-------- public facing API ----------------
|
|
local moduleApiTable = {}
|
|
|
|
function moduleApiTable:CreateNewPage()
|
|
return Initialize()
|
|
end
|
|
|
|
|
|
return moduleApiTable |