tuikit/widget.py
changeset 9 7175ed629a76
parent 5 ae128c885d0f
child 13 19ebde2fd594
--- a/tuikit/widget.py	Wed Apr 13 13:07:26 2011 +0200
+++ b/tuikit/widget.py	Sun Jul 31 13:04:39 2011 +0200
@@ -2,9 +2,16 @@
 
 import curses
 
+from .eventsource import EventSource
 
-class Widget:
+
+class Widget(EventSource):
+
+    """Base class for all widgets."""
+
     def __init__(self, width = 10, height = 10):
+        EventSource.__init__(self)
+
         self.parent = None
         self.top = None
         # placing - set by parent widget's layout manager
@@ -24,17 +31,16 @@
         self._redraw = True
         self.hidden = False
         # event handlers
-        self.event = {
-            'resize' : [],
-            'draw' : [],
-            'focus' : [],
-            'unfocus' : [],
-            'keypress' : [],
-            'mousedown' : [],
-            'mouseup' : [],
-            'mousemove' : [],
-            'mousewheel' : [],
-            }
+        self.addevents(
+            'resize',
+            'draw',
+            'focus',
+            'unfocus',
+            'keypress',
+            'mousedown',
+            'mouseup',
+            'mousemove',
+            'mousewheel')
 
 
     @property
@@ -60,37 +66,7 @@
         self.top = top
 
 
-    ### event management
-
-
-    def newevent(self, event):
-        self.event[event] = []
-
-
-    def connect(self, event, handler):
-        if event in list(self.event.keys()):
-            self.event[event] += [handler]
-
-
-    def disconnect(self, event, handler=None):
-        if event in list(self.event.keys()):
-            if handler:
-                i = self.event[event].index(handler)
-                del self.event[event][i]
-            else:
-                self.event[event] = []
-
-
-    def handle(self, event, *args, **kwargs):
-        for handler in self.event[event]:
-            handler(*args, **kwargs)
-
-
-    def emit(self, event, *args, **kwargs):
-        getattr(self, event)(*args, **kwargs)
-
-
-    ###
+    ### events
 
 
     def resize(self):
@@ -124,26 +100,26 @@
         return bool(self.event['keypress'])
 
 
+    def hasfocus(self):
+        return self.top.focuswidget == self
+
+
     def setfocus(self):
-        if self.hasfocus():
+        if self.hasfocus() or not self.canfocus():
             return
         if self.top.focuswidget:
-            self.top.focuswidget.unfocus(self)
+            self.top.focuswidget.resetfocus()
         self.top.focuswidget = self
         self.emit('focus')
 
 
-    def unfocus(self):
+    def resetfocus(self):
         if self.top.focuswidget != self:
             return
         self.top.focuswidget = None
         self.emit('unfocus')
 
 
-    def hasfocus(self):
-        return self.top.focuswidget == self
-
-
     def focus(self):
         '''handle focus event'''
         self.handle('focus')
@@ -154,11 +130,13 @@
         self.handle('unfocus', newfocus)
 
 
-    ###
+    ### events
 
 
     def keypress(self, keyname, char):
-        self.handle('keypress', keyname, char)
+        handled = self.handle('keypress', keyname, char)
+        if not handled and self.parent and self.parent != self.top:
+            self.parent.emit('keypress', keyname, char)
 
 
     def mousedown(self, ev):
@@ -178,6 +156,9 @@
         self.handle('mousewheel', ev)
 
 
+    ###
+
+
     def enclose(self, x, y):
         if self.hidden:
             return False