actor: Check easing duration when updating in-flight transitions
authorEmmanuele Bassi <ebassi@linux.intel.com>
Wed, 28 Mar 2012 11:43:57 +0000 (12:43 +0100)
committerEmmanuele Bassi <ebassi@linux.intel.com>
Wed, 28 Mar 2012 11:43:57 +0000 (12:43 +0100)
If we update a transition that is currently playing, we need to check
the current easing state, and look at the eventual duration, in case
the user wants to cancel the transition.

clutter/clutter-actor.c

index ca0ece9..8651109 100644 (file)
@@ -17003,6 +17003,7 @@ _clutter_actor_update_transition (ClutterActor *actor,
                                   ...)
 {
   TransitionClosure *clos;
+  ClutterTimeline *timeline;
   ClutterInterval *interval;
   const ClutterAnimationInfo *info;
   va_list var_args;
@@ -17020,6 +17021,8 @@ _clutter_actor_update_transition (ClutterActor *actor,
   if (clos == NULL)
     return;
 
+  timeline = CLUTTER_TIMELINE (clos->transition);
+
   va_start (var_args, pspec);
 
   ptype = G_PARAM_SPEC_VALUE_TYPE (pspec);
@@ -17041,7 +17044,17 @@ _clutter_actor_update_transition (ClutterActor *actor,
   clutter_interval_set_initial_value (interval, &initial);
   clutter_interval_set_final_value (interval, &final);
 
-  clutter_timeline_rewind (CLUTTER_TIMELINE (clos->transition));
+  /* if we're updating with an easing duration of zero milliseconds,
+   * we just jump the timeline to the end and let it run its course
+   */
+  if (info->cur_state == NULL || info->cur_state->easing_duration == 0)
+    {
+      guint duration = clutter_timeline_get_duration (timeline);
+
+      clutter_timeline_advance (timeline, duration);
+    }
+  else
+    clutter_timeline_rewind (timeline);
 
 out:
   g_value_unset (&initial);