Rendered the grid in player and also fixed bug in save/load
authorHarishankar <v.harishankar@gmail.com>
Sun, 3 May 2020 17:11:34 +0000 (22:41 +0530)
committerHarishankar <v.harishankar@gmail.com>
Sun, 3 May 2020 17:11:34 +0000 (22:41 +0530)
Fixed a bug in saving/loading file and also rendered the grid
in the player application

wordblox.h
wordblox_player.c
wordblox_player.glade

index 04adfa0..9a5c27c 100644 (file)
@@ -142,7 +142,7 @@ void export_grid_image  (Puzzle *p, const char *filename, bool answerkey)
        }
        
        gdImagePtr img = gdImageCreate (img_size, img_size);
-       int white = gdImageColorAllocate (img, 255,255,255);
+       gdImageColorAllocate (img, 255,255,255);
        int black = gdImageColorAllocate (img, 0, 0, 0);
        int blue = gdImageColorAllocate (img, 0, 0, 216);
        gdFontPtr sm_fnt = gdFontGetMediumBold ();
@@ -236,7 +236,7 @@ bool next_col_blank (Puzzle *p, int r, int c)
        return false;
 }
 
-/* unfreeze the grid - mak editing possible to change words */
+/* unfreeze the grid - make editing possible to change words */
 void unfreeze_puzzle (Puzzle *p)
 {
        for (int i = 0; i < p->grid_size; i ++)
@@ -320,7 +320,7 @@ void init_puzzle (Puzzle *p, int grid_size)
 /* save the puzzle to a file */
 void save_puzzle (Puzzle *puzzle, const char* file) {
        FILE *outfile;
-       /* First output the uncompressed contents to temp file */
+       /* First output the uncompressed contents to temp file */
        outfile = tmpfile ();
        if (outfile == NULL)
        {
@@ -389,7 +389,7 @@ void save_puzzle (Puzzle *puzzle, const char* file) {
        gzip compressed file */
        fflush (outfile);
        fseek (outfile, 0, 0);
-               
+                       
        /* now compress the file and save it to destination file */
        gzFile outdestfile = gzopen (file, "wb");
        if (outdestfile == NULL)
@@ -398,16 +398,18 @@ void save_puzzle (Puzzle *puzzle, const char* file) {
                fclose (outfile);
                exit (1);
        }
-       char buf[4096];
-       while (fread (buf, sizeof(char), 4096, outfile))
+       char buf[128];
+       int num = fread (buf, sizeof(char), sizeof(char)*128, outfile);
+       while (num > 0)
        {
-               int res = gzwrite (outdestfile, buf, strlen (buf) );
+               int res = gzwrite (outdestfile, buf, num*sizeof(char) );
                if (res == 0)
                {
                        fprintf (stderr, "%s %s\n", ERROR_WRITING_FILE, COMPRESSED);
                        fclose (outfile);
                        exit (1);
                }
+               num = fread (buf, sizeof(char), sizeof(char)*128, outfile);
        }
        gzclose (outdestfile);
        fclose (outfile);
@@ -431,10 +433,12 @@ Puzzle load_puzzle (const char* file) {
                exit (1);       
        }
        /* Put the uncompressed content to the temp file */
-       char buf[4096];
-       while (gzread (insourcefile, buf, 4096))
+       char buf[128];
+       int num = 0;
+       num = gzread (insourcefile, buf, 128);
+       while (num > 0)
        {
-               int res = fwrite (buf, sizeof(char), strlen (buf), infile);
+               int res = fwrite (buf, 1, num, infile);
                if (res == 0)
                {
                        fprintf (stderr, "%s\n", ERROR_READING_FILE);
@@ -442,6 +446,7 @@ Puzzle load_puzzle (const char* file) {
                        gzclose (insourcefile);
                        exit (1);
                }
+               num = gzread (insourcefile, buf, 128);
        }
        /* Close the gzip file */
        gzclose (insourcefile);
index f4ecbb5..2904929 100644 (file)
@@ -6,28 +6,48 @@
 
 GtkWidget *window; 
 
+struct MainAppData {
+       Puzzle puzzle;
+       char filename[65535];
+       bool is_loaded;
+} app_data;
+
 /* slot for drawing the puzzle */
 gboolean on_puzzle_area_draw (GtkWidget *widget, cairo_t *cr, gpointer data)
 {
-       GdkRGBA colorfore, colorback;
-       gdk_rgba_parse (&colorfore, "#000000"); 
-       gdk_rgba_parse (&colorback, "#ffffff");
-       cairo_set_line_width (cr, 3);
-       gtk_widget_set_size_request (widget, 10*30+5, 10*30+5);
-       for (int i = 0; i < 10; i ++)
+       /* if a puzzle is loaded */
+       if (app_data.is_loaded == true)
        {
-               for (int j = 0; j < 10; j ++)
+               GdkRGBA colorfore, colorback;
+               gdk_rgba_parse (&colorfore, "#000000"); 
+               gdk_rgba_parse (&colorback, "#ffffff");
+               cairo_set_line_width (cr, 3);
+               
+               /* set the size of the drawing area */
+               gtk_widget_set_size_request (widget, app_data.puzzle.grid_size*30+5, 
+                                                                                       app_data.puzzle.grid_size*30+5);
+                                                               
+               /* Draw the grid */                     
+               for (int i = 0; i < app_data.puzzle.grid_size; i ++)
                {
-                       cairo_rectangle (cr, i*30+5, j*30+5, 30, 30);
-                       gdk_cairo_set_source_rgba (cr, &colorfore);
-                       cairo_stroke (cr);
-                       
-                       cairo_rectangle (cr, i*30+5, j*30+5, 30, 30);
-                       gdk_cairo_set_source_rgba (cr, &colorback);
-                       cairo_fill (cr);
+                       for (int j = 0; j < app_data.puzzle.grid_size; j ++)
+                       {
+                               cairo_rectangle (cr, j*30+5, i*30+5, 30, 30);
+                               gdk_cairo_set_source_rgba (cr, &colorfore);
+                               cairo_stroke (cr);
+                               
+                               /* if it is not a blank grid then set the background color
+                                  to black */
+                               if (app_data.puzzle.chars[i][j] != '#')
+                                       gdk_cairo_set_source_rgba (cr, &colorback);
+                               
+                               cairo_rectangle (cr, j*30+5, i*30+5, 30, 30);
+
+                               cairo_fill (cr);
+                       }
                }
        }
-       
+                       
        return FALSE;
 
 }
@@ -39,7 +59,7 @@ void on_menu_exit_activate (GtkMenuItem *item, gpointer data)
 }
 
 /* slot for open menu */
-void on_menu_open_activate (GtkMenuItem *item, gpointer data)
+void on_menu_open_activate (GtkMenuItem *item, GtkDrawingArea* area)
 {
        GtkWidget *dialog;
        GtkFileChooserAction action = GTK_FILE_CHOOSER_ACTION_OPEN;
@@ -55,9 +75,11 @@ void on_menu_open_activate (GtkMenuItem *item, gpointer data)
        {
                char *filename;
                filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER(dialog));
-               Puzzle p = load_puzzle (filename);
+               app_data.puzzle = load_puzzle (filename);
+               app_data.is_loaded = true;
+               strcpy (app_data.filename, filename);           
                /* if the grid is not frozen then the game cannot be played */
-               if (p.grid_frozen == false)
+               if (app_data.puzzle.grid_frozen == false)
                {
                        GtkWidget *errordlg ;
                        errordlg = gtk_message_dialog_new (GTK_WINDOW(window), 
@@ -67,9 +89,11 @@ void on_menu_open_activate (GtkMenuItem *item, gpointer data)
                                                                                                UNFROZEN_GRID_PLAYER);
                        gtk_dialog_run (GTK_DIALOG(errordlg));
                        gtk_widget_destroy (errordlg);
-               
+                       app_data.is_loaded = false;
                }
                
+               gtk_widget_queue_draw_area (GTK_WIDGET (area), 0, 0, 305, 305);
+               
                g_free (filename);
        }
        
@@ -99,12 +123,14 @@ int main (int argc, char *argv [])
                                ("/org/harishankar/wordblox/wordblox.svg", NULL);
        if (icon == NULL)
                fprintf (stderr, ERROR_ICON);
-               
+       
        GtkBuilder *builder;
        builder = gtk_builder_new ();
        guint ret = gtk_builder_add_from_resource (builder, 
                "/org/harishankar/wordblox/wordblox_player.glade", NULL);
        
+       app_data.is_loaded = false;
+       
        if (ret == 0)
        {
                fprintf (stderr, ERROR_WINDOW);
index 4b26971..428cb8a 100644 (file)
@@ -52,7 +52,7 @@
                         <property name="can_focus">False</property>
                         <property name="label" translatable="yes">_Open...</property>
                         <property name="use_underline">True</property>
-                        <signal name="activate" handler="on_menu_open_activate" swapped="no"/>
+                        <signal name="activate" handler="on_menu_open_activate" object="puzzle_area" swapped="no"/>
                       </object>
                     </child>
                     <child>