Files
robtl2-ComfyUI-ComfyBridge/Event.py
T
2024-11-12 23:08:40 +08:00

55 lines
1.8 KiB
Python

class EventMan:
event_dict = {}
GLOBAL_LISTENER = 'GlobalListener'
@classmethod
def clear(cls):
cls.event_dict = {}
@classmethod
def add(cls, event_name, callback, listener=None):
if event_name not in cls.event_dict:
cls.event_dict[event_name] = []
if listener is None:
listener = cls.GLOBAL_LISTENER
registered = False
for event in cls.event_dict[event_name]:
if event['listener'] == listener:
event['handler'].append(callback)
registered = True
break
if not registered:
cls.event_dict[event_name].append({'listener': listener, 'handler': [callback]})
@classmethod
def remove(cls, event_name, callback, listener=None):
if listener is None:
listener = cls.GLOBAL_LISTENER
if event_name in cls.event_dict:
for i in range(len(cls.event_dict[event_name]) - 1, -1, -1):
event_args = cls.event_dict[event_name][i]
if event_args['listener'] == listener:
if callback in event_args['handler']:
event_args['handler'].remove(callback)
if not event_args['handler']:
cls.event_dict[event_name].pop(i)
break
@classmethod
def trigger(cls, event_name, args=None, target=None):
if event_name not in cls.event_dict or not cls.event_dict[event_name]:
return
for event in reversed(cls.event_dict[event_name]):
if event['listener'] == target or target is None:
for handler in event['handler']:
if event['listener'] == cls.GLOBAL_LISTENER:
handler(args)
else:
handler(event['listener'], args)