Jakub Filak ef61d27
From 8db880a2c6add7137aac9f8562ae73aef3e1e436 Mon Sep 17 00:00:00 2001
Jakub Filak ef61d27
From: Jakub Filak <jfilak@redhat.com>
Jakub Filak ef61d27
Date: Wed, 30 Jul 2014 13:53:02 +0200
Jakub Filak ef61d27
Subject: [PATCH 20/20] gui: add "Repeat" button
Jakub Filak ef61d27
Jakub Filak ef61d27
If an event run fails, the button allows users to modify the
Jakub Filak ef61d27
configuration and re-run the event.
Jakub Filak ef61d27
Jakub Filak ef61d27
v2:
Jakub Filak ef61d27
- add a help text explaining what to do before clicking "Repeat" button
Jakub Filak ef61d27
Jakub Filak ef61d27
Related to rhbz#1069917
Jakub Filak ef61d27
Jakub Filak ef61d27
Signed-off-by: Jakub Filak <jfilak@redhat.com>
Jakub Filak ef61d27
---
Jakub Filak ef61d27
 src/gui-wizard-gtk/wizard.c | 83 ++++++++++++++++++++++++++++++++++-----------
Jakub Filak ef61d27
 1 file changed, 63 insertions(+), 20 deletions(-)
Jakub Filak ef61d27
Jakub Filak ef61d27
diff --git a/src/gui-wizard-gtk/wizard.c b/src/gui-wizard-gtk/wizard.c
Jakub Filak ef61d27
index e803394..e4718bf 100644
Jakub Filak ef61d27
--- a/src/gui-wizard-gtk/wizard.c
Jakub Filak ef61d27
+++ b/src/gui-wizard-gtk/wizard.c
Jakub Filak ef61d27
@@ -68,6 +68,7 @@ static GtkWidget *g_btn_stop;
Jakub Filak ef61d27
 static GtkWidget *g_btn_close;
Jakub Filak ef61d27
 static GtkWidget *g_btn_next;
Jakub Filak ef61d27
 static GtkWidget *g_btn_onfail;
Jakub Filak ef61d27
+static GtkWidget *g_btn_repeat;
Jakub Filak ef61d27
 
Jakub Filak ef61d27
 static GtkBox *g_box_events;
Jakub Filak ef61d27
 static GtkBox *g_box_workflows;
Jakub Filak ef61d27
@@ -1573,24 +1574,31 @@ static void show_next_step_button()
Jakub Filak ef61d27
     gtk_widget_show(g_btn_next);
Jakub Filak ef61d27
 }
Jakub Filak ef61d27
 
Jakub Filak ef61d27
-static void terminate_event_chain()
Jakub Filak ef61d27
+enum {
Jakub Filak ef61d27
+ TERMINATE_NOFLAGS    = 0,
Jakub Filak ef61d27
+ TERMINATE_WITH_RERUN = 1 << 0,
Jakub Filak ef61d27
+};
Jakub Filak ef61d27
+
Jakub Filak ef61d27
+static void terminate_event_chain(int flags)
Jakub Filak ef61d27
 {
Jakub Filak ef61d27
     if (g_expert_mode)
Jakub Filak ef61d27
         return;
Jakub Filak ef61d27
 
Jakub Filak ef61d27
+    hide_next_step_button();
Jakub Filak ef61d27
+    if ((flags & TERMINATE_WITH_RERUN))
Jakub Filak ef61d27
+        return;
Jakub Filak ef61d27
+
Jakub Filak ef61d27
     free(g_event_selected);
Jakub Filak ef61d27
     g_event_selected = NULL;
Jakub Filak ef61d27
 
Jakub Filak ef61d27
     g_list_free_full(g_auto_event_list, free);
Jakub Filak ef61d27
     g_auto_event_list = NULL;
Jakub Filak ef61d27
-
Jakub Filak ef61d27
-    hide_next_step_button();
Jakub Filak ef61d27
 }
Jakub Filak ef61d27
 
