basic-actor.c 4.86 KB
Newer Older
1 2 3 4 5
#include <stdlib.h>
#include <clutter/clutter.h>

#define SIZE    128

6
static gboolean
7 8
animate_color (ClutterActor *actor,
               ClutterEvent *event)
9 10 11 12 13 14 15 16 17
{
  static gboolean toggled = TRUE;
  const ClutterColor *end_color;

  if (toggled)
    end_color = CLUTTER_COLOR_Blue;
  else
    end_color = CLUTTER_COLOR_Red;

18 19 20 21 22
  clutter_actor_save_easing_state (actor);
  clutter_actor_set_easing_duration (actor, 500);
  clutter_actor_set_easing_mode (actor, CLUTTER_LINEAR);
  clutter_actor_set_background_color (actor, end_color);
  clutter_actor_restore_easing_state (actor);
23 24 25 26 27 28

  toggled = !toggled;

  return CLUTTER_EVENT_STOP;
}

29 30
static gboolean
on_crossing (ClutterActor *actor,
31
             ClutterEvent *event)
32
{
33
  gboolean is_enter = clutter_event_type (event) == CLUTTER_ENTER;
34
  float zpos;
35 36

  if (is_enter)
37
    zpos = -250.0;
38
  else
39
    zpos = 0.0;
40

41 42 43
  clutter_actor_save_easing_state (actor);
  clutter_actor_set_easing_duration (actor, 500);
  clutter_actor_set_easing_mode (actor, CLUTTER_EASE_OUT_BOUNCE);
44
  clutter_actor_set_z_position (actor, zpos);
45
  clutter_actor_restore_easing_state (actor);
46 47 48 49 50

  return CLUTTER_EVENT_STOP;
}

static void
51 52 53
on_transition_stopped (ClutterActor *actor,
                       const gchar  *transition_name,
                       gboolean      is_finished)
54
{
55
  clutter_actor_save_easing_state (actor);
56
  clutter_actor_set_rotation_angle (actor, CLUTTER_Y_AXIS, 0.0f);
57
  clutter_actor_restore_easing_state (actor);
58 59 60 61 62

  /* disconnect so we don't get multiple notifications */
  g_signal_handlers_disconnect_by_func (actor,
                                        on_transition_stopped,
                                        NULL);
63 64 65 66 67 68
}

static gboolean
animate_rotation (ClutterActor *actor,
                  ClutterEvent *event)
{
69 70 71
  clutter_actor_save_easing_state (actor);
  clutter_actor_set_easing_duration (actor, 1000);

72
  clutter_actor_set_rotation_angle (actor, CLUTTER_Y_AXIS, 360.0);
73 74

  clutter_actor_restore_easing_state (actor);
75

76 77 78 79 80 81
  /* get a notification when the rotation-angle-y transition ends */
  g_signal_connect (actor,
                    "transition-stopped::rotation-angle-y",
                    G_CALLBACK (on_transition_stopped),
                    NULL);

82 83 84
  return CLUTTER_EVENT_STOP;
}

85 86
int
main (int argc, char *argv[])
87 88 89 90 91 92 93 94 95 96 97 98 99 100 101
{
  ClutterActor *stage, *vase;
  ClutterActor *flowers[3];

  if (clutter_init (&argc, &argv) != CLUTTER_INIT_SUCCESS)
    return EXIT_FAILURE;

  stage = clutter_stage_new ();
  g_signal_connect (stage, "destroy", G_CALLBACK (clutter_main_quit), NULL);
  clutter_stage_set_title (CLUTTER_STAGE (stage), "Three Flowers in a Vase");
  clutter_stage_set_user_resizable (CLUTTER_STAGE (stage), TRUE);

  /* there are three flowers in a vase */
  vase = clutter_actor_new ();
  clutter_actor_set_name (vase, "vase");
102
  clutter_actor_set_layout_manager (vase, clutter_box_layout_new ());
103
  clutter_actor_set_background_color (vase, CLUTTER_COLOR_LightSkyBlue);
104 105 106 107 108 109
  clutter_actor_add_constraint (vase, clutter_align_constraint_new (stage, CLUTTER_ALIGN_BOTH, 0.5));
  clutter_actor_add_child (stage, vase);

  flowers[0] = clutter_actor_new ();
  clutter_actor_set_name (flowers[0], "flower.1");
  clutter_actor_set_size (flowers[0], SIZE, SIZE);
110
  clutter_actor_set_margin_left (flowers[0], 12);
111
  clutter_actor_set_background_color (flowers[0], CLUTTER_COLOR_Red);
112
  clutter_actor_set_reactive (flowers[0], TRUE);
113
  clutter_actor_add_child (vase, flowers[0]);
114 115 116
  g_signal_connect (flowers[0], "button-press-event",
                    G_CALLBACK (animate_color),
                    NULL);
117 118 119 120

  flowers[1] = clutter_actor_new ();
  clutter_actor_set_name (flowers[1], "flower.2");
  clutter_actor_set_size (flowers[1], SIZE, SIZE);
121 122 123 124
  clutter_actor_set_margin_top (flowers[1], 12);
  clutter_actor_set_margin_left (flowers[1], 6);
  clutter_actor_set_margin_right (flowers[1], 6);
  clutter_actor_set_margin_bottom (flowers[1], 12);
125
  clutter_actor_set_background_color (flowers[1], CLUTTER_COLOR_Yellow);
126
  clutter_actor_set_reactive (flowers[1], TRUE);
127
  clutter_actor_add_child (vase, flowers[1]);
128 129
  g_signal_connect (flowers[1], "enter-event",
                    G_CALLBACK (on_crossing),
130
                    NULL);
131 132
  g_signal_connect (flowers[1], "leave-event",
                    G_CALLBACK (on_crossing),
133
                    NULL);
134 135 136 137 138

  /* the third one is green */
  flowers[2] = clutter_actor_new ();
  clutter_actor_set_name (flowers[2], "flower.3");
  clutter_actor_set_size (flowers[2], SIZE, SIZE);
139
  clutter_actor_set_margin_right (flowers[2], 12);
140
  clutter_actor_set_background_color (flowers[2], CLUTTER_COLOR_Green);
141
  clutter_actor_set_pivot_point (flowers[2], 0.5f, 0.0f);
142
  clutter_actor_set_reactive (flowers[2], TRUE);
143
  clutter_actor_add_child (vase, flowers[2]);
144 145 146
  g_signal_connect (flowers[2], "button-press-event",
                    G_CALLBACK (animate_rotation),
                    NULL);
147 148 149 150 151 152 153

  clutter_actor_show (stage);

  clutter_main ();

  return EXIT_SUCCESS;
}