[clutter] group: Gut the implementation



commit bd348625c70a2f0f784d5780d3bda38f51fb347f
Author: Emmanuele Bassi <ebassi linux intel com>
Date:   Fri Jan 20 14:53:41 2012 +0000

    group: Gut the implementation
    
    A Group is a just a ClutterActor with the layout-manager property set at
    instance initialization time. It doesn't need anything else from
    ClutterActor's vtable, except the slightly custom show_all/hide_all
    implementation, and a simplified get_paint_volume.

 clutter/deprecated/clutter-group.c |  138 +++++++++++-------------------------
 1 files changed, 41 insertions(+), 97 deletions(-)
---
diff --git a/clutter/deprecated/clutter-group.c b/clutter/deprecated/clutter-group.c
index 453ac3b..fe1ab92 100644
--- a/clutter/deprecated/clutter-group.c
+++ b/clutter/deprecated/clutter-group.c
@@ -19,8 +19,6 @@
  *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library. If not, see <http://www.gnu.org/licenses/>.
- *
- *
  */
 
 /**
@@ -68,137 +66,83 @@
 #define CLUTTER_GROUP_GET_PRIVATE(obj) \
   (G_TYPE_INSTANCE_GET_PRIVATE ((obj), CLUTTER_TYPE_GROUP, ClutterGroupPrivate))
 
-struct _ClutterGroupPrivate
-{
-  ClutterLayoutManager *layout;
-};
-
 G_DEFINE_TYPE (ClutterGroup, clutter_group, CLUTTER_TYPE_ACTOR)
 
 static void
-clutter_group_real_pick (ClutterActor       *actor,
-                         const ClutterColor *pick)
+clutter_group_real_show_all (ClutterActor *actor)
 {
-  ClutterActor *child;
+  ClutterActor *iter;
 
-  /* Chain up so we get a bounding box pained (if we are reactive) */
-  CLUTTER_ACTOR_CLASS (clutter_group_parent_class)->pick (actor, pick);
+  for (iter = clutter_actor_get_first_child (actor);
+       iter != NULL;
+       iter = clutter_actor_get_next_sibling (iter))
+    clutter_actor_show (iter);
 
-  for (child = clutter_actor_get_first_child (actor);
-       child != NULL;
-       child = clutter_actor_get_next_sibling (child))
-    {
-      clutter_actor_paint (child);
-    }
+  clutter_actor_show (actor);
 }
 
 static void
-clutter_group_real_get_preferred_width (ClutterActor *actor,
-                                        gfloat        for_height,
-                                        gfloat       *min_width,
-                                        gfloat       *natural_width)
+clutter_group_real_hide_all (ClutterActor *actor)
 {
-  ClutterGroupPrivate *priv = CLUTTER_GROUP (actor)->priv;
-
-  clutter_layout_manager_get_preferred_width (priv->layout,
-                                              CLUTTER_CONTAINER (actor),
-                                              for_height,
-                                              min_width, natural_width);
-}
+  ClutterActor *iter;
 
-static void
-clutter_group_real_get_preferred_height (ClutterActor *actor,
-                                         gfloat        for_width,
-                                         gfloat       *min_height,
-                                         gfloat       *natural_height)
-{
-  ClutterGroupPrivate *priv = CLUTTER_GROUP (actor)->priv;
+  clutter_actor_hide (actor);
 
-  clutter_layout_manager_get_preferred_height (priv->layout,
-                                               CLUTTER_CONTAINER (actor),
-                                               for_width,
-                                               min_height, natural_height);
+  for (iter = clutter_actor_get_first_child (actor);
+       iter != NULL;
+       iter = clutter_actor_get_next_sibling (iter))
+    clutter_actor_hide (iter);
 }
 
