# HG changeset patch # User phoku@33b003aa-7bff-0310-803a-e67f0ece8222 # Date 1223970785 0 # Node ID 63de2dea08e6b294d0b09c777c6134ca3986cee9 # Parent bb9902910067a5522bbdccf242b66cfde7655c71 * More documentation for layout system. * adaptLayout now acts a bit smarter. diff -r bb9902910067 -r 63de2dea08e6 engine/extensions/pychan/widgets.py --- a/engine/extensions/pychan/widgets.py Tue Oct 14 07:41:48 2008 +0000 +++ b/engine/extensions/pychan/widgets.py Tue Oct 14 07:53:05 2008 +0000 @@ -23,6 +23,9 @@ """ return text.replace('\t'," "*4).replace('[br]','\n') +def isLayouted(widget): + return isinstance(widget,LayoutBase) + class _DummyImage(object): def getWidth(self): return 0 def getHeight(self): return 0 @@ -221,14 +224,33 @@ widget = widget._parent return widget._visible - def adaptLayout(self): + def adaptLayout(self,recurse=True): """ Execute the Layout engine. Automatically called by L{show}. - In case you want to relayout a visible widget, you have to call this function - on the root widget. + In case you want to relayout a visible widget. + This function will automatically perform the layout adaption + from the top-most layouted widget. + + To make this clear consider this arrangement:: + VBox 1 + - Container + - VBox 2 + - HBox + - Label + + If you call adaptLayout on the Label the layout from the VBox 2 + will get recalculated, while the VBox 1 stays untouched. + + @param recurse Pass False here to force the layout to start from + this widget. """ - self._recursiveResizeToContent() - self._recursiveExpandContent() + widget = self + while widget.parent and recurse: + if not isLayouted(widget.parent): + break + widget = widget.parent + widget._recursiveResizeToContent() + widget._recursiveExpandContent() def beforeShow(self): """ @@ -758,6 +780,16 @@ and L{HBoxLayoutMixin} specialise on this by reimplementing the C{resizeToContent} and the C{expandContent} methods. + Dynamic Layouting + ----------------- + + The layout is calculated in the L{Widget.show} method. Thus if you modify the layout, + by adding or removing child widgets for example, you have to call L{Widget.adaptLayout} + so that the changes ripple through the widget hierachy. + + Internals + --------- + At the core the layout engine works in two passes: Before a root widget loaded by the XML code is shown, its resizeToContent method