tuikit/core/window.py
author Radek Brich <radek.brich@devl.cz>
Wed, 03 Sep 2014 21:56:20 +0200
changeset 113 6796adfdc7eb
parent 112 ce2e67e7bbb8
parent 108 11dac45bfba4
child 114 26c02bd94bd9
permissions -rw-r--r--
Merge. Due to my schizophrenia, I've accidentally forked my own code. The other set of changes were found in another computer.

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):
        Container.resize(self, w, h)
        self._widgets[0].resize(w, h)

    def keypress_event(self, ev):
        self.log.debug('%s', ev)
        return Container.keypress_event(self, ev)

    def handle_event(self, event):
        """Handle input event to managed windows."""
        self.log.debug('Handle event: %r', event)
        handler = getattr(self, event.name + '_event', None)
        if handler:
            handler(event)
        else:
            raise Exception('Unknown event: %r' % event)

    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

    def get_cursor_if_visible(self):
        if self.cursor_visible:
            return self.cursor