cookbook: Simplified full scroll example
authorElliot Smith <elliot.smith@intel.com>
Wed, 11 Aug 2010 13:39:22 +0000 (14:39 +0100)
committerElliot Smith <elliot.smith@intel.com>
Wed, 11 Aug 2010 17:16:07 +0000 (18:16 +0100)
Removed the layout and box to simplify the scrollable
actor example.

doc/cookbook/examples/events-mouse-scroll.c

index b9c1c31..71d66d5 100644 (file)
@@ -1,20 +1,19 @@
 #include <clutter/clutter.h>
 
 #define STAGE_HEIGHT 400
-#define STAGE_WIDTH STAGE_HEIGHT * 2
-#define SCROLL_AMOUNT STAGE_HEIGHT * 0.2
+#define STAGE_WIDTH STAGE_HEIGHT
+#define SCROLL_AMOUNT STAGE_HEIGHT * 0.125
 
 static const ClutterColor stage_color = { 0x33, 0x33, 0x55, 0xff };
-static const ClutterColor box_color = { 0xaa, 0xaa, 0x55, 0xff };
 
 static gboolean
-_scroll_event_cb (ClutterActor *scroll,
+_scroll_event_cb (ClutterActor *viewport,
                   ClutterEvent *event,
                   gpointer      user_data)
 {
-  ClutterActor *viewport = CLUTTER_ACTOR (user_data);
+  ClutterActor *scrollable = CLUTTER_ACTOR (user_data);
 
-  gfloat y = clutter_actor_get_y (viewport);
+  gfloat y = clutter_actor_get_y (scrollable);
 
   ClutterScrollDirection direction;
   direction = clutter_event_get_scroll_direction (event);
@@ -33,12 +32,11 @@ _scroll_event_cb (ClutterActor *scroll,
     }
 
   y = CLAMP (y,
-             clutter_actor_get_height (scroll)
-             + clutter_actor_get_y (scroll)
-             - clutter_actor_get_height (viewport),
+             clutter_actor_get_height (viewport)
+             - clutter_actor_get_height (scrollable),
              0.0);
 
-  clutter_actor_animate (viewport,
+  clutter_actor_animate (scrollable,
                          CLUTTER_EASE_OUT_CUBIC,
                          300,
                          "y", y,
@@ -51,7 +49,6 @@ int
 main (int argc, char *argv[])
 {
   ClutterActor *stage;
-  ClutterActor *scroll;
   ClutterActor *viewport;
   ClutterActor *texture;
 
@@ -62,40 +59,44 @@ main (int argc, char *argv[])
   clutter_stage_set_color (CLUTTER_STAGE (stage), &stage_color);
   g_signal_connect (stage, "destroy", G_CALLBACK (clutter_main_quit), NULL);
 
-  /* the "letterbox" which the viewport is scrolled within */
-  scroll = clutter_group_new ();
-  clutter_actor_set_size (scroll, STAGE_WIDTH, STAGE_HEIGHT * 0.75);
-  clutter_actor_add_constraint (scroll, clutter_align_constraint_new (stage, CLUTTER_BIND_Y, 0.5));
-  clutter_actor_set_reactive (scroll, TRUE);
-
-  /* this clips all actors inside the scroll group to that group's allocation */
-  clutter_actor_set_clip_to_allocation (scroll, TRUE);
-
-  viewport = clutter_box_new (clutter_bin_layout_new (CLUTTER_BIN_ALIGNMENT_CENTER,
-                                                      CLUTTER_BIN_ALIGNMENT_CENTER));
-  clutter_box_set_color (CLUTTER_BOX (viewport), &box_color);
-
-  /* the actor to scroll */
+  /* the scrollable actor */
   texture = clutter_texture_new ();
-  clutter_actor_set_request_mode (texture, CLUTTER_REQUEST_HEIGHT_FOR_WIDTH);
   clutter_texture_set_keep_aspect_ratio (CLUTTER_TEXTURE (texture),
                                          TRUE);
 
-  /* the box resizes itself to fit this texture */
-  clutter_actor_set_width (texture, STAGE_WIDTH);
+  /* set the texture's height so it's as tall as the stage */
+  clutter_actor_set_request_mode (texture, CLUTTER_REQUEST_WIDTH_FOR_HEIGHT);
+  clutter_actor_set_height (texture, STAGE_HEIGHT);
 
   clutter_texture_set_from_file (CLUTTER_TEXTURE (texture),
                                  TESTS_DATA_DIR "/redhand.png",
                                  NULL);
 
-  g_signal_connect (scroll,
-                    "scroll-event",
-                    G_CALLBACK (_scroll_event_cb),
-                    viewport);
+  /* the viewport which the box is scrolled within */
+  viewport = clutter_group_new ();
+
+  /* viewport is shorter than the stage */
+  clutter_actor_set_size (viewport, STAGE_WIDTH, STAGE_HEIGHT * 0.5);
+
+  /* align the viewport to the center of the stage's y axis */
+  clutter_actor_add_constraint (viewport, clutter_align_constraint_new (stage, CLUTTER_BIND_Y, 0.5));
 
+  /* viewport needs to respond to scroll events */
+  clutter_actor_set_reactive (viewport, TRUE);
+
+  /* clip all actors inside the viewport to that group's allocation */
+  clutter_actor_set_clip_to_allocation (viewport, TRUE);
+
+  /* put the texture inside the viewport */
   clutter_container_add_actor (CLUTTER_CONTAINER (viewport), texture);
-  clutter_container_add_actor (CLUTTER_CONTAINER (scroll), viewport);
-  clutter_container_add_actor (CLUTTER_CONTAINER (stage), scroll);
+
+  /* add the viewport to the stage */
+  clutter_container_add_actor (CLUTTER_CONTAINER (stage), viewport);
+
+  g_signal_connect (viewport,
+                    "scroll-event",
+                    G_CALLBACK (_scroll_event_cb),
+                    texture);
 
   clutter_actor_show (stage);