tuikit/core/window.py
author Radek Brich <radek.brich@devl.cz>
Wed, 03 Sep 2014 19:08:21 +0200
changeset 109 105b1affc3c2
parent 97 0c2e0c09ba5c
child 111 b055add74b18
permissions -rw-r--r--
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