<?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-ClutterEffect">

  <chapterinfo>
    <author>
      <firstname>Emmanuele</firstname>
      <surname>Bassi</surname>
      <affiliation>
        <address>
          <email>ebassi@linux.intel.com</email>
        </address>
      </affiliation>
    </author>
  </chapterinfo>

  <title>Migrating from ClutterEffect</title>

  <para>Since version 1.0, Clutter provides the #ClutterAnimation API
  and the clutter_actor_animate() family of functions as replacements
  for the <structname>ClutterEffectTemplate</structname> and
  clutter_effect_* API for creating simple, one-off animations.</para>

  <section id="using-actor-animate">
    <title>Using <function>clutter_actor_animate()</function></title>

    <para>Prior to Clutter 1.0, the way to create simple, one-off
    animations involving a single actor was the ClutterEffect API. The
    major downside of this API was that to abstract the duration and
    easing function of the animation the application developer had to
    create a <structname>ClutterEffectTemplate</structname> and keep it
    around for the duration of the application.</para>

    <para>The clutter_actor_animate() function performs all of the
    memory management that was delegated to the
    <structname>ClutterEffectTemplate</structname>, freeing the developer
    from having to deal with object bookkeeping.</para>

    <para>Another downside of the ClutterEffect API is that every
    possible animation has its own function (scaling, opacity, rotation,
    movement, etc.), and new functions cannot be added outside of
    Clutter.</para>

    <example id="example-clutter-effect">
      <title>Effect example</title>
      <para>The following code shows a simple animation using
      the ClutterEffect API. It animates an actor linearly in 500
      milliseconds, by moving it to the (100, 100) coordinates
      while fading it out.</para>
      <programlisting>
  ClutterEffectTemplate *tmpl;

  tmpl = clutter_effect_template_new_for_duration (500, clutter_ramp_inc_func);
  clutter_effect_move (tmpl, actor, 100, 100, NULL, NULL);
  clutter_effect_fade (tmpl, actor, 0, NULL, NULL);

  g_object_unref (tmpl);
      </programlisting>
    </example>

    <para>The clutter_actor_animate() function will implicitely
    create a #ClutterAnimation with the passed duration and easing
    mode, and will bind all the passed properties. All readable and
    writable properties specified by a #ClutterActor are animatable
    through clutter_actor_animate().</para>

    <example id="example-actor-animate">
      <title>Animation example</title>
      <para>The following code shows the clutter_actor_animate() call
      equivalent to the previous ClutterEffect example.</para>
      <programlisting>
  clutter_actor_animate (actor, CLUTTER_LINEAR, 500,
                         "x", 100.0,
                         "y", 100.0,
                         "opacity", 0,
                         NULL);
      </programlisting>
    </example>

    <para>The ClutterEffect API provided a way to be notified of the
    effect completion. Since the clutter_actor_animate() function creates
    a #ClutterAnimation instance it's possible to use the
    #ClutterAnimation::completed signal for the same notification.</para>

    <example id="example-clutter-effect-complete">
      <title>Effect complete example</title>
      <para>The following code shows how to receive notification of the
      completion of the animation.</para>
      <programlisting>
static void
on_fade_complete (ClutterActor *actor,
                  gpointer      data)
{
  clutter_actor_hide (actor);
}

  ClutterEffectTemplate *tmpl;

  tmpl = clutter_effect_template_new_for_duration (500, clutter_ramp_inc_func);
  clutter_effect_fade (tmpl, actor, 0, on_fade_complete, NULL);

  g_object_unref (tmpl);
      </programlisting>
    </example>

    <para>The clutter_actor_animate() function also has a convenience
    wrapper that allows to inline the signal connection:</para>

    <example id="example-actor-animate-complete">
      <title>Animation completed example</title>
      <para>The following code shows how to get the same notification
      as the example above.</para>
      <programlisting>
  ClutterAnimation *animation;

  animation = clutter_actor_animate (actor, CLUTTER_LINEAR, 500,
                                     "opacity", 0,
                                     NULL);
  g_signal_connect_swapped (animation,
                            "completed", G_CALLBACK (clutter_actor_hide),
                            actor);

  /* OR */

  clutter_actor_animate (actor, CLUTTER_LINEAR, 500,
                         "opacity", 0,
                         "signal-swapped::completed", clutter_actor_hide, actor,
                         NULL);
      </programlisting>
    </example>

  </section>

</chapter>