Jakub Filak ef61d27
-static void cancel_processing(GtkLabel *status_label, const char *message)
Jakub Filak ef61d27
+static void cancel_processing(GtkLabel *status_label, const char *message, int terminate_flags)
Jakub Filak ef61d27
 {
Jakub Filak ef61d27
     gtk_label_set_text(status_label, message ? message : _("Processing was canceled"));
Jakub Filak ef61d27
-    terminate_event_chain();
Jakub Filak ef61d27
+    terminate_event_chain(terminate_flags);
Jakub Filak ef61d27
 }
Jakub Filak ef61d27
 
Jakub Filak ef61d27
 static void update_command_run_log(const char* message, struct analyze_event_data *evd)
Jakub Filak ef61d27
@@ -1755,6 +1763,25 @@ static void on_btn_failed_cb(GtkButton *button)
Jakub Filak ef61d27
     gtk_widget_hide(GTK_WIDGET(button));
Jakub Filak ef61d27
 }
Jakub Filak ef61d27
 
Jakub Filak ef61d27
+static gint select_next_page_no(gint current_page_no, gpointer data);
Jakub Filak ef61d27
+static void on_page_prepare(GtkNotebook *assistant, GtkWidget *page, gpointer user_data);
Jakub Filak ef61d27
+
Jakub Filak ef61d27
+static void on_btn_repeat_cb(GtkButton *button)
Jakub Filak ef61d27
+{
Jakub Filak ef61d27
+    g_auto_event_list = g_list_prepend(g_auto_event_list, g_event_selected);
Jakub Filak ef61d27
+    g_event_selected = NULL;
Jakub Filak ef61d27
+
Jakub Filak ef61d27
+    show_next_step_button();
Jakub Filak ef61d27
+    clear_warnings();
Jakub Filak ef61d27
+
Jakub Filak ef61d27
+    const gint current_page_no = gtk_notebook_get_current_page(g_assistant);
Jakub Filak ef61d27
+    const int next_page_no = select_next_page_no(pages[PAGENO_SUMMARY].page_no, NULL);
Jakub Filak ef61d27
+    if (current_page_no == next_page_no)
Jakub Filak ef61d27
+        on_page_prepare(g_assistant, gtk_notebook_get_nth_page(g_assistant, next_page_no), NULL);
Jakub Filak ef61d27
+    else
Jakub Filak ef61d27
+        gtk_notebook_set_current_page(g_assistant, next_page_no);
Jakub Filak ef61d27
+}
Jakub Filak ef61d27
+
Jakub Filak ef61d27
 static void on_failed_event(const char *event_name)
