mirror of
https://gitlab.gnome.org/GNOME/gtk.git
synced 2024-11-09 10:20:07 +00:00
boxlayout: Compute opposite size properly
For size -1 in the opposite orientation, GtkBoxLayout used to measure the children based on their min size in the box's orientation instead of -1. That wasn't really intended, but was a side effect of how the sizing code did (not) distribute extra size above the minimum size. This is clearly not what we want. What we want is measuring the orientation as is for size -1. Then we want to just take the maximum of all children and use that. A reftest is incldued that ensures a vbox wraps a label just like an hbox does.
This commit is contained in:
parent
8e27fc7f9b
commit
5c9ae28937
@ -256,11 +256,46 @@ gtk_box_layout_compute_size (GtkBoxLayout *self,
|
||||
static void
|
||||
gtk_box_layout_compute_opposite_size (GtkBoxLayout *self,
|
||||
GtkWidget *widget,
|
||||
int for_size,
|
||||
int *minimum,
|
||||
int *natural,
|
||||
int *min_baseline,
|
||||
int *nat_baseline)
|
||||
{
|
||||
GtkWidget *child;
|
||||
int largest_min = 0, largest_nat = 0;
|
||||
|
||||
for (child = gtk_widget_get_first_child (widget);
|
||||
child != NULL;
|
||||
child = gtk_widget_get_next_sibling (child))
|
||||
{
|
||||
int child_min = 0;
|
||||
int child_nat = 0;
|
||||
|
||||
if (!gtk_widget_should_layout (child))
|
||||
continue;
|
||||
|
||||
gtk_widget_measure (child,
|
||||
OPPOSITE_ORIENTATION (self->orientation),
|
||||
-1,
|
||||
&child_min, &child_nat,
|
||||
NULL, NULL);
|
||||
|
||||
largest_min = MAX (largest_min, child_min);
|
||||
largest_nat = MAX (largest_nat, child_nat);
|
||||
}
|
||||
|
||||
*minimum = largest_min;
|
||||
*natural = largest_nat;
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_box_layout_compute_opposite_size_for_size (GtkBoxLayout *self,
|
||||
GtkWidget *widget,
|
||||
int for_size,
|
||||
int *minimum,
|
||||
int *natural,
|
||||
int *min_baseline,
|
||||
int *nat_baseline)
|
||||
{
|
||||
GtkWidget *child;
|
||||
int nvis_children;
|
||||
@ -437,9 +472,18 @@ gtk_box_layout_measure (GtkLayoutManager *layout_manager,
|
||||
|
||||
if (self->orientation != orientation)
|
||||
{
|
||||
gtk_box_layout_compute_opposite_size (self, widget, for_size,
|
||||
minimum, natural,
|
||||
min_baseline, nat_baseline);
|
||||
if (for_size < 0)
|
||||
{
|
||||
gtk_box_layout_compute_opposite_size (self, widget,
|
||||
minimum, natural,
|
||||
min_baseline, nat_baseline);
|
||||
}
|
||||
else
|
||||
{
|
||||
gtk_box_layout_compute_opposite_size_for_size (self, widget, for_size,
|
||||
minimum, natural,
|
||||
min_baseline, nat_baseline);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -498,6 +498,8 @@ testdata = [
|
||||
'unresolvable.css',
|
||||
'unresolvable.ref.ui',
|
||||
'unresolvable.ui',
|
||||
'vbox-with-max-width-chars-label.ref.ui',
|
||||
'vbox-with-max-width-chars-label.ui',
|
||||
'window-border-width.ref.ui',
|
||||
'window-border-width.ui',
|
||||
'window-default-size.ref.ui',
|
||||
|
18
testsuite/reftests/vbox-with-max-width-chars-label.ref.ui
Normal file
18
testsuite/reftests/vbox-with-max-width-chars-label.ref.ui
Normal file
@ -0,0 +1,18 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<interface>
|
||||
<object class="GtkWindow">
|
||||
<property name="decorated">0</property>
|
||||
<child>
|
||||
<object class="GtkBox">
|
||||
<property name="orientation">horizontal</property>
|
||||
<child>
|
||||
<object class="GtkLabel">
|
||||
<property name="label">Hello World</property>
|
||||
<property name="wrap">1</property>
|
||||
<property name="max-width-chars">1</property>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
</interface>
|
18
testsuite/reftests/vbox-with-max-width-chars-label.ui
Normal file
18
testsuite/reftests/vbox-with-max-width-chars-label.ui
Normal file
@ -0,0 +1,18 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<interface>
|
||||
<object class="GtkWindow">
|
||||
<property name="decorated">0</property>
|
||||
<child>
|
||||
<object class="GtkBox">
|
||||
<property name="orientation">vertical</property>
|
||||
<child>
|
||||
<object class="GtkLabel">
|
||||
<property name="label">Hello World</property>
|
||||
<property name="wrap">1</property>
|
||||
<property name="max-width-chars">1</property>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
</interface>
|
Loading…
Reference in New Issue
Block a user