<?xml version="1.0"?>
<!DOCTYPE chapter PUBLIC
  "-//OASIS//DTD DocBook XML V4.3//EN"
  "http://www.oasis-open.org/docbook/xml/4.3/docbookx.dtd" [
]>
<chapter id="migrating-ClutterAnimation">

  <chapterinfo>
    <author>
      <firstname>Emmanuele</firstname>
      <surname>Bassi</surname>
      <affiliation>
        <address>
          <email>ebassi@gnome.org</email>
        </address>
      </affiliation>
    </author>
  </chapterinfo>

  <title>Migrating from ClutterAnimation</title>

  <para>The #ClutterAnimation class, along with the #ClutterActor wrappers
  clutter_actor_animate(), clutter_actor_animate_with_timeline() and
  clutter_actor_animate_with_alpha(), has been deprecated in Clutter 1.12,
  and should not be used in newly written code.</para>

  <para>The direct replacement for a #ClutterAnimation is the
  #ClutterPropertyTransition class, which allows the transition of a
  single #GObject property from an initial value to a final value over a
  user-defined time using a user-defined easing curve.</para>

  <para>The #ClutterPropertyTransition class inherits from #ClutterTransition,
  which allows setting the transition interval, as well as the animatable
  instance to be transitioned; and from #ClutterTimeline, which allows setting
  the duration and easing curve of the transition.</para>

  <para>For instance, the following #ClutterAnimation set up:</para>

  <informalexample><programlisting language="C"><![CDATA[
  ClutterAnimation *animation = clutter_animation_new ();

  clutter_animation_set_mode (animation, CLUTTER_EASE_OUT_CUBIC);
  clutter_animation_set_duration (animation, 2500);

  /* object_to_animate is set elsewhere */
  clutter_animation_set_object (animation, object_to_animate);

  ClutterInterval *interval = clutter_interval_new (G_TYPE_FLOAT, 0.0, 100.0);

  /* property_name is set elsewhere */
  clutter_animation_bind_interval (animation, property_name, interval);

  ClutterTimeline *timeline = clutter_animation_get_timeline (animation);
  clutter_timeline_start (timeline);
]]></programlisting></informalexample>

  <para>Can be replaced by #ClutterPropertyTransition:</para>

  <informalexample><programlisting language="C"><![CDATA[
  ClutterTransition *transition = clutter_property_transition_new (property_name);

  clutter_timeline_set_progress_mode (CLUTTER_TIMELINE (transition),
                                      CLUTTER_EASE_OUT_CUBIC);
  clutter_timeline_set_duration (CLUTTER_TIMELINE (transition), 2000);

  clutter_transition_set_animatable (transition, object_to_animate);

  clutter_transition_set_from (transition, G_TYPE_FLOAT, 0.0);
  clutter_transition_set_to (transition, G_TYPE_FLOAT, 100.0);

  clutter_timeline_start (CLUTTER_TIMELINE (transition));
]]></programlisting></informalexample>

  <para>It is important to note that only #ClutterAnimatable implementations
  can be used directly with #ClutterTransition.</para>

  <para>A #ClutterPropertyTransition can only animate a single property; if
  more than one property transition is required, you can use the
  #ClutterTransitionGroup class to group the transitions together.</para>

  <section>
    <title>Migrating clutter_actor_animate()</title>

    <para>#ClutterActor animatable properties can use implicit transitions
    through their setter functions. The duration and easing curve of the
    animation is controlled by clutter_actor_set_easing_duration() and by
    clutter_actor_set_easing_mode(), respectively; for instance, the
    equivalent of the following clutter_actor_animate() call:</para>

    <informalexample><programlisting language="C"><![CDATA[
  clutter_actor_animate (actor, CLUTTER_EASE_OUT_BOUNCE, 500,
                         "x", new_x_position,
                         "y", new_y_position,
                         "opacity", 255,
                         NULL);
]]></programlisting></informalexample>

    <para>Can be replaced by the following:</para>

    <informalexample><programlisting language="C"><![CDATA[
  clutter_actor_set_easing_mode (actor, CLUTTER_EASE_OUT_BOUNCE);
  clutter_actor_set_easing_duration (actor, 500);
  clutter_actor_set_position (actor, new_x_position, new_y_position);
  clutter_actor_set_opacity (actor, 255);
]]></programlisting></informalexample>

    <para>The default easing duration for the 1.0 API series is set to 0,
    which means no transition at all.</para>

    <para>It is possible to set the easing state of a #ClutterActor to its
    default values by using clutter_actor_save_easing_state(), and return
    to the previous values by calling clutter_actor_restore_easing_state()
    instead. The easing state affects all the animatable properties that
    are modified after changing it; so, for instance:</para>

    <informalexample><programlisting language="C"><![CDATA[
  clutter_actor_save_easing_state (actor);
  clutter_actor_set_easing_duration (actor, 500);
  clutter_actor_set_opacity (actor, 255);

  clutter_actor_save_easing_state (actor);
  clutter_actor_set_easing_delay (actor, 500);
  clutter_actor_set_easing_duration (actor, 500);
  clutter_actor_set_size (actor, width, height);
  clutter_actor_restore_easing_state (actor);

  clutter_actor_restore_easing_state (actor);
]]></programlisting></informalexample>

    <para>The animation above will implicitly transition the opacity from
    its current value to 255 in 500 milliseconds using the default easing
    curve; at the same time, the size of the actor will be transitioned in
    500 milliseconds after a delay of 500 milliseconds to the new size
    stored in the variables <emphasis>width</emphasis> and
    <emphasis>height</emphasis>.</para>

  </section>

</chapter>