Jakub Filak ef61d27
 {
Jakub Filak ef61d27
     /* Don't show the 'on failure' button if the processed event
Jakub Filak ef61d27
@@ -1764,14 +1791,25 @@ static void on_failed_event(const char *event_name)
Jakub Filak ef61d27
         return;
Jakub Filak ef61d27
 
Jakub Filak ef61d27
    add_warning(
Jakub Filak ef61d27
-_("Processing of the problem failed. This can have many reasons but there are two most common:\n"\
Jakub Filak ef61d27
+_("Processing of the problem failed. This can have many reasons but there are three most common:\n"\
Jakub Filak ef61d27
 "\t▫ network connection problems\n"\
Jakub Filak ef61d27
-"\t▫ corrupted problem data\n"));
Jakub Filak ef61d27
+"\t▫ corrupted problem data\n"\
Jakub Filak ef61d27
+"\t▫ invalid configuration"
Jakub Filak ef61d27
+));
Jakub Filak ef61d27
+
Jakub Filak ef61d27
+    if (!g_expert_mode)
Jakub Filak ef61d27
+    {
Jakub Filak ef61d27
+        add_warning(
Jakub Filak ef61d27
+_("If you want to update the configuration and try to report again, please open Preferences item\n"
Jakub Filak ef61d27
+"in the application menu and after applying the configuration changes click Repeat button."));
Jakub Filak ef61d27
+        gtk_widget_show(g_btn_repeat);
Jakub Filak ef61d27
+    }
Jakub Filak ef61d27
 
Jakub Filak ef61d27
     add_warning(
Jakub Filak ef61d27
-_("If you want to help us, please click on the upload button and provide all problem data for a deep analysis.\n"\
Jakub Filak ef61d27
-"Before you do that, please consider the security risks. Problem data may contain sensitive information like passwords.\n"\
Jakub Filak ef61d27
-"The uploaded data are stored in a protected storage and only a limited number of persons can read them."));
Jakub Filak ef61d27
+_("If you are sure that this problem is not caused by network problems neither by invalid configuration\n"
Jakub Filak ef61d27
+"and want to help us, please click on the upload button and provide all problem data for a deep analysis.\n"\
Jakub Filak ef61d27
+"Before you do that, please consider the security risks. Problem data may contain sensitive information like\n"\
Jakub Filak ef61d27
+"passwords. The uploaded data are stored in a protected storage and only a limited number of persons can read them."));
Jakub Filak ef61d27
 
Jakub Filak ef61d27
     show_warnings();
Jakub Filak ef61d27
 
Jakub Filak ef61d27
@@ -1798,7 +1836,7 @@ static gboolean consume_cmd_output(GIOChannel *source, GIOCondition condition, g
Jakub Filak ef61d27
         retval = 0;
Jakub Filak ef61d27
         run_state->process_status = 0;
Jakub Filak ef61d27
         stop_requested = true;
Jakub Filak ef61d27
-        terminate_event_chain();
Jakub Filak ef61d27
+        terminate_event_chain(TERMINATE_NOFLAGS);
Jakub Filak ef61d27
     }
Jakub Filak ef61d27
 
Jakub Filak ef61d27
     unexport_event_config(evd->env_list);
Jakub Filak ef61d27
@@ -1887,17 +1925,17 @@ static gboolean consume_cmd_output(GIOChannel *source, GIOCondition condition, g
Jakub Filak ef61d27
             gtk_widget_show(GTK_WIDGET(g_img_process_fail));
Jakub Filak ef61d27
             /* 256 means NOT_REPORTABLE */
Jakub Filak ef61d27
             if (retval == 256)
Jakub Filak ef61d27
-                cancel_processing(g_lbl_event_log, _("Processing was interrupted because the problem is not reportable."));
Jakub Filak ef61d27
+                cancel_processing(g_lbl_event_log, _("Processing was interrupted because the problem is not reportable."), TERMINATE_NOFLAGS);
Jakub Filak ef61d27
             else
Jakub Filak ef61d27
             {
Jakub Filak ef61d27
                 /* We use SIGTERM to stop event processing on user's request.
Jakub Filak ef61d27
                  * So SIGTERM is not a failure.
Jakub Filak ef61d27
                  */
Jakub Filak ef61d27
                 if (retval == EXIT_CANCEL_BY_USER || WTERMSIG(run_state->process_status) == SIGTERM)
Jakub Filak ef61d27
-                    cancel_processing(g_lbl_event_log, /* default message */ NULL);
Jakub Filak ef61d27
+                    cancel_processing(g_lbl_event_log, /* default message */ NULL, TERMINATE_NOFLAGS);
Jakub Filak ef61d27
                 else
Jakub Filak ef61d27
                 {
Jakub Filak ef61d27
-                    cancel_processing(g_lbl_event_log, _("Processing failed."));
Jakub Filak ef61d27
+                    cancel_processing(g_lbl_event_log, _("Processing failed."), TERMINATE_WITH_RERUN);
Jakub Filak ef61d27
                     on_failed_event(evd->event_name);
Jakub Filak ef61d27
                 }
Jakub Filak ef61d27
             }
Jakub Filak ef61d27
@@ -2036,7 +2074,7 @@ static void start_event_run(const char *event_name)
Jakub Filak ef61d27
         char *msg = xasprintf(_("No processing for event '%s' is defined"), event_name);
Jakub Filak ef61d27
         append_to_textview(g_tv_event_log, msg);
Jakub Filak ef61d27
         free(msg);
Jakub Filak ef61d27
-        cancel_processing(g_lbl_event_log, _("Processing failed."));
Jakub Filak ef61d27
+        cancel_processing(g_lbl_event_log, _("Processing failed."), TERMINATE_NOFLAGS);
Jakub Filak ef61d27
         return;
Jakub Filak ef61d27
     }
