diff --git a/src/Shared/Modules/Managers/UIManager/Button.lua b/src/Shared/Modules/Managers/UIManager/Button.lua index b8a7866..6b9bb1c 100644 --- a/src/Shared/Modules/Managers/UIManager/Button.lua +++ b/src/Shared/Modules/Managers/UIManager/Button.lua @@ -98,4 +98,10 @@ function button:HoverLeft() end end +function button:Remove() + if self.ButtonGui then + self.ButtonGui:Destroy() + end +end + return module \ No newline at end of file diff --git a/src/Shared/Modules/Managers/UIManager/Component.lua b/src/Shared/Modules/Managers/UIManager/Component.lua index 7b24ab7..c6a63f3 100644 --- a/src/Shared/Modules/Managers/UIManager/Component.lua +++ b/src/Shared/Modules/Managers/UIManager/Component.lua @@ -8,7 +8,14 @@ local module = {} function module.new(name: string): types.Component local self = setmetatable({ Name= name, - _ = {}, + Buttons = { + Active = {}, + Stored = {}, + }, + + _ = { + UpdateCallbacks = {}, + }, }, component) return self @@ -26,8 +33,21 @@ function component:AddButton(button: types.Button) self.Buttons.Stored[button.Name] = button end -function component:RemoveButtons() +function component:CloseAllButtons() + for _, button in self.Buttons.Active do + button:Close() + end + self.Buttons.Active = {} +end + +function component:RemoveButtons() + self:CloseAllButtons() + + for _, button in self.Buttons.Stored do + button:Remove() + end + self.Buttons.Stored = {} end @@ -62,7 +82,7 @@ function component:Build(parent: types.Page): () end end -function component:Update(command: string, parameters: {}): () +function component:Update(command: string, parameters: {}?): () if self._.UpdateCallbacks[command] then self._.UpdateCallbacks[command](self, parameters) else @@ -91,11 +111,21 @@ function component:Close(): () end function component:Clean(): () + self:CloseAllButtons() + if self.Container then self.Container:Remove() end +end + +function component:Remove(): () + self:Clean() self:RemoveButtons() + + if self.Frame then + self.Frame:Destroy() + end end return module \ No newline at end of file diff --git a/src/Shared/Modules/Managers/UIManager/Page.lua b/src/Shared/Modules/Managers/UIManager/Page.lua index 7cce007..dd92937 100644 --- a/src/Shared/Modules/Managers/UIManager/Page.lua +++ b/src/Shared/Modules/Managers/UIManager/Page.lua @@ -35,8 +35,43 @@ function page:AddButton(button: types.Button) self.Buttons.Stored[button.Name] = button end -function page:RemoveButtons() +function page:GetButton(button: string): types.Component + return self.Buttons.Stored[button] +end + +function page:OpenButton(component: string) + local buttonModule= self.Buttons.Stored[component] + if buttonModule then + buttonModule:Build(self) + buttonModule:Open() + self.Buttons.Active[component] = buttonModule + end +end + +function page:CloseButton(component: string) + local buttonModule= self.Buttons.Active[component] + if buttonModule then + buttonModule:Close() + buttonModule:Clean() + self.Buttons.Active[component] = nil + end +end + +function page:CloseAllButtons() + for _, button: types.Button in self.Buttons.Active do + button:Close() + end + self.Buttons.Active = {} +end + +function page:RemoveButtons() + self:CloseAllButtons() + + for _, button: types.Button in self.Buttons.Stored do + button:Remove() + end + self.Buttons.Stored = {} end @@ -58,9 +93,43 @@ function page:GetComponent(component: string): types.Component return self.Components.Stored[component] end +function page:OpenComponent(component: string) + local componentModule= self.Components.Stored[component] + if componentModule then + componentModule:Build(self) + componentModule:Open() + self.Components.Open[component] = componentModule + end +end + +function page:CloseComponent(component: string) + local componentModule= self.Components.Open[component] + if componentModule then + componentModule:Close() + componentModule:Clean() + self.Components.Open[component] = nil + end +end + +function page:CleanComponents() + for _, component: types.Component in self.Components.Open do + component:Close() + end + + for _, component: types.Component in self.Components.Stored do + component:Clean() + end + + self.Components.Open = {} +end + function page:RemoveComponents() for _, component: types.Component in self.Components.Open do - component:Clean() + component:Close() + end + + for _, component: types.Component in self.Components.Stored do + component:Remove() end self.Components.Open = {} @@ -116,14 +185,19 @@ function page:Close() end function page:Clean() - self:RemoveComponents() - self:RemoveButtons() + self:CleanComponents() + self:CloseAllButtons() - self.Container:Remove() + if self.Container then + self.Container:Remove() + end end function page:Remove() self:Clean() + + self:RemoveComponents() + self:RemoveButtons() if self.Frame then self.Frame:Destroy() diff --git a/src/Shared/Modules/Managers/UIManager/Types.lua b/src/Shared/Modules/Managers/UIManager/Types.lua index b11e85f..c38d44c 100644 --- a/src/Shared/Modules/Managers/UIManager/Types.lua +++ b/src/Shared/Modules/Managers/UIManager/Types.lua @@ -37,6 +37,8 @@ export type ButtonClass = { Released: (self: Button) -> (), Hovered: (self: Button) -> (), HoverLeft: (self: Button) -> (), + + Remove: (self: Button) -> (), } export type Button = typeof(setmetatable({} :: ButtonClass, {})) @@ -57,6 +59,7 @@ export type ComponentClass = { BuildButtons: (self: Component) -> (), AddButton: (self: Component, button: Button) -> (), + CloseAllButtons: (self: Component) -> (), RemoveButtons: (self: Component) -> (), _: { @@ -73,11 +76,12 @@ export type ComponentClass = { OnClose: (self: Component, callback: (self: Component) -> ()) -> (), Build: (self: Component, parent: Page) -> (), - Update: (self: Component, command: string, parameters: {}) -> (), + Update: (self: Component, command: string, parameters: {}?) -> (), Open: (self: Component) -> (), Close: (self: Component) -> (), Clean: (self: Component) -> (), + Remove: (self: Component) -> (), } export type Component = typeof(setmetatable({} :: ComponentClass, {})) @@ -98,6 +102,10 @@ export type PageClass = { BuildButtons: (self: Page) -> (), AddButton: (self: Page, button: Button) -> (), + GetButton: (self: Page, button: string) -> (), + OpenButton: (self: Page, button: string) -> (), + CloseButton: (self: Page, button: string) -> (), + CloseAllButtons: (self: Page) -> (), RemoveButtons: (self: Page) -> (), Components: { @@ -108,6 +116,9 @@ export type PageClass = { BuildComponents: (self: Page) -> (), AddComponent: (self: Page, component: Component) -> (), GetComponent: (self: Page, component: string) -> (), + OpenComponent: (self: Page, component: string) -> (), + CloseComponent: (self: Page, component: string) -> (), + CleanComponents: (self: Page) -> (), RemoveComponents: (self: Page) -> (), _: { @@ -145,8 +156,11 @@ export type WindowClass = { BuildPages: (self: Window) -> (), AddPage: (self: Window, page: Page) -> (), - GetPage: (self: Page, page: string) -> (), + GetPage: (self: Window, page: string) -> (), + OpenPage: (self: Window, page: string) -> (), + ClosePage: (self: Window, page: string) -> (), RemovePages: (self: Window) -> (), + CleanPages: (self: Window) -> (), _: { OnBuild: (self: Window) -> ()?, @@ -209,6 +223,11 @@ export type Manager = { ]=] CloseWindow: (self: Manager, window: Window) -> (), + --[=[ + Close and remove all open ```Window``` objects and log their state changes. + ]=] + CloseAllWindows: (self: Manager) -> (), + --[=[ Intended to only be run on the first time that the client boots up. \ Receives a table of module scripts with which it will use to build the manager windows. diff --git a/src/Shared/Modules/Managers/UIManager/Window.lua b/src/Shared/Modules/Managers/UIManager/Window.lua index c5451b2..cb9055d 100644 --- a/src/Shared/Modules/Managers/UIManager/Window.lua +++ b/src/Shared/Modules/Managers/UIManager/Window.lua @@ -33,6 +33,33 @@ function window:GetPage(page: string): types.Page return self.Pages.Stored[page] end +function window:OpenPage(page: string) + local pageModule: types.Page = self.Pages.Stored[page] + if pageModule then + pageModule:Build(self) + pageModule:Open() + self.Pages.Open[page] = pageModule + end +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 + 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:RemovePages() for _, page: types.Page in self.Pages.Open do page:Remove() @@ -85,11 +112,12 @@ function window:Close() end function window:Clean() - self:RemovePages() + self:CleanPages() end function window:Remove() self:Clean() + self:RemovePages() if self.ScreenGui then self.ScreenGui:Destroy() diff --git a/src/Shared/Modules/Managers/UIManager/init.lua b/src/Shared/Modules/Managers/UIManager/init.lua index 4360c55..0a12be2 100644 --- a/src/Shared/Modules/Managers/UIManager/init.lua +++ b/src/Shared/Modules/Managers/UIManager/init.lua @@ -29,6 +29,15 @@ function manager:CloseWindow(window: types.Window) self.Windows.Open[window.Name] = nil end +function manager:CloseAllWindows() + for _, window in self.Windows.Open do + window:Close() + window:Remove() + end + + self.Windows.Open = {} +end + function manager:Build(source: { ModuleScript }) self:Clean()