-static void
-clutter_group_real_allocate (ClutterActor           *actor,
-                             const ClutterActorBox  *allocation,
-                             ClutterAllocationFlags  flags)
+static gboolean
+clutter_group_get_paint_volume (ClutterActor *actor,
+                                ClutterPaintVolume *volume)
 {
-  ClutterGroupPrivate *priv = CLUTTER_GROUP (actor)->priv;
-  ClutterActorClass *klass;
-
-  klass = CLUTTER_ACTOR_CLASS (clutter_group_parent_class);
-  klass->allocate (actor, allocation, flags);
+  ClutterActor *child;
+  gboolean retval;
 
-  clutter_layout_manager_allocate (priv->layout,
-                                   CLUTTER_CONTAINER (actor),
-                                   allocation, flags);
-}
+  /* bail out early if we don't have any child */
+  if (clutter_actor_get_n_children (actor) == 0)
+    return FALSE;
 
-static void
-clutter_group_dispose (GObject *object)
-{
-  ClutterGroup *self = CLUTTER_GROUP (object);
-  ClutterGroupPrivate *priv = self->priv;
+  retval = TRUE;
 
-  if (priv->layout != NULL)
+  /* otherwise, union the paint volumes of our children, in case
+   * any one of them decides to paint outside the parent's allocation
+   */
+  for (child = clutter_actor_get_first_child (actor);
+       child != NULL;
+       child = clutter_actor_get_next_sibling (child))
     {
-      clutter_layout_manager_set_container (priv->layout, NULL);
-      g_object_unref (priv->layout);
-      priv->layout = NULL;
-    }
+      const ClutterPaintVolume *child_volume;
 
-  G_OBJECT_CLASS (clutter_group_parent_class)->dispose (object);
-}
+      /* This gets the paint volume of the child transformed into the
+       * group's coordinate space... */
+      child_volume = clutter_actor_get_transformed_paint_volume (child, actor);
+      if (!child_volume)
+        return FALSE;
 
-static void
-clutter_group_real_show_all (ClutterActor *actor)
-{
-  clutter_container_foreach (CLUTTER_CONTAINER (actor),
-                             CLUTTER_CALLBACK (clutter_actor_show),
-                             NULL);
-  clutter_actor_show (actor);
-}
+      clutter_paint_volume_union (volume, child_volume);
+    }
 
-static void
-clutter_group_real_hide_all (ClutterActor *actor)
-{
-  clutter_actor_hide (actor);
-  clutter_container_foreach (CLUTTER_CONTAINER (actor),
-                             CLUTTER_CALLBACK (clutter_actor_hide),
-                             NULL);
+  return retval;
 }
 
 static void
 clutter_group_class_init (ClutterGroupClass *klass)
 {
-  GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
   ClutterActorClass *actor_class = CLUTTER_ACTOR_CLASS (klass);
 
-  g_type_class_add_private (klass, sizeof (ClutterGroupPrivate));
-
-  actor_class->get_preferred_width = clutter_group_real_get_preferred_width;
-  actor_class->get_preferred_height = clutter_group_real_get_preferred_height;
-  actor_class->allocate = clutter_group_real_allocate;
-  actor_class->pick = clutter_group_real_pick;
   actor_class->show_all = clutter_group_real_show_all;
   actor_class->hide_all = clutter_group_real_hide_all;
-
-  gobject_class->dispose = clutter_group_dispose;
-
+  actor_class->get_paint_volume = clutter_group_get_paint_volume;
 }
 
 static void
 clutter_group_init (ClutterGroup *self)
 {
-  self->priv = CLUTTER_GROUP_GET_PRIVATE (self);
-
-  self->priv->layout = clutter_fixed_layout_new ();
-  g_object_ref_sink (self->priv->layout);
-
-  clutter_layout_manager_set_container (self->priv->layout,
-                                        CLUTTER_CONTAINER (self));
+  clutter_actor_set_layout_manager (CLUTTER_ACTOR (self),
+                                    clutter_fixed_layout_new ());
 }
 
 /**



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]