forked from endernon/PGRData
158 lines
No EOL
4.5 KiB
Lua
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 |