tuikit/core/container.py
author Radek Brich <radek.brich@devl.cz>
Fri, 28 Mar 2014 19:58:59 +0100
changeset 97 0c2e0c09ba5c
parent 94 e50dae408fe9
child 104 742e504ec053
child 109 105b1affc3c2
permissions -rw-r--r--
Add TextField widget, keypress event, cursor.

from tuikit.core.widget import Widget
from tuikit.core.coords import Point
from tuikit.layouts.fixed import FixedLayout


class Container(Widget):

    """Container widget.

    Can contain other widgets to create hierarchical structure.

    """

    def __init__(self, layout_class=FixedLayout):
        Widget.__init__(self)
        #: List of child widgets.
        self.children = []
        self.focus_child = None
        self.layout = layout_class()

    def add(self, widget):
        """Add widget into container."""
        self.children.append(widget)
        widget.parent = self
        widget.window = self.window
        widget.set_theme(self.theme)
        self.layout.add(widget)
        if self.focus_child is None:
            self.focus_child = widget

    def resize(self, w, h):
        Widget.resize(self, w, h)
        self.layout.resize()

    def draw(self, buffer):
        """Draw child widgets."""
        Widget.draw(self, buffer)
        for child in self.children:
            with buffer.moved_origin(child.x, child.y):
                with buffer.clip(buffer.origin.x, buffer.origin.y,
                                 child.width, child.height):
                    child.draw(buffer)

    def set_theme(self, theme):
        Widget.set_theme(self, theme)
        for child in self.children:
            child.set_theme(theme)

    @property
    def cursor(self):
        if self.focus_child:
            cursor = self.focus_child.cursor
            if cursor is not None:
                return cursor.moved(*self.focus_child.pos)
        else:
            if self._cursor is not None:
                return Point(self._cursor)

    ## input events ##

    def keypress(self, keyname, char, mod=0):
        if self.focus_child:
            self.focus_child.keypress(keyname, char, mod)