From abff6d6fe0cf27acc6bf3de4485450a5f74d9dbe Mon Sep 17 00:00:00 2001 From: Koos Vriezen Date: Sat, 10 May 2008 18:36:37 +0200 Subject: [PATCH] Redo the region z-index, use an extra group for sub regions and use clutter_actor_set_depth Gives a regression in tests/region2.smil with restoring the z-index. Since all have z-index are equal, zero, the declaration order should be the sorting. --- src/laugh-layout.c | 62 ++++++++++++------------------------------------------ src/laugh-media.c | 1 + 2 files changed, 14 insertions(+), 49 deletions(-) diff --git a/src/laugh-layout.c b/src/laugh-layout.c index 43cccd4..d667884 100644 --- a/src/laugh-layout.c +++ b/src/laugh-layout.c @@ -46,6 +46,7 @@ struct _LaughLayoutPrivate { ClutterActor *background_actor; + ClutterActor *sub_region_actor; ClutterColor bg_color; int zindex; int order; @@ -133,6 +134,7 @@ _laugh_layout_create_background (LaughLayout *layout, guint w, guint h) clutter_actor_set_position (priv->background_actor, 0, 0); clutter_container_add_actor (CLUTTER_CONTAINER (layout->region_actor), priv->background_actor); + clutter_actor_set_depth (priv->background_actor, 0); clutter_actor_show (priv->background_actor); g_signal_connect (G_OBJECT (priv->background_actor), "destroy", (GCallback) _lauch_layout_actor_destroyed, layout); @@ -141,47 +143,6 @@ _laugh_layout_create_background (LaughLayout *layout, guint w, guint h) }*/ } -static gint _laugh_layout_region_sort (gconstpointer a, gconstpointer b) -{ - - const LaughLayout *r1 = *(LaughLayout **) a; - const LaughLayout *r2 = *(LaughLayout **) b; - - if (r1->priv->zindex == r2->priv->zindex) - return r1->priv->order - r2->priv->order; - return r1->priv->zindex - r2->priv->zindex; -} - -static void _laugh_layout_zindex_apply (LaughNode *node) -{ - LaughNode *child; - GArray *regions = g_array_new (FALSE, FALSE, sizeof (LaughNode *)); - int i, size = 0; - ClutterContainer *container = NULL; - - for (child = node->first_child; child; child = child->next_sibling) - if (LaughTagIdRegion == child->id) { - g_array_append_val (regions, child); - ((LaughLayout *) child)->priv->order = size++; - if (!container) - container = CLUTTER_CONTAINER (clutter_actor_get_parent ( - ((LaughLayout *) child)->region_actor)); - } - - if (container && size > 1) { - g_array_sort (regions, _laugh_layout_region_sort); - - for (i = 0; i < size -1; ++i) { - clutter_container_raise_child (container, - g_array_index (regions, LaughLayout*, i+1)->region_actor, - g_array_index (regions, LaughLayout*, i)->region_actor); - } - clutter_actor_queue_redraw ((ClutterActor *) container); - } - - g_array_free (regions, TRUE); -} - static void _laugh_layout_init (LaughNode *node, LaughInitializer *initializer) { LaughLayout *self = (LaughLayout *) node; @@ -215,6 +176,11 @@ static void _laugh_layout_init (LaughNode *node, LaughInitializer *initializer) _laugh_layout_create_background (self, w, h); } + priv->sub_region_actor = clutter_group_new (); + clutter_container_add_actor ((ClutterContainer *) region_actor, + priv->sub_region_actor); + clutter_actor_set_depth (priv->sub_region_actor, 2); + clutter_actor_show (priv->sub_region_actor); switch (node->id) { case LaughTagIdRootLayout: @@ -239,7 +205,7 @@ static void _laugh_layout_init (LaughNode *node, LaughInitializer *initializer) clutter_container_add_actor (parent_actor, region_actor); clutter_actor_show (region_actor); - initializer->parent_region = CLUTTER_CONTAINER (region_actor); + initializer->parent_region = CLUTTER_CONTAINER (priv->sub_region_actor); } for (child = node->first_child; child; child = child->next_sibling) @@ -249,8 +215,6 @@ static void _laugh_layout_init (LaughNode *node, LaughInitializer *initializer) initializer->parent_width = priv->parent_width; initializer->parent_height = priv->parent_height; - _laugh_layout_zindex_apply (node); - if (!priv->io) node->state = LaughStateInitialized; } @@ -293,7 +257,8 @@ static void _laugh_layout_set_attribute (LaughNode *node, if (!val && undo) value = *(const gchar **)undo; - g_printf ("_laugh_layout_set_attribute %s=%s\n", laugh_attribute_from_id (att), value); + g_printf ("_laugh_layout_set_attribute %s=%s\n", laugh_attribute_from_id (att), + value ? value : "(null)"); if (laugh_size_setting_set_attribute (&self->size_setting, att, value)) { need_sizing = TRUE; @@ -329,11 +294,10 @@ static void _laugh_layout_set_attribute (LaughNode *node, break; case LaughAttrIdZIndex: { char *endptr = NULL; - self->priv->zindex = value ? strtol (value, &endptr, 10) : 0; + int z = value ? strtol (value, &endptr, 10) : 0; if (endptr == value) - self->priv->zindex = 0; - if (node->state > LaughStateInit && node->parent_node) - _laugh_layout_zindex_apply (node->parent_node); + z = 0; + clutter_actor_set_depth (self->region_actor, z); break; } case LaughAttrIdName: diff --git a/src/laugh-media.c b/src/laugh-media.c index 209f5fc..d584bc2 100644 --- a/src/laugh-media.c +++ b/src/laugh-media.c @@ -341,6 +341,7 @@ static void _laugh_media_start (LaughNode *node) priv->media_actor); clutter_actor_set_size (priv->media_actor, sw, sh); clutter_actor_set_position (priv->media_actor, sx, sy); + clutter_actor_set_depth (priv->media_actor, 1); clutter_actor_show (priv->media_actor); g_signal_connect (G_OBJECT (priv->media_actor), "destroy", (GCallback) _lauch_media_actor_destroyed, self); -- 2.11.4.GIT