actor: explicitly track children in clutter-actor.c

We now explicitly track the list of children each actor has in a private
GList. This gives us a reliable way to know how many children an actor
has - even for composite actors that don't implement the container
interface. This also will allow us to directly traverse the scenegraph
in a more generalized fashion. Previously the scenegraph was
more-or-less represented implicitly according the implementation of
paint methods.
This commit is contained in:
Robert Bragg 2010-09-12 23:31:39 +01:00
parent b3edd3e922
commit 239d83f952

View File

@ -434,6 +434,8 @@ struct _ClutterActorPrivate
guint8 opacity;
ClutterActor *parent_actor;
GList *children;
gint n_children;
gchar *name;
guint32 id; /* Unique ID */
@ -7509,6 +7511,7 @@ clutter_actor_set_parent (ClutterActor *self,
ClutterActor *parent)
{
ClutterActorPrivate *priv;
ClutterActorPrivate *parent_priv;
ClutterTextDirection text_dir;
g_return_if_fail (CLUTTER_IS_ACTOR (self));
@ -7539,6 +7542,12 @@ clutter_actor_set_parent (ClutterActor *self,
g_object_ref_sink (self);
priv->parent_actor = parent;
/* Maintain an explicit list of children for every actor... */
parent_priv = parent->priv;
parent_priv->children =
g_list_prepend (parent_priv->children, self);
parent_priv->n_children++;
/* if push_internal() has been called then we automatically set
* the flag on the actor
*/
@ -7638,6 +7647,7 @@ clutter_actor_unparent (ClutterActor *self)
{
ClutterActorPrivate *priv;
ClutterActor *old_parent;
ClutterActorPrivate *old_parent_priv;
gboolean was_mapped;
g_return_if_fail (CLUTTER_IS_ACTOR (self));
@ -7670,6 +7680,10 @@ clutter_actor_unparent (ClutterActor *self)
if (!CLUTTER_ACTOR_IN_REPARENT (self))
g_signal_emit (self, actor_signals[PARENT_SET], 0, old_parent);
old_parent_priv = old_parent->priv;
old_parent_priv->children = g_list_remove (old_parent_priv->children, self);
old_parent_priv->n_children--;
/* Queue a redraw on old_parent only if we were painted in the first
* place. Will be no-op if old parent is not shown.
*/