]> git.cworth.org Git - wordgame/commitdiff
Make rack-fancy select and display a rack of 7 random letters
authorCarl Worth <cworth@cworth.org>
Fri, 1 Dec 2006 07:35:26 +0000 (23:35 -0800)
committerCarl Worth <cworth@cworth.org>
Fri, 1 Dec 2006 07:35:26 +0000 (23:35 -0800)
The letter display uses a very cheesy effect with a radial gradient.
I'll have to come up with something reasonable later.

.gitignore
demo-item.c
demo-item.h
rack-fancy.c

index 2e7b69f9b5573658cf367c438e88ca6e310c31d2..37848f34091f9ddd2a1557591e7bc127cd357c99 100644 (file)
@@ -3,5 +3,6 @@ drill2
 grid4
 grid5
 rack
+rack-fancy
 *.o
 *~
index 2eaf830c2235faee43ec53633f3c7d2262e90ec7..b38e4210dc3258b5f43875aff4fc71cd548f265d 100644 (file)
@@ -4,6 +4,8 @@
  *
  * demo-item.c - a simple demo item.
  */
+#include <math.h>
+
 #include "goocanvas.h"
 #include "demo-item.h"
 
@@ -31,6 +33,7 @@ goo_demo_item_new (GooCanvasItem      *parent,
                   gdouble             y,
                   gdouble             width,
                   gdouble             height,
+                  char                letter,
                   ...)
 {
     GooCanvasItem *item;
@@ -45,8 +48,9 @@ goo_demo_item_new (GooCanvasItem      *parent,
     demo_item->y = y;
     demo_item->width = width;
     demo_item->height = height;
+    demo_item->letter = letter;
 
-    va_start (var_args, height);
+    va_start (var_args, letter);
     first_property = va_arg (var_args, char*);
     if (first_property)
        g_object_set_valist ((GObject*) item, first_property, var_args);
@@ -88,16 +92,52 @@ goo_demo_item_paint (GooCanvasItemSimple *simple,
                     cairo_t             *cr,
                     GooCanvasBounds     *bounds)
 {
-    GooDemoItem *demo_item = (GooDemoItem*) simple;
+    GooDemoItem *item = (GooDemoItem*) simple;
+    cairo_pattern_t *gradient;
+    cairo_text_extents_t extents;
+    int rad = (int) MIN (item->width / 2, item->height / 2);
+    int cx = item->x + item->width / 2;
+    int cy = item->y + item->height / 2;
+    double spot_angle = M_PI / 4.0;
+    double spot_rad = rad / 2.0;
+    char string[2];
+
+    cairo_save (cr);
+
+    gradient = cairo_pattern_create_radial (cx - spot_rad * cos (spot_angle),
+                                           cy - spot_rad * sin (spot_angle),
+                                           0.0,
+                                           cx - spot_rad * cos (spot_angle),
+                                           cy - spot_rad * sin (spot_angle),
+                                           rad + spot_rad);
+    cairo_pattern_add_color_stop_rgb (gradient, 0.0, 1.0, 1.0, 1.0);
+    cairo_pattern_add_color_stop_rgb (gradient, 1.0, 0.33, 0.33, 0.33);
+
+    cairo_set_source (cr, gradient);
+
+    cairo_arc (cr,
+              cx, cy,
+              rad, 0, 2 * M_PI);
 
-    cairo_move_to (cr, demo_item->x, demo_item->y);
-    cairo_line_to (cr, demo_item->x, demo_item->y + demo_item->height);
-    cairo_line_to (cr, demo_item->x + demo_item->width,
-                  demo_item->y + demo_item->height);
-    cairo_line_to (cr, demo_item->x + demo_item->width, demo_item->y);
-    cairo_close_path (cr);
-    goo_canvas_style_set_fill_options (simple->simple_data->style, cr);
     cairo_fill (cr);
+
+    cairo_select_font_face (cr, "mono",
+                           CAIRO_FONT_SLANT_NORMAL,
+                           CAIRO_FONT_WEIGHT_BOLD);
+    cairo_set_font_size (cr, 1.8 * rad);
+
+    string[0] = item->letter;
+    string[1] = '\0';
+    cairo_text_extents (cr, string, &extents);
+    cairo_move_to (cr,
+                  cx - extents.width / 2 - extents.x_bearing,
+                  cy - extents.height / 2 - extents.y_bearing);
+
+    cairo_set_source_rgb (cr, 0.2, 0.3, 0.8);
+    cairo_show_text (cr, string);
+                  
+
+    cairo_restore (cr);
 }
 
 /* Hit detection. This should check if the given coordinate (in the item's
index 81ad4b00e5657febbf89ea67fb9aa554635079ae..d7dc396dd3a0a12d9071808d81f5d2c9d6e58834 100644 (file)
@@ -27,6 +27,7 @@ struct _GooDemoItem
     GooCanvasItemSimple parent_object;
 
     gdouble x, y, width, height;
+    char letter;
 };
 
 struct _GooDemoItemClass
@@ -41,6 +42,7 @@ GooCanvasItem*      goo_demo_item_new       (GooCanvasItem      *parent,
                                             gdouble             y,
                                             gdouble             width,
                                             gdouble             height,
+                                            char                letter,
                                             ...);
 G_END_DECLS
 
index 38c125394e9c8aeeaa6f4070cf643dafc8b3f362..14c8d70fa8b55c3f0e47f4c13a3c2cc70b69cc78 100644 (file)
  * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA."
  */
 #include <stdlib.h>
+#include <string.h>
 #include <goocanvas.h>
+#include <sys/time.h>
+#include <time.h>
+#include <ctype.h>
+
+#include "word-game.h"
 #include "demo-item.h"
 
 static gboolean
@@ -61,10 +67,13 @@ on_button_press (GooCanvasItem  *item,
 }
 
 static void
-create_canvas (GtkWidget *parent)
+create_canvas (GtkWidget *parent, char *word)
 {
     GtkWidget *canvas;
-    GooCanvasItem *root, *rect;
+    GooCanvasItem *root, *letter;
+    int i;
+    int item_size = 60;
+    int item_pad = 5;
 
     canvas = goo_canvas_new ();
     gtk_widget_set_size_request (canvas, 400, 400);
@@ -74,25 +83,43 @@ 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 < strlen (word); i++) {
+       letter = goo_demo_item_new (root,
+                                   30 + i * (item_size + item_pad), 20,
+                                   item_size, item_size,
+                                   word[i],
+                                   NULL);
 
+       g_signal_connect (letter, "button_press_event",
+                         (GtkSignalFunc) on_button_press, 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 ();