diff --git a/src/Shared/Modules/Managers/UIManager/Window.lua b/src/Shared/Modules/Managers/UIManager/Window.lua index 5f425c6..6e1b87e 100644 --- a/src/Shared/Modules/Managers/UIManager/Window.lua +++ b/src/Shared/Modules/Managers/UIManager/Window.lua @@ -1,8 +1,9 @@ local ReplicatedStorage = game:GetService("ReplicatedStorage") +local objectList = require(script.Parent.ObjectList) local signal = require(ReplicatedStorage.Modules.Utility.Signal) local types = require(script.Parent.Types) -local window: types.WindowClass = {} :: types.WindowClass +local window = {} :: types.WindowClass window["__index"] = window local module = {} @@ -10,10 +11,8 @@ local module = {} function module.new(name: string): types.Window local self = setmetatable({ Name= name, - Pages = { - Open = {}, - Stored = {}, - }, + + Pages = objectList.new(), Events = { PageOpened = signal.new(), @@ -23,108 +22,11 @@ function module.new(name: string): types.Window _ = {}, }, window) + self.Pages.Parent = self + return self 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) -> ()) self._.OnBuild = callback end @@ -140,11 +42,21 @@ end function window:Build(manager: types.Manager) self:Clean() - self.Manager = manager + self.Parent = manager if self._.OnBuild then self._.OnBuild(self) 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 function window:Open() @@ -168,16 +80,17 @@ function window:Close() end function window:Clean() - self:CleanPages() + self.Pages:CleanAll() + + self._.Status = "Stored" end function window:Remove() self:Clean() - self:RemoveAllPages() if self.ScreenGui then self.ScreenGui:Destroy() end end -return module \ No newline at end of file +return module