quad/testing/test/tracker.lua
2023-02-19 09:29:48 +09:00

111 lines
2.1 KiB
Lua

-- module name : handling rojo tree changes
if false then if not task then _G.task = {} end end
---@class tracker_rojo
local module = {}
module.__index = module
module.scheduleDelay = 1
function module:__emit(eventName,...)
for _,func in ipairs(self.events[eventName]) do
func(...)
end
end
function module:__update()
-- do updates
self:__emit("updated")
end
function module:__scheduleUpdate()
-- already timer setted
if self.__onTimer then return end
self.__onTimer = true
task.delay(self.scheduleDelay,function ()
self.__onTimer = false
self:__update()
end)
end
function module:__track(ins)
self.connections[ins] = ins.Changed:Connect(function ()
self:__scheduleUpdate()
end)
end
function module:__drop(ins)
local signal = self.connections[ins]
if type(signal) == "table" then
for _,v in pairs(signal) do
v:Disconnect()
end
self.connections[ins] = nil
elseif signal then
signal:Disconnect()
self.connections[ins] = nil
end
end
function module:init()
local mainConnections = {}
self.connections[self.main] = mainConnections
mainConnections[1] = self.main.DescendantAdded:Connect(function (ins)
self:__track(ins)
self:__scheduleUpdate()
end)
for _,ins in pairs(self.main:GetDescendants()) do
self:__track(ins)
end
mainConnections[2] = self.main.DescendantRemoving:Connect(function (ins)
self:__drop(ins)
self:__scheduleUpdate()
end)
self:__track(self.main)
mainConnections[3] = self.main.Destroying:Connect(function ()
self:__drop(self.main)
end)
self:__scheduleUpdate()
return self
end
function module:connect(eventName,func)
table.insert(self.events[eventName],func)
end
function module:deinit()
for i,signal in pairs(self.connections) do
if type(signal) == "table" then
for _,v in pairs(signal) do
signal:Disconnect()
end
self.connections[i] = nil
elseif signal then
signal:Disconnect()
self.connections[i] = nil
end
end
end
---@return tracker_rojo
function module.new(ins)
local this = {
main = ins,
connections = {},
events = {
updated = {},
},
__onTimer = false,
}
setmetatable(this,module)
return this
end
return module