From 817fe9c8d7535a465ed42153c550ceef8390ffac Mon Sep 17 00:00:00 2001 From: Harishankar Date: Sun, 3 May 2020 22:41:34 +0530 Subject: [PATCH] Rendered the grid in player and also fixed bug in save/load Fixed a bug in saving/loading file and also rendered the grid in the player application --- wordblox.h | 25 +++++++++------- wordblox_player.c | 66 ++++++++++++++++++++++++++++++------------- wordblox_player.glade | 2 +- 3 files changed, 62 insertions(+), 31 deletions(-) diff --git a/wordblox.h b/wordblox.h index 04adfa0..9a5c27c 100644 --- a/wordblox.h +++ b/wordblox.h @@ -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 a 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); diff --git a/wordblox_player.c b/wordblox_player.c index f4ecbb5..2904929 100644 --- a/wordblox_player.c +++ b/wordblox_player.c @@ -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); diff --git a/wordblox_player.glade b/wordblox_player.glade index 4b26971..428cb8a 100644 --- a/wordblox_player.glade +++ b/wordblox_player.glade @@ -52,7 +52,7 @@ False _Open... True - + -- 2.20.1