box-layout: Override compute_expand()

ClutterBoxLayout has an expansion flag, and we need to take that into
consideration when computing the Actor expansion flags.
This commit is contained in:
Emmanuele Bassi 2011-12-20 18:41:51 +00:00 committed by Emmanuele Bassi
parent 508f09f0a0
commit 5f79f6ee37

View File

@ -276,6 +276,11 @@ box_child_set_expand (ClutterBoxChild *self,
else
clutter_layout_manager_layout_changed (layout);
/* we need to let the scene graph that the expand flags may have
* been changed
*/
clutter_actor_queue_compute_expand (CLUTTER_CHILD_META (self)->actor);
g_object_notify (G_OBJECT (self), "expand");
}
}
@ -742,8 +747,10 @@ count_expand_children (ClutterLayoutManager *layout,
gint *visible_children,
gint *expand_children)
{
ClutterBoxLayoutPrivate *priv;
ClutterActor *actor, *child;
priv = CLUTTER_BOX_LAYOUT (layout)->priv;
actor = CLUTTER_ACTOR (container);
*visible_children = *expand_children = 0;
@ -755,6 +762,7 @@ count_expand_children (ClutterLayoutManager *layout,
if (CLUTTER_ACTOR_IS_VISIBLE (child))
{
ClutterLayoutMeta *meta;
gboolean needs_expand;
*visible_children += 1;
@ -762,7 +770,12 @@ count_expand_children (ClutterLayoutManager *layout,
container,
child);
if (CLUTTER_BOX_CHILD (meta)->expand)
if (priv->is_vertical)
needs_expand = clutter_actor_needs_y_expand (child);
else
needs_expand = clutter_actor_needs_x_expand (child);
if (CLUTTER_BOX_CHILD (meta)->expand || needs_expand)
*expand_children += 1;
}
}
@ -1057,9 +1070,16 @@ clutter_box_layout_allocate (ClutterLayoutManager *layout,
}
else
{
gboolean needs_expand;
child_size = sizes[i].minimum_size;
if (box_child->expand)
if (priv->is_vertical)
needs_expand = clutter_actor_needs_y_expand (child);
else
needs_expand = clutter_actor_needs_x_expand (child);
if (box_child->expand || needs_expand)
{
child_size += extra;
@ -1169,6 +1189,38 @@ clutter_box_layout_end_animation (ClutterLayoutManager *manager)
parent_class->end_animation (manager);
}
static void
clutter_box_layout_compute_expand (ClutterLayoutManager *manager,
ClutterContainer *container,
ClutterActor *actor,
gboolean *x_expand_p,
gboolean *y_expand_p)
{
ClutterBoxLayoutPrivate *priv;
ClutterLayoutMeta *meta;
gboolean x_expand, y_expand;
priv = CLUTTER_BOX_LAYOUT (manager)->priv;
meta = clutter_layout_manager_get_child_meta (manager, container, actor);
if (priv->is_vertical)
{
x_expand = FALSE;
y_expand = CLUTTER_BOX_CHILD (meta)->expand;
}
else
{
x_expand = CLUTTER_BOX_CHILD (meta)->expand;
y_expand = FALSE;
}
if (x_expand_p != NULL)
*x_expand_p = x_expand;
if (y_expand_p != NULL)
*y_expand_p = y_expand;
}
static void
clutter_box_layout_set_property (GObject *gobject,
guint prop_id,
@ -1279,6 +1331,7 @@ clutter_box_layout_class_init (ClutterBoxLayoutClass *klass)
clutter_box_layout_get_child_meta_type;
layout_class->begin_animation = clutter_box_layout_begin_animation;
layout_class->end_animation = clutter_box_layout_end_animation;
layout_class->compute_expand = clutter_box_layout_compute_expand;
g_type_class_add_private (klass, sizeof (ClutterBoxLayoutPrivate));