tuikit/core/widget.py
author Radek Brich <radek.brich@devl.cz>
Thu, 27 Mar 2014 08:03:51 +0100
changeset 93 c1e79acb9fcb
parent 92 b97c4e25ed6d
child 94 e50dae408fe9
permissions -rw-r--r--
Add Layout, FixedLayout.

from tuikit.core.coords import Point, Size
from tuikit.core.theme import default_theme


class Widget:

    """Base class for all widgets."""

    _num_instances = 0

    def __init__(self):
        #: Widget name is used for logging etc. Not visible anywhere.
        self._num_instances += 1
        self.name = '{}{}'.format(
            self.__class__.__name__,
            self._num_instances)

        #: Parent Widget
        self.parent = None
        #: Window owning this Widget
        self.window = None
        #: Theme
        self.theme = default_theme

        #: Position inside parent widget. Modified by layout manager.
        self.pos = Point()
        #: Actual size. Modified by layout manager.
        self._size = Size(10, 10)

        #: Requested size. Layout manager will use this when placing the widget.
        self.sizereq = Size(1, 1)
        #: Minimal size of widget. Widget will never be sized smaller than this.
        self.sizemin = Size(1, 1)
        #: Maximum size of widget. Widget will never be sized bigger than this.
        #: None means no maximum size (infinite).
        self.sizemax = Size(None, None)

    ## position and size ##

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

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

    @property
    def width(self):
        return self.size.w

    @property
    def height(self):
        return self.size.h

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

    def resize(self, w, h):
        self._size.update(w, h)

    ## appearance ##

    def draw(self, buffer, x, y):
        pass

    def set_theme(self, theme):
        self.theme = theme

    ## timeouts ##

    def add_timeout(self, delay, callback, *args):
        """Register `callback` to be called after `delay` seconds."""
        self.parent.add_timeout(self, delay, callback, *args)

    def remove_timeout(self, callback, *args):
        """Unregister callback previously registered with add_timeout.

        Removes all timeouts with the `callback` and `args`.

        """
        self.parent.remove_timeout(self, callback, *args)