Create ObjectList.luau
This commit is contained in:
parent
43f697915d
commit
207dcc009d
1 changed files with 126 additions and 0 deletions
126
src/Shared/Modules/Managers/UIManager/ObjectList.luau
Normal file
126
src/Shared/Modules/Managers/UIManager/ObjectList.luau
Normal file
|
@ -0,0 +1,126 @@
|
||||||
|
local types = require(script.Parent.Types)
|
||||||
|
|
||||||
|
local module = {}
|
||||||
|
|
||||||
|
local list = {}
|
||||||
|
list["__index"] = list
|
||||||
|
|
||||||
|
function module.new<T, P>(): types.ObjectList<T, P>
|
||||||
|
local self = setmetatable({
|
||||||
|
Parent = nil,
|
||||||
|
|
||||||
|
Opened = {},
|
||||||
|
Built = {},
|
||||||
|
Stored = {},
|
||||||
|
}, list)
|
||||||
|
|
||||||
|
return self
|
||||||
|
end
|
||||||
|
|
||||||
|
function list:Add(object: types.ListableObject)
|
||||||
|
self.Stored[object.Name] = object
|
||||||
|
end
|
||||||
|
|
||||||
|
function list:Get(name: string): types.ListableObject?
|
||||||
|
return self.Stored[name]
|
||||||
|
end
|
||||||
|
|
||||||
|
function list:Remove(name: string)
|
||||||
|
self:Clean(name)
|
||||||
|
self.Stored[name] = nil
|
||||||
|
end
|
||||||
|
|
||||||
|
function list:RemoveAll()
|
||||||
|
self:CleanAll()
|
||||||
|
self.Stored = {}
|
||||||
|
end
|
||||||
|
|
||||||
|
function list:Open(name: string, mode: ("Weighted" | "Forced")?)
|
||||||
|
local objectToBuild = self.Built[name]
|
||||||
|
if objectToBuild and objectToBuild:StatusIs("Built") then
|
||||||
|
if mode and mode == "Weighted" and objectToBuild.Weight then
|
||||||
|
for openName: string, status: boolean in self.Opened do
|
||||||
|
local openObject = self.Built[openName]
|
||||||
|
if status == true and openObject.Weight and openObject.Weight < objectToBuild.Weight then
|
||||||
|
self:Close(openName)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
elseif mode == "Forced" then
|
||||||
|
self:CloseAll()
|
||||||
|
end
|
||||||
|
|
||||||
|
objectToBuild:Open()
|
||||||
|
self.Opened[name] = true
|
||||||
|
|
||||||
|
self.LastOpenedName = self.RecentlyOpenedName or name
|
||||||
|
self.RecentlyOpenedName = name
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function list:OpenAll()
|
||||||
|
for name: string, _: types.ListableObject in self.Stored do
|
||||||
|
self:Open(name)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function list:OpenPrevious()
|
||||||
|
self:Open(self.LastOpenedName, "Forced")
|
||||||
|
end
|
||||||
|
|
||||||
|
function list:Close(name: string)
|
||||||
|
if self.Built[name] then
|
||||||
|
self.Built[name]:Close()
|
||||||
|
self.Opened[name] = false
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function list:CloseAll()
|
||||||
|
for name: string, status: boolean in self.Opened do
|
||||||
|
if status == true then
|
||||||
|
self:Close(name)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
self.Opened = {}
|
||||||
|
end
|
||||||
|
|
||||||
|
function list:Build(name: string)
|
||||||
|
local object = self.Stored[name]
|
||||||
|
if object and not object:StatusIs("Built") then
|
||||||
|
object:Build(self.Parent)
|
||||||
|
self.Built[name] = object
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function list:BuildAll()
|
||||||
|
for _, object in self.Stored do
|
||||||
|
if object:StatusIs("Built") then
|
||||||
|
continue
|
||||||
|
end
|
||||||
|
task.spawn(function()
|
||||||
|
object:Build(self.Parent)
|
||||||
|
self.Built[object.Name] = object
|
||||||
|
end)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function list:Clean(name: string)
|
||||||
|
local object = self.Built[name]
|
||||||
|
if object then
|
||||||
|
if object["Clean"] then
|
||||||
|
self.Built[name]:Clean()
|
||||||
|
end
|
||||||
|
|
||||||
|
self.Built[name] = nil
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function list:CleanAll()
|
||||||
|
for _, object in self.Stored do
|
||||||
|
self:Clean(object.Name)
|
||||||
|
end
|
||||||
|
|
||||||
|
self.Built = {}
|
||||||
|
end
|
||||||
|
|
||||||
|
return module
|
Loading…
Reference in a new issue