tuikit/core/window.py
author Radek Brich <radek.brich@devl.cz>
Wed, 19 Mar 2014 00:32:38 +0100
changeset 89 94f5baef19ac
parent 88 90d00354dc70
child 90 781774a8d568
permissions -rw-r--r--
Add Theme, Button.

from tuikit.core.buffer import Buffer
from tuikit.core.signal import Signal
from tuikit.core.container import Container
from tuikit.core.coords import Point
from tuikit.core.theme import default_theme


class Window(Container):

    """Window is rectangular part of screen containing widgets.

    Widgets are drawn into window, events are routed to widgets through window.

    """

    def __init__(self, buffer=None):
        """New buffer for the window will be created unless given existing
        `buffer` as parameter."""
        Container.__init__(self)
        self.pos = Point()
        self._buffer = None
        self.sig_resized = Signal()
        self.buffer = buffer or Buffer()

    @property
    def x(self):
        return self.pos.x

    @property
    def y(self):
        return self.pos.y

    @property
    def buffer(self):
        return self._buffer

    @buffer.setter
    def buffer(self, buffer):
        # disconnect signals from old buffer
        if self._buffer:
            self.sig_resized.disconnect(self._buffer.resize)
        # replace the buffer
        self._buffer = buffer
        # resize buffer when window gets resized
        self.sig_resized.connect(buffer.resize)

    @property
    def size(self):
        return self.buffer.size.readonly()

    def resize(self, w, h):
        self.buffer.resize(w, h)
        self.sig_resized(w, h)
        self.redraw()

    def redraw(self):
        Container.draw(self, self.buffer)
        self.buffer.puts(10, 5, '{0.w} {0.h}'.format(self.size))
        self.buffer.frame()

    def draw(self, buffer, x=0, y=0):
        """Draw this window into `buffer` at x/y coords."""
        buffer.draw(self.buffer, x, y)


class WindowManager:

    def __init__(self, theme=default_theme):
        self.windows = []
        self.theme = theme

    def add(self, window):
        self.windows.append(window)
        window.set_theme(self.theme)

    def set_theme(self, theme):
        self.theme = theme
        for window in self.windows:
            window.set_theme(theme)

    def resize(self, w, h):
        self.windows[0].resize(w, h)

    def draw(self, buffer, x=0, y=0):
        for window in self.windows:
            window.draw(buffer,
                        x + window.x,
                        y + window.y)

#    def keypress(self, keyname, char, mod=0):

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