Jakub Filak ef61d27
 
Jakub Filak ef61d27
@@ -2047,7 +2085,7 @@ static void start_event_run(const char *event_name)
Jakub Filak ef61d27
         free_run_event_state(state);
Jakub Filak ef61d27
         if (!g_expert_mode)
Jakub Filak ef61d27
         {
Jakub Filak ef61d27
-            cancel_processing(g_lbl_event_log, _("Processing interrupted: can't continue without writable directory."));
Jakub Filak ef61d27
+            cancel_processing(g_lbl_event_log, _("Processing interrupted: can't continue without writable directory."), TERMINATE_NOFLAGS);
Jakub Filak ef61d27
         }
Jakub Filak ef61d27
         return; /* user refused to steal, or write error, etc... */
Jakub Filak ef61d27
     }
Jakub Filak ef61d27
@@ -2534,8 +2572,6 @@ static gboolean highlight_forbidden(void)
Jakub Filak ef61d27
     return result;
Jakub Filak ef61d27
 }
Jakub Filak ef61d27
 
Jakub Filak ef61d27
-static gint select_next_page_no(gint current_page_no, gpointer data);
Jakub Filak ef61d27
-
Jakub Filak ef61d27
 static char *get_next_processed_event(GList **events_list)
Jakub Filak ef61d27
 {
Jakub Filak ef61d27
     if (!events_list || !*events_list)
Jakub Filak ef61d27
@@ -2647,6 +2683,8 @@ static void on_page_prepare(GtkNotebook *assistant, GtkWidget *page, gpointer us
Jakub Filak ef61d27
     }
Jakub Filak ef61d27
 
Jakub Filak ef61d27
     gtk_widget_hide(g_btn_onfail);
Jakub Filak ef61d27
+    if (!g_expert_mode)
Jakub Filak ef61d27
+        gtk_widget_hide(g_btn_repeat);
Jakub Filak ef61d27
     /* Save text fields if changed */
Jakub Filak ef61d27
     /* Must be called before any GUI operation because the following two
Jakub Filak ef61d27
      * functions causes recreating of the text items tabs, thus all updates to
Jakub Filak ef61d27
@@ -2867,7 +2905,7 @@ static gint select_next_page_no(gint current_page_no, gpointer data)
Jakub Filak ef61d27
             {
Jakub Filak ef61d27
                 free(event);
Jakub Filak ef61d27
 
Jakub Filak ef61d27
-                cancel_processing(g_lbl_event_log, /* default message */ NULL);
Jakub Filak ef61d27
+                cancel_processing(g_lbl_event_log, /* default message */ NULL, TERMINATE_NOFLAGS);
Jakub Filak ef61d27
                 current_page_no = pages[PAGENO_EVENT_PROGRESS].page_no - 1;
Jakub Filak ef61d27
                 goto again;
Jakub Filak ef61d27
             }
Jakub Filak ef61d27
@@ -2880,7 +2918,7 @@ static gint select_next_page_no(gint current_page_no, gpointer data)
Jakub Filak ef61d27
                                 "(it is likely a known problem). %s"),
Jakub Filak ef61d27
                                 problem_data_get_content_or_NULL(g_cd, FILENAME_NOT_REPORTABLE)
Jakub Filak ef61d27
                 );
Jakub Filak ef61d27
-                cancel_processing(g_lbl_event_log, msg);
Jakub Filak ef61d27
+                cancel_processing(g_lbl_event_log, msg, TERMINATE_NOFLAGS);
Jakub Filak ef61d27
                 free(msg);
Jakub Filak ef61d27
                 current_page_no = pages[PAGENO_EVENT_PROGRESS].page_no - 1;
Jakub Filak ef61d27
                 goto again;
Jakub Filak ef61d27
@@ -3453,6 +3491,8 @@ void create_assistant(GtkApplication *app, bool expert_mode)
Jakub Filak ef61d27
     g_btn_onfail = gtk_button_new_with_label(_("Upload for analysis"));
