Python-With-Gtk-Template/src/utils/event_system.py

55 lines
1.5 KiB
Python
Raw Normal View History

2022-09-05 23:01:39 +00:00
# Python imports
2022-10-01 04:35:03 +00:00
from collections import defaultdict
2022-09-05 23:01:39 +00:00
# Lib imports
# Application imports
class EventSystem:
2022-10-01 04:35:03 +00:00
""" Create event system. """
2022-09-05 23:01:39 +00:00
def __init__(self):
2022-10-01 04:35:03 +00:00
self.subscribers = defaultdict(list)
def subscribe(self, event_type, fn):
self.subscribers[event_type].append(fn)
2023-01-23 01:52:53 +00:00
def unsubscribe(self, event_type, fn):
self.subscribers[event_type].remove(fn)
def unsubscribe_all(self, event_type):
self.subscribers.pop(event_type, None)
2022-10-01 04:35:03 +00:00
def emit(self, event_type, data = None):
if event_type in self.subscribers:
for fn in self.subscribers[event_type]:
if data:
if hasattr(data, '__iter__') and not type(data) is str:
fn(*data)
else:
fn(data)
else:
fn()
2023-01-23 01:52:53 +00:00
def emit_and_await(self, event_type, data = None):
""" NOTE: Should be used when signal has only one listener and vis-a-vis """
if event_type in self.subscribers:
2023-03-07 03:26:48 +00:00
response = None
2023-01-23 01:52:53 +00:00
for fn in self.subscribers[event_type]:
if data:
if hasattr(data, '__iter__') and not type(data) is str:
2023-03-07 03:26:48 +00:00
response = fn(*data)
2023-01-23 01:52:53 +00:00
else:
2023-03-07 03:26:48 +00:00
response = fn(data)
2023-01-23 01:52:53 +00:00
else:
2023-03-07 03:26:48 +00:00
response = fn()
if not response in (None, ''):
break
return response