Blob Blame History Raw
From 58b2f3df81c46f8596a0a81bd2f8071948ec9238 Mon Sep 17 00:00:00 2001
From: Jakub Filak <jfilak@redhat.com>
Date: Wed, 8 Aug 2012 16:59:33 +0200
Subject: [PATCH 06/10] trac#660: report-gtk: introduce generic ask_yes_no()
 function for options

* the generic ask_yes_no() function shows a standard 'yes/no' dialog
  with a checkbox
* if user checks the checkbox the ask_yes_no() function immediately
  returns 'yes' in the future calls

Signed-off-by: Jakub Filak <jfilak@redhat.com>
---
 src/gui-wizard-gtk/wizard.c | 52 ++++++++++++++++++++++++++++-----------------
 1 file changed, 33 insertions(+), 19 deletions(-)

diff --git a/src/gui-wizard-gtk/wizard.c b/src/gui-wizard-gtk/wizard.c
index ce7b742..861d922 100644
--- a/src/gui-wizard-gtk/wizard.c
+++ b/src/gui-wizard-gtk/wizard.c
@@ -310,46 +310,60 @@ static void update_window_title(void)
     free(title);
 }
 
-static void on_toggle_ask_steal_cb(GtkToggleButton *tb, gpointer user_data)
+static void on_toggle_ask_yes_no_save_result_cb(GtkToggleButton *tb, gpointer user_data)
 {
-    set_user_setting("ask_steal_dir", gtk_toggle_button_get_active(tb) ? "no" : "yes");
+    set_user_setting(user_data, gtk_toggle_button_get_active(tb) ? "no" : "yes");
 }
 
-static bool ask_continue_before_steal(const char *base_dir, const char *dump_dir)
+/*
+ * Function shows a dialog with 'Yes/No' buttons and a check box allowing to
+ * remeber the answer. The answer is stored in configuration file under
+ * 'option_name' key.
+ */
+static bool ask_yes_no_save_result(const char *message, const char *option_name)
 {
-    const char *ask_steal_dir = get_user_setting("ask_steal_dir");
+    const char *ask_result = get_user_setting(option_name);
 
-    if (ask_steal_dir && string_to_bool(ask_steal_dir) == false)
+    if (ask_result && string_to_bool(ask_result) == false)
         return true;
 
     GtkWidget *dialog = gtk_message_dialog_new(GTK_WINDOW(g_wnd_assistant),
-            GTK_DIALOG_DESTROY_WITH_PARENT,
-            GTK_MESSAGE_QUESTION,
-            GTK_BUTTONS_OK_CANCEL,
-            _("Need writable directory, but '%s' is not writable."
-            " Move it to '%s' and operate on the moved data?"),
-            dump_dir, base_dir
-            );
+                                               GTK_DIALOG_DESTROY_WITH_PARENT,
+                                               GTK_MESSAGE_QUESTION,
+                                               GTK_BUTTONS_YES_NO,
+                                               "%s", message);
 
     gint response = GTK_RESPONSE_CANCEL;
-    g_signal_connect(G_OBJECT(dialog), "response", G_CALLBACK(save_dialog_response), &response);
+    g_signal_connect(G_OBJECT(dialog), "response",
+                     G_CALLBACK(save_dialog_response), &response);
 
-    GtkWidget *ask_steal_cb = gtk_check_button_new_with_label(_("Don't ask me again"));
+    GtkWidget *ask_yes_no_cb = gtk_check_button_new_with_label(_("Don't ask me again"));
     gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))),
-            ask_steal_cb, TRUE, TRUE, 0);
-    g_signal_connect(ask_steal_cb, "toggled", G_CALLBACK(on_toggle_ask_steal_cb), NULL);
+                       ask_yes_no_cb, TRUE, TRUE, 0);
+    g_signal_connect(ask_yes_no_cb, "toggled",
+                     G_CALLBACK(on_toggle_ask_yes_no_save_result_cb), (gpointer)option_name);
 
     /* check it by default if it's shown for the first time */
-    if (!ask_steal_dir)
-        gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(ask_steal_cb), TRUE);
+    if (!ask_result)
+        gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(ask_yes_no_cb), TRUE);
 
-    gtk_widget_show(ask_steal_cb);
+    gtk_widget_show(ask_yes_no_cb);
     gtk_dialog_run(GTK_DIALOG(dialog));
     gtk_widget_destroy(dialog);
 
     return response == GTK_RESPONSE_OK;
 }
 
+static bool ask_continue_before_steal(const char *base_dir, const char *dump_dir)
+{
+    char *msg = xasprintf(_("Need writable directory, but '%s' is not writable."
+                            " Move it to '%s' and operate on the moved data?"),
+                            dump_dir, base_dir);
+    const bool response = ask_yes_no_save_result(msg, "ask_steal_dir");
+    free(msg);
+    return response;
+}
+
 struct dump_dir *wizard_open_directory_for_writing(const char *dump_dir_name)
 {
     struct dump_dir *dd = open_directory_for_writing(dump_dir_name,
-- 
1.7.11.2