X-Git-Url: https://harishankar.org/repos/?p=wordblah.git;a=blobdiff_plain;f=wordblox_player.c;fp=wordblox_player.c;h=605d9f50139d59b9762f806ba3e811b00c66c2eb;hp=8e7299b43a95db948733674045d345d14dc285b2;hb=d2f6f0eb05c333a2b0991bb7613780aab629460f;hpb=350edf3c909ce7926dc84411190cca003f6ac2e9 diff --git a/wordblox_player.c b/wordblox_player.c index 8e7299b..605d9f5 100644 --- a/wordblox_player.c +++ b/wordblox_player.c @@ -4,7 +4,7 @@ #include "wordblox_resource.c" #include "wordblox.h" -GtkWidget *window; +GtkWidget *main_window; GtkListStore *across_store; GtkListStore *down_store; @@ -97,6 +97,18 @@ gboolean on_across_list_selection_changed (GtkTreeSelection *sel, gboolean on_puzzle_area_button_press_event (GtkWidget *widget, GdkEventButton *event, gpointer data) { + /* if it is solution mode, then don't do anything but reset it to + non solution mode */ + if (app_data.solution_revealed == true) + { + app_data.solution_revealed = false; + gtk_widget_queue_draw_area (widget, 0, 0, + app_data.puzzle.grid_size*GRID_PIXELS+10, + app_data.puzzle.grid_size*GRID_PIXELS+10); + return FALSE; + } + + /* Depending on the type of button handle the movement */ if (event->type == GDK_BUTTON_PRESS && event->button == 1) { int col = (event->x - 5) / GRID_PIXELS; @@ -145,6 +157,17 @@ gboolean on_puzzle_area_key_press_event (GtkWidget *widget, /* respond to key events only if the puzzle is loaded */ if (app_data.is_loaded == true) { + /* if the solution is revealed, don't respond to key events except + to return to the non-solution mode */ + if (app_data.solution_revealed == true) + { + app_data.solution_revealed = false; + gtk_widget_queue_draw_area (widget, 0, 0, + app_data.puzzle.grid_size*GRID_PIXELS+10, + app_data.puzzle.grid_size*GRID_PIXELS+10); + return FALSE; + } + switch (event->keyval) { case GDK_KEY_Down : move_current_row (&app_data, DIR_FORWARD); @@ -320,12 +343,14 @@ gboolean on_puzzle_area_draw (GtkWidget *widget, cairo_t *cr, gpointer data) /* if a puzzle is loaded */ if (app_data.is_loaded == true) { - GdkRGBA colorfore, colorback, colorblue, colorbacksel1, colorbacksel2; + GdkRGBA colorfore, colorback, colorblue, colorbacksel1, + colorbacksel2, colorsolution; gdk_rgba_parse (&colorfore, "#000000"); gdk_rgba_parse (&colorback, "#ffffff"); gdk_rgba_parse (&colorblue, "#0000dd"); gdk_rgba_parse (&colorbacksel1, "#ffffaa"); gdk_rgba_parse (&colorbacksel2, "#aaffff"); + gdk_rgba_parse (&colorsolution, "#990099"); cairo_set_line_width (cr, 3); /* set the size of the drawing area */ @@ -346,11 +371,13 @@ gboolean on_puzzle_area_draw (GtkWidget *widget, cairo_t *cr, gpointer data) { app_data.cur_row = i; app_data.cur_col = j; + app_data.current_movement = ACROSS; } else if (app_data.puzzle.start_down_word[i][j] == 1) { app_data.cur_row = i; app_data.cur_col = j; + app_data.current_movement = DOWN; } } @@ -365,9 +392,11 @@ gboolean on_puzzle_area_draw (GtkWidget *widget, cairo_t *cr, gpointer data) if (app_data.puzzle.chars[i][j] != '#') gdk_cairo_set_source_rgba (cr, &colorback); - /* if it is a current selection then set the background - to yellow */ - if (app_data.cur_row == i && app_data.cur_col == j) + /* if it is a current selection and solution reveal mode is not + set then then set the background depending on whether across + or down movement mode is current */ + if (app_data.solution_revealed == false && + app_data.cur_row == i && app_data.cur_col == j) { if (app_data.current_movement == ACROSS) gdk_cairo_set_source_rgba (cr, &colorbacksel1); @@ -400,8 +429,13 @@ gboolean on_puzzle_area_draw (GtkWidget *widget, cairo_t *cr, gpointer data) cairo_show_text (cr, (const char*)cnum); } - /* draw the answer if it is there */ - gdk_cairo_set_source_rgba (cr, &colorfore); + /* if solution is not revealed set the color to normal + or set it to solution color */ + if (app_data.solution_revealed == false) + gdk_cairo_set_source_rgba (cr, &colorfore); + else + gdk_cairo_set_source_rgba (cr, &colorsolution); + cairo_select_font_face (cr, "sans serif", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_BOLD); @@ -410,7 +444,15 @@ gboolean on_puzzle_area_draw (GtkWidget *widget, cairo_t *cr, gpointer data) cairo_move_to (cr, j*GRID_PIXELS+GRID_PIXELS/2, i*GRID_PIXELS+GRID_PIXELS-10); char ctxt[3]; - sprintf (ctxt, "%c", app_data.char_ans[i][j]); + /* if it is solution mode reveal the answer or else the + user input */ + if (app_data.solution_revealed == false) + sprintf (ctxt, "%c", app_data.char_ans[i][j]); + else + if (app_data.puzzle.chars[i][j] != '#') + sprintf (ctxt, "%c", app_data.puzzle.chars[i][j]); + else + sprintf (ctxt, "%c", ' '); cairo_show_text (cr, (const char*) ctxt); } @@ -422,9 +464,74 @@ gboolean on_puzzle_area_draw (GtkWidget *widget, cairo_t *cr, gpointer data) } /* slot for reveal solution menu */ -void on_menu_reveal_solution_activate (GtkMenuItem *item, gpointer *data) +void on_menu_reveal_solution_activate (GtkMenuItem *item, GtkDrawingArea *area) { - /* TODO */ + /* if puzzle is password protected ask for the password */ + if (strlen (app_data.puzzle.hashed_password) > 0) + { + GtkBuilder *builder; + builder = gtk_builder_new (); + + guint ret = gtk_builder_add_from_resource + (builder, + "/org/harishankar/wordblox/wordblox_player.glade", + NULL); + if (ret == 0) + { + fprintf (stderr, ERROR_WINDOW); + g_object_unref (builder); + return; + } + + GtkWidget *password_dialog = GTK_WIDGET (gtk_builder_get_object + (builder, "password_dialog")); + GtkWidget *password_text = GTK_WIDGET (gtk_builder_get_object + (builder, "password_text")); + + if (password_dialog == NULL) + { + fprintf (stderr, ERROR_WINDOW); + g_object_unref (builder); + return; + } + gtk_window_set_transient_for (GTK_WINDOW(password_dialog), + GTK_WINDOW(main_window)); + gtk_dialog_set_default_response (GTK_DIALOG(password_dialog), + GTK_RESPONSE_ACCEPT); + gint res = gtk_dialog_run (GTK_DIALOG (password_dialog)); + if (res == GTK_RESPONSE_ACCEPT) + { + const gchar *user_pwd = gtk_entry_get_text + (GTK_ENTRY(password_text)); + /* if password is correct */ + if (verify_password (&app_data.puzzle, user_pwd) == true) + app_data.solution_revealed = true; + /* password is incorrect */ + else + { + app_data.solution_revealed = false; + GtkWidget *errordlg ; + errordlg = gtk_message_dialog_new (GTK_WINDOW(main_window), + GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_MESSAGE_ERROR, + GTK_BUTTONS_CLOSE, + WRONG_PASSWORD); + gtk_dialog_run (GTK_DIALOG(errordlg)); + gtk_widget_destroy (errordlg); + } + } + + gtk_widget_destroy (password_text); + gtk_widget_destroy (password_dialog); + g_object_unref (builder); + } + else + app_data.solution_revealed = true; + + gtk_widget_queue_draw_area (GTK_WIDGET(area), 0, 0, + app_data.puzzle.grid_size*GRID_PIXELS+10, + app_data.puzzle.grid_size*GRID_PIXELS+10); + } /* slot for save grid state menu */ @@ -445,7 +552,8 @@ void on_menu_open_activate (GtkMenuItem *item, GtkDrawingArea* area) GtkWidget *dialog; GtkFileChooserAction action = GTK_FILE_CHOOSER_ACTION_OPEN; gint res; - dialog = gtk_file_chooser_dialog_new (OPEN_FILE, GTK_WINDOW(window), action, + dialog = gtk_file_chooser_dialog_new (OPEN_FILE, GTK_WINDOW(main_window), + action, "_Cancel", GTK_RESPONSE_CANCEL, "_Open", @@ -463,7 +571,7 @@ void on_menu_open_activate (GtkMenuItem *item, GtkDrawingArea* area) if (temp.is_loaded == false) { GtkWidget *errordlg ; - errordlg = gtk_message_dialog_new (GTK_WINDOW(window), + errordlg = gtk_message_dialog_new (GTK_WINDOW(main_window), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, @@ -490,7 +598,7 @@ void on_menu_open_activate (GtkMenuItem *item, GtkDrawingArea* area) void on_menu_about_activate (GtkMenuItem *item, gpointer data) { const char *AUTHOR[] = {"V.Harishankar", NULL}; - gtk_show_about_dialog (GTK_WINDOW(window), "authors",AUTHOR, + gtk_show_about_dialog (GTK_WINDOW(main_window), "authors",AUTHOR, "program-name", PROGRAM_NAME, "copyright", COPYRIGHT, "comments", COMMENTS, @@ -525,13 +633,15 @@ int main (int argc, char *argv []) } else { - window = GTK_WIDGET (gtk_builder_get_object (builder, "main_window") ); + main_window = GTK_WIDGET (gtk_builder_get_object (builder, + "main_window")); + across_store = GTK_LIST_STORE (gtk_builder_get_object (builder, "store_across_clues")); down_store = GTK_LIST_STORE (gtk_builder_get_object (builder, "store_down_clues")); - if (window != NULL) + if (main_window != NULL) { gtk_window_set_default_icon (icon); @@ -545,7 +655,7 @@ int main (int argc, char *argv []) gtk_builder_connect_signals (builder, NULL); g_object_unref (builder); - gtk_widget_show (window); + gtk_widget_show (main_window); gtk_main (); return 0; }