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