[ge-talk] A layout manager
Paul van Nugteren
pmvannugteren at eml.cc
Sun Aug 26 15:09:33 EDT 2007
That was sure interesting, are there any benchmarks for the LP model
made?
On Sun, 26 Aug 2007 18:55:39 +1200, "Christof Lutteroth"
<lutteroth at cs.auckland.ac.nz> said:
> Hi!
>
> Paul van Nugteren wrote:
> > There is something called liblayout made by Marco Nelissen, author of
> > the IMHO excellent SoundPlay. Anyway I'd be interested to know what the
> > differences are.
> >
> >> I am a researcher at university, and my colleagues and me, we have done
> >> some research on GUI layout. In particular, we are using linear
> >> programming to calculate a layout that is specified in terms of linear
> >> constraints, and higher-level constructs that are easier to use but can
> >> be translated to linear constraints, such as spreadsheet-like layout.
>
> I had a look at liblayout. I uses the containment hierarchy to arrange
> the controls in the GUI. That is, when programing the layout you have to
> decompose the GUI into horizontally and vertically aligned subgroups
> of controls, which are nested hierarchically. (liblayout also supports
> layered groups, but this is a different story.) Most common layout
> managers (e.g. in Java and .NET) provide such layout constructs, and
> simple layouts can be programmed easily with them.
>
> However, if the layouts are more complex, the containment hierarchy
> becomes deep and unwieldy. For example, consider a tabular layout. Say,
> you basically have a large table made up of cells, with controls in
> them, and now you want some controls to stretch over several adjacent
> rows and/or columns (like rowspan/colspan in HTML tables). This becomes
> increasingly complicated if you have to use the containment hierarchy.
> In fact, some such layouts cannot be created with only horizontal and
> vertically aligned groups of controls. Some other languages such as Java
> provide tabular layout containers such as GridBagLayout, but they still
> have issues (described in the paper) and are often quite hard to use.
>
> Then, by recursively splitting up the layout into subgroups, it becomes
> very hard (or even impossible) to maintain constraints on controls in
> different subgroups, e.g. "button X in the top row of controls has the
> same width as button Y in the right column of the GUI". For many more
> complex layouts, this can be important, though, in order to give a GUI a
> really consistent look.
>
> The linear programming approach (let's call it LP) does not need to use
> the containment hierarchy. Consider the whole GUI (or the part you want
> to lay out) as a grid of virtual vertical and horizontal lines; in the
> paper we call them x- and y-tabstops. Now, if you place a control into
> the GUI, you choose two x-tabstops for the left and right border of the
> control, and two y-tabstops for top and bottom. This rectangular region
> that contains the control is simply called an area. By doing so, you
> define the topology of the GUI, i.e. how the controls are aligned to one
> another, if a control is above/below/beside another etc.
>
> Like in the liblayout, you can give each area a min and maxsize.
> Furtherore, you can specify how a control is aligned within its area
> (e.g. centered), margins (e.g. left margin) etc. The preferred size of a
> control is used as well, and you can specify how important the control
> is, i.e. the priority with which LP should try to give the control
> exactly its preferred size in case there is not enough or too much
> space. You can specify vales for the "reluctance" with which a control
> shrinks under its preferred size or grows over it. All these parameters
> can be hidden by letting LP assign sensible default values.
>
> Now, once you have the topology all set up, you can add linear
> constraints to the layout specification, such as "column X should be
> twice as wide as column Y", or "button B should be at that exact
> position", or "row R should be 1cm/pixel/inch high" or "the aspect ratio
> of that panel should be 16:9". The LP solver will take care of those
> constraints and figure out the actual positions of the tabsops for you.
>
> Conflicting constraints are not a problem because you can use soft
> constraints. I.e. You can say "I want that column to be 2cm wide, but
> only if its possible". The LP solver will try to fulfill the consraint
> as much as possible. You can prioritize constraints and tell the LP
> solver to give more important soft constraints precedence over less
> important ones.
>
> Linear constraints have been used for solving really advanced layout
> problems such as tree and graph layout, so there is really a lot you can
> do. Of course, it's computationally more expensive than the simple
> container-based layout, but it's still fast. It allows developers to
> think about GUIs in a more geometrical manner, using invariants, instead
> of in terms of program code.
>
> I hope this explains a bit (and was not too long to read for you). If
> you have any more questions, feel free to ask. If you are interested,
> you might want to look into the paper that I pointed out in the previous
> post. It would be really cool if Haiku had a layout system like that. It
> could be used alongside simpler constructs such as in liblayout.
>
> Thanks for reading all this ;-)
> Christof
> _______________________________________________
> glasselevator-talk mailing list
> glasselevator-talk at bug-br.org.br
> http://www.bug-br.org.br/mailman/listinfo/glasselevator-talk
http://www.fastmail.fm
More information about the glasselevator-talk
mailing list