Jakub Filak ef61d27
     gtk_button_set_image(GTK_BUTTON(g_btn_onfail), gtk_image_new_from_icon_name("go-up", GTK_ICON_SIZE_BUTTON));
Jakub Filak ef61d27
     gtk_widget_set_no_show_all(g_btn_onfail, true); /* else gtk_widget_hide won't work */
Jakub Filak ef61d27
+    g_btn_repeat = gtk_button_new_with_label(_("Repeat"));
Jakub Filak ef61d27
+    gtk_widget_set_no_show_all(g_btn_repeat, true); /* else gtk_widget_hide won't work */
Jakub Filak ef61d27
     g_btn_next = gtk_button_new_with_mnemonic(_("_Forward"));
Jakub Filak ef61d27
     gtk_button_set_image(GTK_BUTTON(g_btn_next), gtk_image_new_from_icon_name("go-next", GTK_ICON_SIZE_BUTTON));
Jakub Filak ef61d27
     gtk_widget_set_no_show_all(g_btn_next, true); /* else gtk_widget_hide won't work */
Jakub Filak ef61d27
@@ -3461,6 +3501,7 @@ void create_assistant(GtkApplication *app, bool expert_mode)
Jakub Filak ef61d27
     gtk_box_pack_start(g_box_buttons, g_btn_close, false, false, 5);
Jakub Filak ef61d27
     gtk_box_pack_start(g_box_buttons, g_btn_stop, false, false, 5);
Jakub Filak ef61d27
     gtk_box_pack_start(g_box_buttons, g_btn_onfail, false, false, 5);
Jakub Filak ef61d27
+    gtk_box_pack_start(g_box_buttons, g_btn_repeat, false, false, 5);
Jakub Filak ef61d27
     /* Btns above are to the left, the rest are to the right: */
Jakub Filak ef61d27
 #if ((GTK_MAJOR_VERSION == 3 && GTK_MINOR_VERSION < 13) || (GTK_MAJOR_VERSION == 3 && GTK_MINOR_VERSION == 13 && GTK_MICRO_VERSION < 5))
Jakub Filak ef61d27
     GtkWidget *w = gtk_alignment_new(0.0, 0.0, 1.0, 1.0);
Jakub Filak ef61d27
@@ -3514,6 +3555,7 @@ void create_assistant(GtkApplication *app, bool expert_mode)
Jakub Filak ef61d27
     gtk_widget_show_all(GTK_WIDGET(g_box_buttons));
Jakub Filak ef61d27
     gtk_widget_hide(g_btn_stop);
Jakub Filak ef61d27
     gtk_widget_hide(g_btn_onfail);
Jakub Filak ef61d27
+    gtk_widget_hide(g_btn_repeat);
Jakub Filak ef61d27
     gtk_widget_show(g_btn_next);
Jakub Filak ef61d27
 
Jakub Filak ef61d27
     g_wnd_assistant = GTK_WINDOW(gtk_application_window_new(app));
Jakub Filak ef61d27
@@ -3534,6 +3576,7 @@ void create_assistant(GtkApplication *app, bool expert_mode)
Jakub Filak ef61d27
     g_signal_connect(g_btn_close, "clicked", G_CALLBACK(assistant_quit_cb), g_wnd_assistant);
Jakub Filak ef61d27
     g_signal_connect(g_btn_stop, "clicked", G_CALLBACK(on_btn_cancel_event), NULL);
Jakub Filak ef61d27
     g_signal_connect(g_btn_onfail, "clicked", G_CALLBACK(on_btn_failed_cb), NULL);
Jakub Filak ef61d27
+    g_signal_connect(g_btn_repeat, "clicked", G_CALLBACK(on_btn_repeat_cb), NULL);
Jakub Filak ef61d27
     g_signal_connect(g_btn_next, "clicked", G_CALLBACK(on_next_btn_cb), NULL);
Jakub Filak ef61d27
 
Jakub Filak ef61d27
     g_signal_connect(g_wnd_assistant, "destroy", G_CALLBACK(assistant_quit_cb), g_wnd_assistant);
Jakub Filak ef61d27
-- 
Jakub Filak ef61d27
2.0.4
Jakub Filak ef61d27