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)