X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=rack-fancy.c;h=310e6dd54943d55f98c1c6043456c13b0d2b924b;hb=48281e874ef936437b581a444cbd1134cec20edb;hp=38c125394e9c8aeeaa6f4070cf643dafc8b3f362;hpb=f8d083966703a2b0efb6db1782a14a1a0b5d56f4;p=wordgame diff --git a/rack-fancy.c b/rack-fancy.c index 38c1253..310e6dd 100644 --- a/rack-fancy.c +++ b/rack-fancy.c @@ -16,7 +16,14 @@ * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA." */ #include +#include #include +#include +#include +#include +#include + +#include "word-game.h" #include "demo-item.h" static gboolean @@ -50,21 +57,69 @@ 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_demo_item_glide_to (letter_items[i], x, y); + } + return TRUE; } static void -create_canvas (GtkWidget *parent) +create_canvas (GtkWidget *parent, char *word) { GtkWidget *canvas; - GooCanvasItem *root, *rect; + GooCanvasItem *root; + int i; + int x, y; canvas = goo_canvas_new (); gtk_widget_set_size_request (canvas, 400, 400); @@ -74,25 +129,47 @@ create_canvas (GtkWidget *parent) root = goo_canvas_get_root_item (GOO_CANVAS (canvas)); - rect = goo_demo_item_new (root, 30, 20, 50, 30, - "fill-color", "purple", - NULL); - - g_signal_connect (rect, "button_press_event", - (GtkSignalFunc) on_button_press, 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, + word[i], + NULL); + + 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 main (int argc, char *argv[]) { + struct timeval tv; + bag_t bag; + char rack[8]; + int i; GtkWidget *window; - gtk_init (&argc, &argv); + gettimeofday (&tv, NULL); + srand (tv.tv_sec ^ tv.tv_usec); + + bag_init (&bag); + bag_shuffle (&bag); + memcpy (rack, bag.tiles, 7); + rack[7] = '\0'; + + for (i = 0; i < 7; i++) + rack[i] = toupper (rack[i]); + + gtk_init (&argc, &argv); window = create_window (); - create_canvas (window); + create_canvas (window, rack); gtk_main ();