[prev in list] [next in list] [prev in thread] [next in thread] 

List:       gtk-devel
Subject:    Re: Extended Layout Summary
From:       Havoc Pennington <hp () redhat ! com>
Date:       2007-11-21 18:53:22
Message-ID: 47447EA2.9090807 () redhat ! com
[Download RAW message or body]

Hi,

Matthias Clasen wrote:
> On Nov 20, 2007 8:45 PM, Behdad Esfahbod <behdad@behdad.org> wrote:
> 
>>     a) Maximize number of children taking their natural size.
> 
> I am not convinced this is always the best strategy. Doesn't this
> encourage starving
> one child in favour of the rest of the pack getting their natural size
> ? If you really want
> to be flexible in this, you probably need to go to a TeX-like glue
> model and assign
> stretchabilities and shrinkabilities to children.
> 

The canonical example is an ellipsizable label, where the min size is 
something like the size of one letter plus "...", and the natural size 
is the entire label width (given the available height).

So, if you have a box full of labels and get extra allocation above the 
minimum size, you want to first show all text in all labels (give 
everything its natural size) and then second add padding or spacing 
(give things more than their natural size).

What you don't want to do is add padding or spacing, while some labels 
are still ellipsized.

In the HippoCanvas comments I defined natural size as:

   The natural width should be thought of as the width at which
   alignment (HIPPO_ALIGNMENT_START etc.) makes no difference but at
   which nothing will be chopped off or wrapped.

That is, natural size is roughly defined as the size at which we show 
everything, but don't have any padding or spacing. It's "size that's 
more important than padding and spacing"

Clearly this is something that should be crisply defined in the GTK docs 
when extended layout is added.

Here is the comment from HippoCanvasBox on how its algorithm works; I am 
too lazy to follow Behdad's pseudocode to see if it is equivalent ;-)

/*
  If we have an allocation larger than our request (min width), we
  distribute the space among children as follows:
  1) for each child below natural width, bring it up to its natural width
     a) count children with a request still below their natural width
     b) find the child with the smallest needed expansion to reach 
natural width
        and record this needed expansion
     c) distribute among below-natural-width children the minimum of
        (all space remaining to distribute) and
        (smallest needed expansion times number of children to expand)
     d) goto a) if children below natural width remain
  2) if extra space still remains, divide it equally among each child 
with expand=true
  In other words, children will always grow to their natural width 
whether they are expand=true
  or not. Below-natural-size children always grow before expand=true 
children.

  Various optimizations are obviously possible here (keep track of flags 
for whether
  we have any expandable / any natural!=minimum, for example).

  The PACK_IF_FITS children are done in a second pass after other children,
  the if_fits flag indicates which pass this is. If if_fits=TRUE we need
  to skip if_fits children that did not fit.

*/


Havoc

_______________________________________________
gtk-devel-list mailing list
gtk-devel-list@gnome.org
http://mail.gnome.org/mailman/listinfo/gtk-devel-list
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic