tuikit/layouts/fixed.py
author Radek Brich <radek.brich@devl.cz>
Sun, 15 Feb 2015 17:50:24 +0100
changeset 116 165b5d65e1cb
parent 115 b4ff7392003a
child 117 8680c2333546
permissions -rw-r--r--
Drop AnchorLayout, merge its features into FixedLayout.

from .layout import Layout


class FixedLayout(Layout):

    """Widgets are placed on fixed position as specified in `sizereq`.

    Align hints (kwargs to :meth:`add`):
        * halign = 'left' (default) | 'right' | 'fill' | 'center'
        * valign = 'top' (default) | 'bottom' | 'fill' | 'center'

    """

    def __init__(self):
        Layout.__init__(self)
        self._widget_hints = {}  # Widget : (halign, valign)

    def add(self, widget, *args, **kwargs):
        Layout.add(self, widget)
        assert len(args) == 0, \
            "FixedLayout does not support positional hint args: %s" % args
        assert all(key in ('halign', 'valign') for key in kwargs.keys()), \
            "Unsupported hints: %s" % tuple(kwargs.keys())
        halign = kwargs.get('halign', 'left')
        valign = kwargs.get('valign', 'top')
        self._widget_hints[widget] = (halign, valign)

    def update(self, w, h):
        for widget in self._managed_widgets:
            halign, valign = self._widget_hints[widget]
            px, py = widget.posreq
            sw, sh = widget.sizereq
            if halign == 'right':   px = w - px
            if valign == 'bottom':  py = h - py
            if halign == 'fill':    px = 0; sw = w
            if valign == 'fill':    py = 0; sh = h
            if halign == 'center':  px = (w - sw) // 2
            if valign == 'center':  py = (h - sh) // 2
            widget.resize(sw, sh)
            widget.pos.update(px, py)