diff --git a/clutter/clutter-animation.c b/clutter/clutter-animation.c
index ec3c8e807..d4d48f3ad 100644
--- a/clutter/clutter-animation.c
+++ b/clutter/clutter-animation.c
@@ -129,6 +129,15 @@
*
*
*
+ *
+ * Tweening using clutter_actor_animate()
+ *
+ *
+ * FIXME: MISSING XINCLUDE CONTENT
+ *
+ *
+ *
+ *
* #ClutterAnimation is available since Clutter 1.0
*/
diff --git a/tests/interactive/test-easing.c b/tests/interactive/test-easing.c
index f4b5b3915..2bd8a9c18 100644
--- a/tests/interactive/test-easing.c
+++ b/tests/interactive/test-easing.c
@@ -2,7 +2,8 @@
#include
#include
-const struct {
+/* all the easing modes provided by Clutter */
+static const struct {
const gchar *name;
ClutterAnimationMode mode;
} easing_modes[] = {
@@ -39,23 +40,28 @@ const struct {
{ "easeInOutBounce", CLUTTER_EASE_IN_OUT_BOUNCE },
};
+#define HELP_TEXT "Easing mode: %s (%d of %d)\n" \
+ "Left click to tween\n" \
+ "Right click to change the easing mode"
+
static const gint n_easing_modes = G_N_ELEMENTS (easing_modes);
static gint current_mode = 0;
static gint duration = 1;
static gboolean recenter = FALSE;
-static ClutterActor *main_stage = NULL;
+static ClutterActor *main_stage = NULL;
static ClutterActor *easing_mode_label = NULL;
static ClutterAnimation *last_animation = NULL;
-static ClutterColor stage_color = { 0x88, 0x88, 0xdd, 0xff };
-static ClutterColor bouncer_color = { 0xee, 0x33, 0, 0xff };
-
+/* recenter_bouncer:
+ *
+ * repositions (through an animation) the bouncer at the center of the stage
+ */
static void
-on_animation_completed (ClutterAnimation *animation,
- ClutterActor *rectangle)
+recenter_bouncer (ClutterAnimation *animation,
+ ClutterActor *rectangle)
{
gfloat base_x, base_y;
gint cur_mode;
@@ -65,7 +71,7 @@ on_animation_completed (ClutterAnimation *animation,
cur_mode = easing_modes[current_mode].mode;
- clutter_actor_animate (rectangle, cur_mode, 150,
+ clutter_actor_animate (rectangle, cur_mode, 250,
"x", base_x,
"y", base_y,
NULL);
@@ -79,31 +85,20 @@ on_button_press (ClutterActor *actor,
if (event->button == 3)
{
gchar *text;
- gfloat stage_width, stage_height;
- gfloat label_width, label_height;
- current_mode = (current_mode + 1 < n_easing_modes) ? current_mode + 1
- : 0;
+ /* cycle through the various easing modes */
+ current_mode = (current_mode + 1 < n_easing_modes)
+ ? current_mode + 1
+ : 0;
- text = g_strdup_printf ("Easing mode: %s (%d of %d)\n"
- "Right click to change the easing mode",
+ /* update the text of the label */
+ text = g_strdup_printf (HELP_TEXT,
easing_modes[current_mode].name,
current_mode + 1,
n_easing_modes);
clutter_text_set_text (CLUTTER_TEXT (easing_mode_label), text);
g_free (text);
-
- clutter_actor_get_size (main_stage,
- &stage_width,
- &stage_height);
- clutter_actor_get_size (easing_mode_label,
- &label_width,
- &label_height);
-
- clutter_actor_set_position (easing_mode_label,
- stage_width - label_width - 10,
- stage_height - label_height - 10);
}
else if (event->button == 1)
{
@@ -112,15 +107,20 @@ on_button_press (ClutterActor *actor,
cur_mode = easing_modes[current_mode].mode;
+ /* tween the actor using the current easing mode */
animation =
clutter_actor_animate (rectangle, cur_mode, duration * 1000,
"x", event->x,
"y", event->y,
NULL);
+ /* if we were asked to, recenter the bouncer at the end of the
+ * animation. we keep track of the animation to avoid connecting
+ * the signal handler to the same Animation twice.
+ */
if (recenter && last_animation != animation)
g_signal_connect_after (animation, "completed",
- G_CALLBACK (on_animation_completed),
+ G_CALLBACK (recenter_bouncer),
rectangle);
last_animation = animation;
@@ -133,9 +133,10 @@ static gboolean
draw_bouncer (ClutterCairoTexture *texture,
cairo_t *cr)
{
+ const ClutterColor *bouncer_color;
+ cairo_pattern_t *pattern;
guint width, height;
float radius;
- cairo_pattern_t *pattern;
clutter_cairo_texture_get_surface_size (texture, &width, &height);
@@ -145,20 +146,22 @@ draw_bouncer (ClutterCairoTexture *texture,
cairo_arc (cr, radius / 2, radius / 2, radius / 2, 0.0, 2.0 * G_PI);
+ bouncer_color = CLUTTER_COLOR_DarkScarletRed;
+
pattern = cairo_pattern_create_radial (radius / 2, radius / 2, 0,
radius, radius, radius);
cairo_pattern_add_color_stop_rgba (pattern,
0,
- bouncer_color.red / 255.0,
- bouncer_color.green / 255.0,
- bouncer_color.blue / 255.0,
- bouncer_color.alpha / 255.0);
+ bouncer_color->red / 255.0,
+ bouncer_color->green / 255.0,
+ bouncer_color->blue / 255.0,
+ bouncer_color->alpha / 255.0);
cairo_pattern_add_color_stop_rgba (pattern,
- 0.9,
- bouncer_color.red / 255.0,
- bouncer_color.green / 255.0,
- bouncer_color.blue / 255.0,
- 0.1);
+ 0.85,
+ bouncer_color->red / 255.0,
+ bouncer_color->green / 255.0,
+ bouncer_color->blue / 255.0,
+ 0.25);
cairo_set_source (cr, pattern);
cairo_fill_preserve (cr);
@@ -182,6 +185,7 @@ make_bouncer (gfloat width,
clutter_actor_set_anchor_point (retval, width / 2, height / 2);
clutter_actor_set_reactive (retval, TRUE);
+ /* make sure we draw the bouncer immediately */
clutter_cairo_texture_invalidate (CLUTTER_CAIRO_TEXTURE (retval));
return retval;
@@ -212,7 +216,6 @@ test_easing_main (int argc, char *argv[])
ClutterActor *stage, *rect, *label;
gchar *text;
gfloat stage_width, stage_height;
- gfloat label_width, label_height;
GError *error = NULL;
if (clutter_init_with_args (&argc, &argv,
@@ -224,30 +227,27 @@ test_easing_main (int argc, char *argv[])
stage = clutter_stage_new ();
clutter_stage_set_title (CLUTTER_STAGE (stage), "Easing Modes");
- clutter_stage_set_color (CLUTTER_STAGE (stage), &stage_color);
+ clutter_stage_set_color (CLUTTER_STAGE (stage), CLUTTER_COLOR_LightSkyBlue);
g_signal_connect (stage, "destroy", G_CALLBACK (clutter_main_quit), NULL);
main_stage = stage;
clutter_actor_get_size (stage, &stage_width, &stage_height);
+ /* create the actor that we want to tween */
rect = make_bouncer (50, 50);
clutter_container_add_actor (CLUTTER_CONTAINER (stage), rect);
clutter_actor_set_position (rect, stage_width / 2, stage_height / 2);
- text = g_strdup_printf ("Easing mode: %s (%d of %d)\n"
- "Right click to change the easing mode",
+ text = g_strdup_printf (HELP_TEXT,
easing_modes[current_mode].name,
current_mode + 1,
n_easing_modes);
label = clutter_text_new ();
clutter_container_add_actor (CLUTTER_CONTAINER (stage), label);
- clutter_text_set_font_name (CLUTTER_TEXT (label), "Sans 18px");
clutter_text_set_text (CLUTTER_TEXT (label), text);
- clutter_actor_get_size (label, &label_width, &label_height);
- clutter_actor_set_position (label,
- stage_width - label_width - 10,
- stage_height - label_height - 10);
+ clutter_actor_add_constraint (label, clutter_align_constraint_new (stage, CLUTTER_ALIGN_X_AXIS, 0.95));
+ clutter_actor_add_constraint (label, clutter_align_constraint_new (stage, CLUTTER_ALIGN_Y_AXIS, 0.95));
easing_mode_label = label;
g_free (text);