--- 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)