Blame examples/gtk-clutter-test-actor.c

Packit 1069cd
#include <gtk/gtk.h>
Packit 1069cd
#include <clutter/clutter.h>
Packit 1069cd
#include <math.h>
Packit 1069cd
Packit 1069cd
#include <clutter-gtk/clutter-gtk.h>
Packit 1069cd
Packit 1069cd
#define MAX_NWIDGETS   4
Packit 1069cd
#define WINWIDTH   400
Packit 1069cd
#define WINHEIGHT  400
Packit 1069cd
#define RADIUS     80
Packit 1069cd
Packit 1069cd
static ClutterActor *group = NULL;
Packit 1069cd
static ClutterActor *widgets[MAX_NWIDGETS];
Packit 1069cd
static gboolean do_rotate = TRUE;
Packit 1069cd
Packit 1069cd
static int nwidgets;
Packit 1069cd
Packit 1069cd
/* Timeline handler */
Packit 1069cd
void
Packit 1069cd
frame_cb (ClutterTimeline *timeline,
Packit 1069cd
	  gint             msecs,
Packit 1069cd
	  gpointer         data)
Packit 1069cd
{
Packit 1069cd
  double rotation = clutter_timeline_get_progress (timeline) * 360.0;
Packit 1069cd
  gint i;
Packit 1069cd
Packit 1069cd
  if (!do_rotate)
Packit 1069cd
    return;
Packit 1069cd
Packit 1069cd
  /* Rotate everything clockwise about stage center */
Packit 1069cd
  clutter_actor_set_rotation_angle (group, CLUTTER_Z_AXIS, rotation);
Packit 1069cd
Packit 1069cd
  for (i = 0; i < nwidgets; i++)
Packit 1069cd
    {
Packit 1069cd
      clutter_actor_set_rotation_angle (widgets[i], CLUTTER_Z_AXIS, - 2 * rotation);
Packit 1069cd
      clutter_actor_set_opacity (widgets[i], 50 * sin (2 * M_PI * rotation / 360) + (255 - 50));
Packit 1069cd
    }
Packit 1069cd
}
Packit 1069cd
Packit 1069cd
static void
Packit 1069cd
button_clicked (GtkWidget *button,
Packit 1069cd
		GtkWidget *vbox)
Packit 1069cd
{
Packit 1069cd
  GtkWidget *label;
Packit 1069cd
  g_print ("button clicked\n");
Packit 1069cd
  label = gtk_label_new ("A new label");
Packit 1069cd
  gtk_widget_show (label);
Packit 1069cd
  gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
Packit 1069cd
}
Packit 1069cd
Packit 1069cd
static ClutterActor *
Packit 1069cd
create_gtk_actor (int i)
Packit 1069cd
{
Packit 1069cd
  GtkWidget       *button, *vbox, *entry, *bin;
Packit 1069cd
  ClutterActor    *gtk_actor;
Packit 1069cd
Packit 1069cd
  gtk_actor = gtk_clutter_actor_new ();
Packit 1069cd
  bin = gtk_clutter_actor_get_widget (GTK_CLUTTER_ACTOR (gtk_actor));
Packit 1069cd
Packit 1069cd
  vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6);
Packit 1069cd
  gtk_container_add (GTK_CONTAINER (bin), vbox);
Packit 1069cd
Packit 1069cd
  button = gtk_button_new_with_label ("A Button");
Packit 1069cd
  gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
Packit 1069cd
Packit 1069cd
  g_signal_connect (button, "clicked", G_CALLBACK (button_clicked), vbox);
Packit 1069cd
Packit 1069cd
  button = gtk_check_button_new_with_label ("Another button");
Packit 1069cd
  gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
Packit 1069cd
Packit 1069cd
  entry = gtk_entry_new ();
Packit 1069cd
  gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
Packit 1069cd
Packit 1069cd
  gtk_widget_show_all (bin);
Packit 1069cd
Packit 1069cd
  return gtk_actor;
Packit 1069cd
}
Packit 1069cd
Packit 1069cd
static void
Packit 1069cd
add_clutter_actor (ClutterActor *actor,
Packit 1069cd
		   ClutterActor *container,
Packit 1069cd
		   int           i)
