initial import of ussd-pad
[ussd-widget] / ussd-pad / src / opt / ussd-pad / utils / EventEmitter.py
diff --git a/ussd-pad/src/opt/ussd-pad/utils/EventEmitter.py b/ussd-pad/src/opt/ussd-pad/utils/EventEmitter.py
new file mode 100644 (file)
index 0000000..a651eef
--- /dev/null
@@ -0,0 +1,60 @@
+import threading
+
+
+class EventEmitter(object):
+    """
+    Abstract base class for UI objects emitting events.
+    @since: 0.97
+    """
+
+    # static lock for blocking event handling
+    __events_lock = threading.Event()
+    
+    
+    def __init__(self):
+    
+        self.__handlers = {}
+        
+        
+    def has_events(self):
+    
+        return (len(self.__handlers) > 0)
+
+
+    def set_events_blocked(self, v):
+    
+        """
+        Sets the global lock for blocking events. While events are blocked,
+        no event handling takes place.
+        
+        @param value: whether events are blocked (True) or not (False)
+        """
+    
+        if (value):
+            self.__events_lock.set()
+        else:
+            self.__events_lock.clear()
+
+        
+    def _connect(self, ev_name, cb, *args):
+    
+        if (not ev_name in self.__handlers):
+            self.__handlers[ev_name] = []
+
+        if (not (cb, args) in self.__handlers[ev_name]):
+            self.__handlers[ev_name].append((cb, args))
+        
+        
+    def emit_event(self, ev_name, *args):
+
+        if (self.__events_lock.isSet()): return
+
+        for item in self.__handlers.get(ev_name, []):
+            cb, u_args = item
+            try:
+                a = args + u_args
+                cb(*a)
+            except:
+                import traceback; traceback.print_exc()
+        #end for
+