From 94e6a95793f85c391427cc429f8d52650554f5b1 Mon Sep 17 00:00:00 2001 From: Carl Worth Date: Thu, 30 Nov 2006 23:58:10 -0800 Subject: [PATCH] Add letter scrambling animation to rack-fancy Currently this is triggered by clicking on a letter. Should switch this to use the spacebar instead soon. --- rack-fancy.c | 76 ++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 65 insertions(+), 11 deletions(-) diff --git a/rack-fancy.c b/rack-fancy.c index 14c8d70..9173abb 100644 --- a/rack-fancy.c +++ b/rack-fancy.c @@ -56,13 +56,64 @@ create_window (void) return scrolled_window; } +#define MAX_LETTERS 7 +static GooCanvasItem *letter_items[MAX_LETTERS]; +static int num_letters; + +static int +rand_within (int num_values) +{ + return (int) ((double) num_values * (rand() / (RAND_MAX + 1.0))); +} + +static void +shuffle (int *array, int length) +{ + int i, r, tmp; + + for (i = 0; i < length; i++) + { + r = i + rand_within (length - i); + tmp = array[i]; + array[i] = array[r]; + array[r] = tmp; + } +} + +#define LETTER_SIZE 60 +#define LETTER_PAD 5 + +static void +get_letter_position (int i, int *x, int *y) +{ + *x = 20 + i * (LETTER_SIZE + LETTER_PAD); + *y = 20; +} + static gboolean on_button_press (GooCanvasItem *item, GooCanvasItem *target, GdkEventButton *event, gpointer data) { - g_print ("demo item received button press event\n"); + int indices[MAX_LETTERS]; + int i, x, y; + + for (i = 0; i < num_letters; i++) + indices[i] = i; + + shuffle (indices, num_letters); + + for (i = 0; i < num_letters; i++) { + get_letter_position (indices[i], &x, &y); + goo_canvas_item_animate (letter_items[i], + x - GOO_DEMO_ITEM (letter_items[i])->x, + y - GOO_DEMO_ITEM (letter_items[i])->y, + 1.0, 0, + 1000, 40, + GOO_CANVAS_ANIMATE_FREEZE); + } + return TRUE; } @@ -70,10 +121,9 @@ static void create_canvas (GtkWidget *parent, char *word) { GtkWidget *canvas; - GooCanvasItem *root, *letter; + GooCanvasItem *root; int i; - int item_size = 60; - int item_pad = 5; + int x, y; canvas = goo_canvas_new (); gtk_widget_set_size_request (canvas, 400, 400); @@ -83,16 +133,20 @@ create_canvas (GtkWidget *parent, char *word) root = goo_canvas_get_root_item (GOO_CANVAS (canvas)); - for (i = 0; i < strlen (word); i++) { - letter = goo_demo_item_new (root, - 30 + i * (item_size + item_pad), 20, - item_size, item_size, - word[i], - NULL); + for (i = 0; i < MIN (MAX_LETTERS, strlen (word)); i++) { + get_letter_position (i, &x, &y); + letter_items[i] = goo_demo_item_new (root, + x, y, + LETTER_SIZE, LETTER_SIZE, + word[i], + NULL); - g_signal_connect (letter, "button_press_event", + g_signal_connect (letter_items[i], "button_press_event", (GtkSignalFunc) on_button_press, NULL); } + num_letters = i; + while (i < MAX_LETTERS) + letter_items[i] = NULL; } int -- 2.43.0