PGRData/Script/matrix/xmanager/XEventManager.lua
2024-09-01 22:49:41 +02:00

158 lines
No EOL
4.5 KiB
Lua

XEventManager = XEventManager or {}
local ListenersMap = {}
local DelayRemoveMap = {}
local IsRunning = false
function XEventManager.AddEventListener(eventId, func, obj)
local listenerList = ListenersMap[eventId]
if (not listenerList) then
listenerList = {}
end
local funcList = listenerList[func]
if (obj) then
if (not funcList) then
funcList = {}
end
funcList[obj] = obj
listenerList[func] = funcList
else
listenerList[func] = func
end
ListenersMap[eventId] = listenerList
return { eventId, func, obj }
end
function XEventManager.RemoveEventListener(eventId, func, obj)
if IsRunning then
DelayRemoveMap[eventId] = DelayRemoveMap[eventId] or {}
DelayRemoveMap[eventId][func] = DelayRemoveMap[eventId][func] or {}
if obj then
DelayRemoveMap[eventId][func][obj] = true
else
DelayRemoveMap[eventId][func][func] = true
end
return
end
local listenerList = ListenersMap[eventId]
if (not listenerList) then
return
end
local funcList = listenerList[func]
if (obj) then
if (not funcList) then
return
end
funcList[obj] = nil
if XTool.IsTableEmpty(funcList) then
listenerList[func] = nil
end
else
listenerList[func] = nil
end
if XTool.IsTableEmpty(listenerList) then
ListenersMap[eventId] = nil
end
end
function XEventManager.RemoveAllListener()
ListenersMap = {}
end
function XEventManager.DispatchEvent(eventId, ...)
XUIEventBind.DispatchEvent(eventId, ...)
local listenerList = ListenersMap[eventId]
if (not listenerList) then
return
end
IsRunning = true
local tempList = {}
for f,listener in pairs(listenerList) do
tempList[f] = {}
if (type(listener) == "table") then
for _,obj in pairs(listener) do
tempList[f][obj] = obj
end
else
tempList[f] = f
end
end
for f, listener in pairs(tempList) do
if (type(listener) == "table") then
for _, obj in pairs(listener) do
if not DelayRemoveMap[eventId] or not DelayRemoveMap[eventId][f] or not DelayRemoveMap[eventId][f][obj]
or not DelayRemoveMap[eventId][f][f] then
f(obj, ...)
end
end
else
if not DelayRemoveMap[eventId] or not DelayRemoveMap[eventId][f] or not DelayRemoveMap[eventId][f][f] then
f(...)
end
end
end
IsRunning = false
if next(DelayRemoveMap) then
for rmId, rmEventList in pairs(DelayRemoveMap) do
for rmF, rmFunclist in pairs(rmEventList) do
for obj, _ in pairs(rmFunclist) do
if obj == rmF then
XEventManager.RemoveEventListener(rmId, rmF)
else
XEventManager.RemoveEventListener(rmId, rmF, obj)
end
end
end
end
DelayRemoveMap = {}
end
end
------ 添加节点的绑定 --------
local NodeEventBindRecord = {}
function XEventManager.BindEvent(node, eventId, func, obj)
if not NodeEventBindRecord[node] then
NodeEventBindRecord[node] = {}
end
local checkExist
if node.Exist then
checkExist = function() return node:Exist() end
else
local gameObject = node.GameObject or node.gameObject or node.Transform or node.transform
if gameObject and gameObject.Exist then
checkExist = function() return gameObject:Exist() end
end
end
local handler
if checkExist then
handler = XEventManager.AddEventListener(eventId, function(...)
if not checkExist() then
XEventManager.UnBindEvent(node)
else
if obj then
func(obj, ...)
else
func(...)
end
end
end)
else
handler = XEventManager.AddEventListener(eventId, func, obj)
end
table.insert(NodeEventBindRecord[node], handler)
return handler
end
function XEventManager.UnBindEvent(node)
if NodeEventBindRecord[node] then
for _, v in ipairs(NodeEventBindRecord[node]) do
XEventManager.RemoveEventListener(table.unpack(v))
end
NodeEventBindRecord[node] = nil
end
end