Rendered the grid in player and also fixed bug in save/load
[wordblah.git] / wordblox_player.c
1 #include <gtk/gtk.h>
2
3 #include "constantstrings.h"
4 #include "wordblox_resource.c"
5 #include "wordblox.h"
6
7 GtkWidget *window;
8
9 struct MainAppData {
10 Puzzle puzzle;
11 char filename[65535];
12 bool is_loaded;
13 } app_data;
14
15 /* slot for drawing the puzzle */
16 gboolean on_puzzle_area_draw (GtkWidget *widget, cairo_t *cr, gpointer data)
17 {
18 /* if a puzzle is loaded */
19 if (app_data.is_loaded == true)
20 {
21 GdkRGBA colorfore, colorback;
22 gdk_rgba_parse (&colorfore, "#000000");
23 gdk_rgba_parse (&colorback, "#ffffff");
24 cairo_set_line_width (cr, 3);
25
26 /* set the size of the drawing area */
27 gtk_widget_set_size_request (widget, app_data.puzzle.grid_size*30+5,
28 app_data.puzzle.grid_size*30+5);
29
30 /* Draw the grid */
31 for (int i = 0; i < app_data.puzzle.grid_size; i ++)
32 {
33 for (int j = 0; j < app_data.puzzle.grid_size; j ++)
34 {
35 cairo_rectangle (cr, j*30+5, i*30+5, 30, 30);
36 gdk_cairo_set_source_rgba (cr, &colorfore);
37 cairo_stroke (cr);
38
39 /* if it is not a blank grid then set the background color
40 to black */
41 if (app_data.puzzle.chars[i][j] != '#')
42 gdk_cairo_set_source_rgba (cr, &colorback);
43
44 cairo_rectangle (cr, j*30+5, i*30+5, 30, 30);
45
46 cairo_fill (cr);
47 }
48 }
49 }
50
51 return FALSE;
52
53 }
54
55 /* slot for exit menu */
56 void on_menu_exit_activate (GtkMenuItem *item, gpointer data)
57 {
58 gtk_main_quit ();
59 }
60
61 /* slot for open menu */
62 void on_menu_open_activate (GtkMenuItem *item, GtkDrawingArea* area)
63 {
64 GtkWidget *dialog;
65 GtkFileChooserAction action = GTK_FILE_CHOOSER_ACTION_OPEN;
66 gint res;
67 dialog = gtk_file_chooser_dialog_new (OPEN_FILE, GTK_WINDOW(window), action,
68 "_Cancel",
69 GTK_RESPONSE_CANCEL,
70 "_Open",
71 GTK_RESPONSE_ACCEPT,
72 NULL);
73 res = gtk_dialog_run (GTK_DIALOG (dialog));
74 if (res == GTK_RESPONSE_ACCEPT)
75 {
76 char *filename;
77 filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER(dialog));
78 app_data.puzzle = load_puzzle (filename);
79 app_data.is_loaded = true;
80 strcpy (app_data.filename, filename);
81 /* if the grid is not frozen then the game cannot be played */
82 if (app_data.puzzle.grid_frozen == false)
83 {
84 GtkWidget *errordlg ;
85 errordlg = gtk_message_dialog_new (GTK_WINDOW(window),
86 GTK_DIALOG_DESTROY_WITH_PARENT,
87 GTK_MESSAGE_ERROR,
88 GTK_BUTTONS_CLOSE,
89 UNFROZEN_GRID_PLAYER);
90 gtk_dialog_run (GTK_DIALOG(errordlg));
91 gtk_widget_destroy (errordlg);
92 app_data.is_loaded = false;
93 }
94
95 gtk_widget_queue_draw_area (GTK_WIDGET (area), 0, 0, 305, 305);
96
97 g_free (filename);
98 }
99
100 gtk_widget_destroy (dialog);
101 }
102
103 /* slot for about menu */
104 void on_menu_about_activate (GtkMenuItem *item, gpointer data)
105 {
106 const char *AUTHOR[] = {"V.Harishankar", NULL};
107 gtk_show_about_dialog (GTK_WINDOW(window), "authors",AUTHOR,
108 "program-name", PROGRAM_NAME,
109 "copyright", COPYRIGHT,
110 "comments", COMMENTS,
111 "website", WEBSITE,
112 "website-label", WEBSITE_LABEL,
113 "license-type", GTK_LICENSE_GPL_2_0,
114 "version", VERSION,
115 (char*)NULL);
116 }
117
118 int main (int argc, char *argv [])
119 {
120 gtk_init (&argc, &argv);
121 GdkPixbuf *icon;
122 icon = gdk_pixbuf_new_from_resource
123 ("/org/harishankar/wordblox/wordblox.svg", NULL);
124 if (icon == NULL)
125 fprintf (stderr, ERROR_ICON);
126
127 GtkBuilder *builder;
128 builder = gtk_builder_new ();
129 guint ret = gtk_builder_add_from_resource (builder,
130 "/org/harishankar/wordblox/wordblox_player.glade", NULL);
131
132 app_data.is_loaded = false;
133
134 if (ret == 0)
135 {
136 fprintf (stderr, ERROR_WINDOW);
137 g_object_unref (builder);
138 return 1;
139 }
140 else
141 {
142 window = GTK_WIDGET (gtk_builder_get_object (builder, "main_window") );
143 if (window != NULL)
144 {
145 gtk_window_set_default_icon (icon);
146
147 gtk_builder_connect_signals (builder, NULL);
148 g_object_unref (builder);
149 gtk_widget_show (window);
150 gtk_main ();
151 return 0;
152 }
153 else
154 {
155 g_object_unref (builder);
156 fprintf (stderr, ERROR_WINDOW);
157 return 1;
158 }
159 }
160 }