Update Window to Modern V2

This commit is contained in:
Clint 2024-06-28 15:48:42 +02:00 committed by GitHub
parent b59f501180
commit 9e7c924c79
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -1,8 +1,9 @@
local ReplicatedStorage = game:GetService("ReplicatedStorage") local ReplicatedStorage = game:GetService("ReplicatedStorage")
local objectList = require(script.Parent.ObjectList)
local signal = require(ReplicatedStorage.Modules.Utility.Signal) local signal = require(ReplicatedStorage.Modules.Utility.Signal)
local types = require(script.Parent.Types) local types = require(script.Parent.Types)
local window: types.WindowClass = {} :: types.WindowClass local window = {} :: types.WindowClass
window["__index"] = window window["__index"] = window
local module = {} local module = {}
@ -10,10 +11,8 @@ local module = {}
function module.new(name: string): types.Window function module.new(name: string): types.Window
local self = setmetatable({ local self = setmetatable({
Name= name, Name= name,
Pages = {
Open = {}, Pages = objectList.new(),
Stored = {},
},
Events = { Events = {
PageOpened = signal.new(), PageOpened = signal.new(),
@ -23,108 +22,11 @@ function module.new(name: string): types.Window
_ = {}, _ = {},
}, window) }, window)
self.Pages.Parent = self
return self return self
end end
--[[ Pages ]]
local function addPageTo(self: types.Window, page: types.Page): ()
local pageName = page.Name
page:Build(self)
page:Open()
self.Pages.Open[pageName] = page
self._.LastOpenedPageName = self._.RecentlyOpenedPageName or pageName
self._.RecentlyOpenedPageName = pageName
end
--[[ Page Methods ]]
function window:BuildPages()
for _, page: types.Page in self.Pages.Stored do
page:Build(self)
end
end
function window:AddPage(page: types.Page): {AsOpened: () -> ()}
self.Pages.Stored[page.Name] = page
return {
AsOpened = function()
addPageTo(self, page)
end
}
end
function window:GetPage(page: string): types.Page
return self.Pages.Stored[page]
end
function window:OpenPage(page: string, command: "Weighted" | "Forced"?)
local pageModule: types.Page = self.Pages.Stored[page]
if pageModule then
if command then
if command:upper() == "WEIGHTED" then
self:CloseAllPages(function(openPage: types.Page)
return openPage.Weight < pageModule.Weight
end)
elseif command:upper() == "FORCED" then
self:CloseAllPages()
end
end
addPageTo(self, pageModule)
self.Events.PageOpened:Fire(pageModule)
end
end
function window:OpenLastPage()
self:OpenPage(self._.LastOpenedPageName, "Forced")
end
function window:ClosePage(page: string)
local pageModule: types.Page = self.Pages.Open[page]
if pageModule then
pageModule:Close()
pageModule:Clean()
self.Pages.Open[page] = nil
self.Events.PageClosed:Fire(pageModule)
end
end
function window:CloseAllPages(middleware: (types.Page) -> (boolean)?)
for _, page: types.Page in self.Pages.Open do
if not middleware or not middleware(page) then
continue
end
page:Close()
page:Clean()
self.Pages.Open[page.Name] = nil
end
end
function window:CleanPages()
for _, page: types.Page in self.Pages.Open do
page:Close()
page:Clean()
end
self.Pages.Open = {}
end
function window:RemoveAllPages()
for _, page: types.Page in self.Pages.Open do
page:Remove()
end
self.Pages.Open = {}
self.Pages.Stored = {}
end
function window:OnBuild(callback: (self: types.Window) -> ()) function window:OnBuild(callback: (self: types.Window) -> ())
self._.OnBuild = callback self._.OnBuild = callback
end end
@ -140,11 +42,21 @@ end
function window:Build(manager: types.Manager) function window:Build(manager: types.Manager)
self:Clean() self:Clean()
self.Manager = manager self.Parent = manager
if self._.OnBuild then if self._.OnBuild then
self._.OnBuild(self) self._.OnBuild(self)
end end
self._.Status = "Built"
end
function window:GetStatus(): "Built" | "Stored"
return self._.Status
end
function window:StatusIs(status: "Built" | "Stored"): boolean
return status == self._.Status
end end
function window:Open() function window:Open()
@ -168,16 +80,17 @@ function window:Close()
end end
function window:Clean() function window:Clean()
self:CleanPages() self.Pages:CleanAll()
self._.Status = "Stored"
end end
function window:Remove() function window:Remove()
self:Clean() self:Clean()
self:RemoveAllPages()
if self.ScreenGui then if self.ScreenGui then
self.ScreenGui:Destroy() self.ScreenGui:Destroy()
end end
end end
return module return module