Allow StBoxLayout to shrink down to its minimum size

When a StBoxLayout is allocated a size less than its natural size,
think "shrink" needs to be divided among the children that have
a smaller minimum size than natural size.

This is done by preferentially shrinking the children that are most
expanded from their minimum size and then increasing that set of
children until we've found enough total shrink.

A new method is used of allocating children at integral sizes - instead
of rounding the per-child extra amount to an integer (which causes
cumulative round-off errors), compute the position as we go along in
floats and round individually for each child widget.

Extend the box-layout test to include of a test of a box being set
to various widths, starting quite narrow.

http://bugzilla.moblin.org/show_bug.cgi?id=6311
https://bugzilla.gnome.org/show_bug.cgi?id=595995
This commit is contained in:
Owen W. Taylor
2009-09-21 18:01:17 -04:00
parent fa09f7a6da
commit 1ec8e9eb6b
2 changed files with 282 additions and 89 deletions

View File

@ -8,32 +8,79 @@ const UI = imports.testcommon.ui;
UI.init();
let stage = Clutter.Stage.get_default();
let b = new St.BoxLayout({ vertical: true,
width: stage.width,
height: stage.height });
stage.add_actor(b);
let vbox = new St.BoxLayout({ vertical: true,
width: stage.width,
height: stage.height,
spacing: 10,
style: 'padding: 10px' });
stage.add_actor(vbox);
let b2 = new St.BoxLayout();
b.add(b2, { expand: true, fill: true });
////////////////////////////////////////////////////////////////////////////////
let r1 = new St.BoxLayout({ style_class: 'red',
width: 10,
height: 10 });
b2.add(r1, { expand: true });
let colored_boxes = new St.BoxLayout({ vertical: true,
width: 200,
height: 200,
style: 'border: 2px solid black;' });
vbox.add(colored_boxes, { x_fill: false,
x_align: St.Align.MIDDLE });
let r2 = new St.BoxLayout({ style_class: 'green',
width: 10,
height: 10 });
b2.add(r2, { expand: true,
x_fill: false,
x_align: St.Align.MIDDLE,
y_fill: false,
y_align: St.Align.MIDDLE });
let b2 = new St.BoxLayout({ style: 'border: 2px solid #666666' });
colored_boxes.add(b2, { expand: true });
let r3 = new St.BoxLayout({ style_class: 'blue',
width: 10,
height: 10 });
b.add(r3);
b2.add(new St.Label({ text: "Expand",
style: 'border: 1px solid #aaaaaa; '
+ 'background: #ffeecc' }),
{ expand: true });
b2.add(new St.Label({ text: "Expand\nNo Fill",
style: 'border: 1px solid #aaaaaa; '
+ 'background: #ccffaa' }),
{ expand: true,
x_fill: false,
x_align: St.Align.MIDDLE,
y_fill: false,
y_align: St.Align.MIDDLE });
colored_boxes.add(new St.Label({ text: "Default",
style: 'border: 1px solid #aaaaaa; '
+ 'background: #cceeff' }));
////////////////////////////////////////////////////////////////////////////////
function createCollapsableBox(width) {
let b = new St.BoxLayout({ width: width,
style: 'border: 1px solid black;'
+ 'font: 13px Sans;' });
b.add(new St.Label({ text: "Very Very Very Long",
style: 'background: #ffaacc;'
+ 'padding: 5px; '
+ 'border: 1px solid #666666;' }),
{ expand: true });
b.add(new St.Label({ text: "Very Very Long",
style: 'background: #ffeecc; '
+ 'padding: 5px; '
+ 'border: 1px solid #666666;' }),
{ expand: true });
b.add(new St.Label({ text: "Very Long",
style: 'background: #ccffaa; '
+ 'padding: 5px; '
+ 'border: 1px solid #666666;' }),
{ expand: true });
b.add(new St.Label({ text: "Short",
style: 'background: #cceeff; '
+ 'padding: 5px; '
+ 'border: 1px solid #666666;' }),
{ expand: true });
return b;
}
for (let width = 200; width <= 500; width += 60 ) {
vbox.add(createCollapsableBox (width),
{ x_fill: false,
x_align: St.Align.MIDDLE });
}
////////////////////////////////////////////////////////////////////////////////
stage.show();
Clutter.main();