Packit 1069cd
{
Packit 1069cd
  float x, y, w, h;
Packit 1069cd
Packit 1069cd
  /* Add to our group group */
Packit 1069cd
  clutter_actor_add_child (container, actor);
Packit 1069cd
Packit 1069cd
  /* Place around a circle */
Packit 1069cd
  w = clutter_actor_get_width (widgets[0]);
Packit 1069cd
  h = clutter_actor_get_height (widgets[0]);
Packit 1069cd
Packit 1069cd
  x = WINWIDTH / 2  + RADIUS * cosf (i * 2 * M_PI / (MAX_NWIDGETS)) - w / 2;
Packit 1069cd
  y = WINHEIGHT / 2 + RADIUS * sinf (i * 2 * M_PI / (MAX_NWIDGETS)) - h / 2;
Packit 1069cd
Packit 1069cd
  clutter_actor_set_position (actor, x, y);
Packit 1069cd
  clutter_actor_set_pivot_point (actor, 0.5, 0.5);
Packit 1069cd
}
Packit 1069cd
Packit 1069cd
static gboolean
Packit 1069cd
add_or_remove_timeout (gpointer user_data)
Packit 1069cd
{
Packit 1069cd
  if (nwidgets == MAX_NWIDGETS)
Packit 1069cd
    {
Packit 1069cd
      /* Removing an item */
Packit 1069cd
      clutter_actor_remove_child (group, widgets[MAX_NWIDGETS - 1]);
Packit 1069cd
      widgets[MAX_NWIDGETS - 1] = NULL;
Packit 1069cd
Packit 1069cd
      nwidgets--;
Packit 1069cd
    }
Packit 1069cd
  else
Packit 1069cd
    {
Packit 1069cd
      /* Adding an item */
Packit 1069cd
      widgets[MAX_NWIDGETS - 1] = create_gtk_actor (MAX_NWIDGETS - 1);
Packit 1069cd
      nwidgets++;
Packit 1069cd
Packit 1069cd
      add_clutter_actor (widgets[MAX_NWIDGETS - 1], group, MAX_NWIDGETS - 1);
Packit 1069cd
    }
Packit 1069cd
Packit 1069cd
  return G_SOURCE_CONTINUE;
Packit 1069cd
}
Packit 1069cd
Packit 1069cd
int
Packit 1069cd
main (int argc, char *argv[])
Packit 1069cd
{
Packit 1069cd
  ClutterTimeline *timeline;
Packit 1069cd
  ClutterActor    *stage;
Packit 1069cd
  ClutterColor     stage_color = { 0x61, 0x64, 0x8c, 0xff };
Packit 1069cd
  GtkWidget       *window, *clutter;
Packit 1069cd
  GtkWidget       *button, *vbox;
Packit 1069cd
  gint             i;
Packit 1069cd
Packit 1069cd
  if (gtk_clutter_init_with_args (&argc, &argv, NULL, NULL, NULL, NULL) != CLUTTER_INIT_SUCCESS)
Packit 1069cd
    g_error ("Unable to initialize GtkClutter");
Packit 1069cd
Packit 1069cd
  if (argc != 1)
Packit 1069cd
    do_rotate = FALSE;
Packit 1069cd
Packit 1069cd
  window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
Packit 1069cd
  g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);
Packit 1069cd
Packit 1069cd
  vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6);
Packit 1069cd
  gtk_container_add (GTK_CONTAINER (window), vbox);
Packit 1069cd
Packit 1069cd
  clutter = gtk_clutter_embed_new ();
Packit 1069cd
  gtk_widget_set_size_request (clutter, WINWIDTH, WINHEIGHT);
Packit 1069cd
Packit 1069cd
  gtk_box_pack_start (GTK_BOX (vbox), clutter, TRUE, TRUE, 0);
Packit 1069cd
Packit 1069cd
  stage = gtk_clutter_embed_get_stage (GTK_CLUTTER_EMBED (clutter));
Packit 1069cd
Packit 1069cd
  button = gtk_button_new_with_mnemonic ("_Quit");
Packit 1069cd
  g_signal_connect_swapped (button, "clicked",
Packit 1069cd
			    G_CALLBACK (gtk_widget_destroy),
Packit 1069cd
			    window);
Packit 1069cd
  gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
Packit 1069cd
Packit 1069cd
  clutter_actor_set_background_color (stage, &stage_color);
Packit 1069cd
Packit 1069cd
  nwidgets = 0;
Packit 1069cd
Packit 1069cd
  /* create a new group to hold multiple actors in a group */
Packit 1069cd
  group = clutter_actor_new ();
Packit 1069cd
  clutter_actor_set_pivot_point (group, 0.5, 0.5);
Packit 1069cd
Packit 1069cd
  for (i = 0; i < MAX_NWIDGETS; i++)
Packit 1069cd
    {
Packit 1069cd
      widgets[i] = create_gtk_actor (i);
Packit 1069cd
      nwidgets++;
Packit 1069cd
Packit 1069cd
      add_clutter_actor (widgets[i], group, i);
Packit 1069cd
    }
Packit 1069cd
Packit 1069cd
  /* Add the group to the stage and center it*/
Packit 1069cd
  clutter_actor_add_child (stage, group);
Packit 1069cd
  clutter_actor_add_constraint (group, clutter_align_constraint_new (stage, CLUTTER_ALIGN_BOTH, 0.5));
Packit 1069cd
Packit 1069cd
  gtk_widget_show_all (window);
Packit 1069cd
Packit 1069cd
  /* Create a timeline to manage animation */
Packit 1069cd
  timeline = clutter_timeline_new (6000);
Packit 1069cd
  clutter_timeline_set_repeat_count (timeline, -1);
Packit 1069cd
Packit 1069cd
  /* fire a callback for frame change */
Packit 1069cd
  g_signal_connect (timeline, "new-frame",  G_CALLBACK (frame_cb), stage);
Packit 1069cd
Packit 1069cd
  /* and start it */
Packit 1069cd
  clutter_timeline_start (timeline);
Packit 1069cd
Packit 1069cd
  g_timeout_add_seconds (3, add_or_remove_timeout, NULL);
Packit 1069cd
Packit 1069cd
  gtk_main();
Packit 1069cd
Packit 1069cd
  return 0;
Packit 1069cd
}