Update keypress propagation. Allow focus change by tab key. Add log property to Widget for smart logging.
from tuikit.core.buffer import Buffer
from tuikit.core.signal import Signal
from tuikit.core.container import Container
class Window(Container):
"""Window is rectangular part of screen containing widgets.
Widgets are drawn into window, events are routed to widgets through window.
Parent of Window is always WindowManager.
"""
def __init__(self, buffer=None):
"""New buffer for the window will be created unless given existing
`buffer` as parameter."""
Container.__init__(self)
self.allow_focus = True
self.trap_focus = True
self._buffer = None
self.buffer = buffer or Buffer()
@property
def buffer(self):
return self._buffer
@buffer.setter
def buffer(self, buffer):
# replace the buffer
self._buffer = buffer
@property
def size(self):
return self.buffer.size
def resize(self, w, h):
"""Resize buffer when window gets resized."""
Container.resize(self, w, h)
self.buffer.resize(w, h)
self.redraw()
def redraw(self):
self.buffer.reset_origin()
Container.draw(self, self.buffer)
self.buffer.puts('{0.w} {0.h}'.format(self.size), 10, 5)
self.buffer.frame()
def draw(self, buffer):
"""Draw this window into `buffer`."""
self.redraw()
buffer.draw(self.buffer)
class WindowManager(Container):
def __init__(self, timer):
Container.__init__(self)
self.timer = timer
def draw(self, buffer):
Container.draw(self, buffer)
self.log.debug('%s has focus.', self.get_focused_widget().name)
def resize(self, w, h):
self._widgets[0].resize(w, h)
def keypress(self, keyname, char, mod):
self.log.debug('keypress(%r, %r, %r)', keyname, char, mod)
return Container.keypress(self, keyname, char, mod)
def handle_event(self, event_name, *args):
"""Handle input event to managed windows."""
handler = getattr(self, event_name, None)
if handler:
handler(*args)
else:
raise Exception('Unknown event: %r %r' % (event_name, args))
def get_focused_widget(self):
"""Traverse the widget hierarchy to bottom
and return actually focused Widget."""
node = self
while isinstance(node, Container) and node.focus_widget:
node = node.focus_widget
return node