#include <clutter/clutter.h>

static ClutterAnimator *animator1, *animator2;
static ClutterActor *rect1, *rect2;
static gfloat width, height;

static void
set_easing_modes (ClutterAnimator *animator,
                  ClutterActor    *actor,
                  gboolean         x,
                  gboolean         y)
{
  if (x)
    clutter_animator_property_set_ease_in (animator,
                                           (GObject *)actor,
                                           "x", TRUE);
  if (y)
    clutter_animator_property_set_ease_in (animator,
                                           (GObject *)actor,
                                           "y", TRUE);
  clutter_animator_property_set_ease_in (animator,
                                         (GObject *)actor,
                                         "opacity", TRUE);
}

static gboolean
rect1_clicked_cb ()
{
  clutter_animator_set (animator1,
                        rect1, "y", CLUTTER_EASE_OUT_QUAD, 0.0, 0.f,
                        rect1, "y", CLUTTER_EASE_OUT_QUAD, 1.0, -height,
                        rect1, "opacity", CLUTTER_LINEAR, 0.9, 0xff,
                        rect1, "opacity", CLUTTER_EASE_OUT_QUAD, 1.0, 0x00,
                        NULL);
  set_easing_modes (animator1, rect1, FALSE, TRUE);
  clutter_animator_start (animator1);
  clutter_animator_set (animator2,
                        rect2, "x", CLUTTER_EASE_OUT_QUAD, 0.0, width,
                        rect2, "x", CLUTTER_EASE_OUT_QUAD, 1.0, 0.f,
                        rect2, "opacity", CLUTTER_LINEAR, 0.0, 0x00,
                        rect2, "opacity", CLUTTER_EASE_OUT_QUAD, 0.1, 0xff,
                        rect2, "opacity", CLUTTER_LINEAR, 1.0, 0xff,
                        NULL);
  set_easing_modes (animator2, rect2, TRUE, FALSE);
  clutter_animator_start (animator2);

  return FALSE;
}

static gboolean
rect2_clicked_cb ()
{
  clutter_animator_set (animator1,
                        rect1, "y", CLUTTER_EASE_OUT_QUAD, 0.0, -height,
                        rect1, "y", CLUTTER_EASE_OUT_QUAD, 1.0, 0.f,
                        rect1, "opacity", CLUTTER_LINEAR, 0.0, 0x00,
                        rect1, "opacity", CLUTTER_EASE_OUT_QUAD, 0.1, 0xff,
                        rect1, "opacity", CLUTTER_LINEAR, 1.0, 0xff,
                        NULL);
  set_easing_modes (animator1, rect1, FALSE, TRUE);
  clutter_animator_start (animator1);
  clutter_animator_set (animator2,
                        rect2, "x", CLUTTER_EASE_OUT_QUAD, 0.0, 0.f,
                        rect2, "x", CLUTTER_EASE_OUT_QUAD, 1.0, width,
                        rect2, "opacity", CLUTTER_LINEAR, 0.9, 0xff,
                        rect2, "opacity", CLUTTER_EASE_OUT_QUAD, 1.0, 0x00,
                        NULL);
  set_easing_modes (animator2, rect2, TRUE, FALSE);
  clutter_animator_start (animator2);

  return FALSE;
}

int
main (int argc, char **argv)
{
  const ClutterColor red = { 0xff, 0x00, 0x00, 0xff };
  const ClutterColor blue = { 0x00, 0x00, 0xff, 0xff };

  ClutterActor *stage;

  clutter_init (&argc, &argv);

  stage = clutter_stage_get_default ();

  rect1 = clutter_rectangle_new_with_color (&red);
  rect2 = clutter_rectangle_new_with_color (&blue);

  clutter_actor_get_size (stage, &width, &height);

  clutter_actor_set_size (rect1, width, height);
  clutter_actor_set_size (rect2, width, height);

  clutter_actor_set_position (rect2, width, 0);
  clutter_actor_set_opacity (rect2, 0x00);

  clutter_container_add (CLUTTER_CONTAINER (stage), rect1, rect2, NULL);

  animator1 = clutter_animator_new ();
  clutter_animator_set_duration (animator1, 2000);

  animator2 = clutter_animator_new ();
  clutter_animator_set_duration (animator2, 2000);

  clutter_actor_set_reactive (rect1, TRUE);
  clutter_actor_set_reactive (rect2, TRUE);

  g_signal_connect (rect1, "button-press-event",
                    G_CALLBACK (rect1_clicked_cb), NULL);
  g_signal_connect (rect2, "button-press-event",
                    G_CALLBACK (rect2_clicked_cb), NULL);

  clutter_actor_show (stage);

  clutter_main ();

  return 0;
}

