tuikit/layouts/fixed.py
changeset 116 165b5d65e1cb
parent 115 b4ff7392003a
child 117 8680c2333546
equal deleted inserted replaced
115:b4ff7392003a 116:165b5d65e1cb
     1 from .layout import Layout
     1 from .layout import Layout
     2 
     2 
     3 
     3 
     4 class FixedLayout(Layout):
     4 class FixedLayout(Layout):
     5 
     5 
     6     def update(self, _w, _h):
     6     """Widgets are placed on fixed position as specified in `sizereq`.
       
     7 
       
     8     Align hints (kwargs to :meth:`add`):
       
     9         * halign = 'left' (default) | 'right' | 'fill' | 'center'
       
    10         * valign = 'top' (default) | 'bottom' | 'fill' | 'center'
       
    11 
       
    12     """
       
    13 
       
    14     def __init__(self):
       
    15         Layout.__init__(self)
       
    16         self._widget_hints = {}  # Widget : (halign, valign)
       
    17 
       
    18     def add(self, widget, *args, **kwargs):
       
    19         Layout.add(self, widget)
       
    20         assert len(args) == 0, \
       
    21             "FixedLayout does not support positional hint args: %s" % args
       
    22         assert all(key in ('halign', 'valign') for key in kwargs.keys()), \
       
    23             "Unsupported hints: %s" % tuple(kwargs.keys())
       
    24         halign = kwargs.get('halign', 'left')
       
    25         valign = kwargs.get('valign', 'top')
       
    26         self._widget_hints[widget] = (halign, valign)
       
    27 
       
    28     def update(self, w, h):
     7         for widget in self._managed_widgets:
    29         for widget in self._managed_widgets:
     8             widget.resize(*widget.sizereq)
    30             halign, valign = self._widget_hints[widget]
     9             widget.pos.update(*widget.posreq)
    31             px, py = widget.posreq
       
    32             sw, sh = widget.sizereq
       
    33             if halign == 'right':   px = w - px
       
    34             if valign == 'bottom':  py = h - py
       
    35             if halign == 'fill':    px = 0; sw = w
       
    36             if valign == 'fill':    py = 0; sh = h
       
    37             if halign == 'center':  px = (w - sw) // 2
       
    38             if valign == 'center':  py = (h - sh) // 2
       
    39             widget.resize(sw, sh)
       
    40             widget.pos.update(px, py)