tuikit/layouts/fixed.py
changeset 116 165b5d65e1cb
parent 115 b4ff7392003a
child 117 8680c2333546
--- a/tuikit/layouts/fixed.py	Sun Feb 15 12:52:46 2015 +0100
+++ b/tuikit/layouts/fixed.py	Sun Feb 15 17:50:24 2015 +0100
@@ -3,7 +3,38 @@
 
 class FixedLayout(Layout):
 
-    def update(self, _w, _h):
+    """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:
-            widget.resize(*widget.sizereq)
-            widget.pos.update(*widget.posreq)
+            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)