diff options
author | Havoc Pennington <hp@pobox.com> | 2010-09-06 12:30:40 -0400 |
---|---|---|
committer | Matthias Clasen <mclasen@redhat.com> | 2010-10-13 10:49:06 -0400 |
commit | 8abb18f910ba26f8dd536b28150b85e1616eb1aa (patch) | |
tree | e182e030fb37ff97e490d6600b9fc85f9b19be7d | |
parent | 7597a35477eefdcea9264b67f3ccefdb63f911d5 (diff) | |
download | gtk+-8abb18f910ba26f8dd536b28150b85e1616eb1aa.tar.gz |
Support GtkWidget expand properties in GtkBox
This consists of:
* expand a child if either child->expand || gtk_widget_get_expand(child)
* override compute_expand so that child->expand will cause us to
return TRUE for gtk_widget_get_expand()
https://bugzilla.gnome.org/show_bug.cgi?id=628902
-rw-r--r-- | gtk/gtkbox.c | 78 |
1 files changed, 72 insertions, 6 deletions
diff --git a/gtk/gtkbox.c b/gtk/gtkbox.c index fa67dbb7b7..ae00779ac6 100644 --- a/gtk/gtkbox.c +++ b/gtk/gtkbox.c @@ -142,6 +142,10 @@ struct _GtkBoxChild static void gtk_box_size_allocate (GtkWidget *widget, GtkAllocation *allocation); +static void gtk_box_compute_expand (GtkWidget *widget, + gboolean *hexpand, + gboolean *vexpand); + static void gtk_box_set_property (GObject *object, guint prop_id, const GValue *value, @@ -150,7 +154,6 @@ static void gtk_box_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec); - static void gtk_box_add (GtkContainer *container, GtkWidget *widget); static void gtk_box_remove (GtkContainer *container, @@ -208,6 +211,7 @@ gtk_box_class_init (GtkBoxClass *class) widget_class->get_preferred_height = gtk_box_get_preferred_height; widget_class->get_preferred_height_for_width = gtk_box_get_preferred_height_for_width; widget_class->get_preferred_width_for_height = gtk_box_get_preferred_width_for_height; + widget_class->compute_expand = gtk_box_compute_expand; container_class->add = gtk_box_add; container_class->remove = gtk_box_remove; @@ -392,7 +396,7 @@ count_expand_children (GtkBox *box, if (gtk_widget_get_visible (child->widget)) { *visible_children += 1; - if (child->expand) + if (child->expand || gtk_widget_compute_expand (child->widget, private->orientation)) *expand_children += 1; } } @@ -570,7 +574,7 @@ gtk_box_size_allocate (GtkWidget *widget, { child_size = sizes[i].minimum_size + child->padding * 2; - if (child->expand) + if (child->expand || gtk_widget_compute_expand (child->widget, private->orientation)) { child_size += extra; @@ -642,6 +646,56 @@ gtk_box_size_allocate (GtkWidget *widget, } } +static void +gtk_box_compute_expand (GtkWidget *widget, + gboolean *hexpand_p, + gboolean *vexpand_p) +{ + GtkBoxPrivate *private = GTK_BOX (widget)->priv; + GList *children; + GtkBoxChild *child; + gboolean our_expand; + gboolean opposite_expand; + GtkOrientation opposite_orientation; + + if (private->orientation == GTK_ORIENTATION_HORIZONTAL) + opposite_orientation = GTK_ORIENTATION_VERTICAL; + else + opposite_orientation = GTK_ORIENTATION_HORIZONTAL; + + our_expand = FALSE; + opposite_expand = FALSE; + + for (children = private->children; children; children = children->next) + { + child = children->data; + + /* we don't recurse into children anymore as soon as we know + * expand=TRUE in an orientation + */ + + if (child->expand || (!our_expand && gtk_widget_compute_expand (child->widget, private->orientation))) + our_expand = TRUE; + + if (!opposite_expand && gtk_widget_compute_expand (child->widget, opposite_orientation)) + opposite_expand = TRUE; + + if (our_expand && opposite_expand) + break; + } + + if (private->orientation == GTK_ORIENTATION_HORIZONTAL) + { + *hexpand_p = our_expand; + *vexpand_p = opposite_expand; + } + else + { + *hexpand_p = opposite_expand; + *vexpand_p = our_expand; + } +} + static GType gtk_box_child_type (GtkContainer *container) { @@ -1039,7 +1093,7 @@ gtk_box_compute_size_for_opposing_orientation (GtkBox *box, { child_size = sizes[i].minimum_size + child->padding * 2; - if (child->expand) + if (child->expand || gtk_widget_compute_expand (child->widget, private->orientation)) { child_size += extra; @@ -1536,8 +1590,20 @@ gtk_box_set_child_packing (GtkBox *box, gtk_widget_freeze_child_notify (child); if (list) { - child_info->expand = expand != FALSE; - gtk_widget_child_notify (child, "expand"); + gboolean expanded; + + expanded = expand != FALSE; + + /* avoid setting expand if unchanged, since queue_compute_expand + * can be expensive-ish + */ + if (child_info->expand != expanded) + { + child_info->expand = expand != FALSE; + gtk_widget_queue_compute_expand (GTK_WIDGET (box)); + gtk_widget_child_notify (child, "expand"); + } + child_info->fill = fill != FALSE; gtk_widget_child_notify (child, "fill"); child_info->padding = padding; |