tuikit/core/widget.py
changeset 109 105b1affc3c2
parent 97 0c2e0c09ba5c
child 111 b055add74b18
--- a/tuikit/core/widget.py	Fri Mar 28 19:58:59 2014 +0100
+++ b/tuikit/core/widget.py	Wed Sep 03 19:08:21 2014 +0200
@@ -1,5 +1,6 @@
 from tuikit.core.coords import Point, Size
 from tuikit.core.theme import default_theme
+from tuikit.core.signal import Signal
 
 import logging
 
@@ -12,7 +13,6 @@
 
     def __init__(self):
         self._num_instances += 1
-        self._log = logging.getLogger(__name__)
 
         #: Widget name is used for logging etc. Not visible anywhere.
         self.name = '{}{}'.format(
@@ -44,6 +44,13 @@
         #: None means no cursor (hidden).
         self._cursor = None
 
+        #: Hidden widget does not affect layout.
+        self.hidden = False
+        #: Allow keyboard focus for this widget.
+        self.allow_focus = False
+
+        self.sig_keypress = Signal(allow_stop=True)
+
     ## position and size ##
 
     @property
@@ -73,8 +80,8 @@
 
     def draw(self, buffer):
         """Draw self into buffer."""
-        self._log.debug('%s draw into %r at %s (exposed %s)',
-                        self.name, buffer, buffer.origin, self.exposed(buffer))
+        self.log.debug('Draw into %r at %s (exposed %s)',
+                       buffer, buffer.origin, self.exposed(buffer))
 
     def set_theme(self, theme):
         self.theme = theme
@@ -99,8 +106,19 @@
     ## input events ##
 
     def keypress(self, keyname, char, mod):
-        self._log.debug('%s keypress(%r, %r, %r)',
-                        self.name, keyname, char, mod)
+        """Keypress event handler.
+
+        Override to accept keyboard input.
+
+        Returns True if event was consumed.
+
+        Call this implementation from inherited classes
+        if it does not consume the event.
+
+        """
+        if self.sig_keypress(keyname, char, mod):
+            return True
+        self.log.debug('Not consumed: keypress(%r, %r, %r)', keyname, char, mod)
 
     ## timeouts ##
 
@@ -115,3 +133,20 @@
 
         """
         self.parent.remove_timeout(self, callback, *args)
+
+    ## focus ##
+
+    def can_focus(self):
+        return not self.hidden and self.allow_focus
+
+    def has_focus(self):
+        if self.parent is None:
+            return True
+        return (self.parent.has_focus()
+            and self.parent.focus_widget == self)
+
+    ## utilities ##
+
+    @property
+    def log(self):
+        return logging.getLogger('tuikit.' + self.name)