diff options
-rw-r--r-- | src/gui-wizard-gtk/main.c | 7 | ||||
-rw-r--r-- | src/gui-wizard-gtk/wizard.c | 85 | ||||
-rw-r--r-- | src/gui-wizard-gtk/wizard.glade | 40 | ||||
-rw-r--r-- | src/gui-wizard-gtk/wizard.h | 1 |
4 files changed, 90 insertions, 43 deletions
diff --git a/src/gui-wizard-gtk/main.c b/src/gui-wizard-gtk/main.c index aabd84d6..707cf563 100644 --- a/src/gui-wizard-gtk/main.c +++ b/src/gui-wizard-gtk/main.c @@ -23,9 +23,12 @@ static void analyze_rb_was_toggled(GtkToggleButton *button, gpointer user_data) } } -static void remove_child_widget(GtkWidget *widget, gpointer container) +void remove_child_widget(GtkWidget *widget, gpointer container) { - gtk_container_remove(container, widget); + /*destroy will safely remove it and free the memory if there are no refs + * left + */ + gtk_widget_destroy(widget); } static GtkWidget *add_event_buttons(GtkBox *box, char *event_name, GCallback func, bool radio) diff --git a/src/gui-wizard-gtk/wizard.c b/src/gui-wizard-gtk/wizard.c index fb97f4e4..321a9f0f 100644 --- a/src/gui-wizard-gtk/wizard.c +++ b/src/gui-wizard-gtk/wizard.c @@ -18,6 +18,10 @@ GtkLabel *g_lbl_cd_reason; GtkTextView *g_tv_backtrace; GtkTreeView *g_tv_details; GtkListStore *g_ls_details; +GtkBox *g_box_warnings_area; +GtkBox *g_box_warning_labels; +GtkToggleButton * g_tb_approve_bt; + static GtkBuilder *builder; @@ -384,8 +388,12 @@ static void add_pages() pages[i].page_widget = page; gtk_assistant_append_page(g_assistant, page); - //FIXME: shouldn't be complete until something is selected! - gtk_assistant_set_page_complete(g_assistant, page, true); + /* if we set all pages to complete the wizard thinks there is nothing + * to do and shows the button "Last" which allows user to skip all pages + * so we need to set them all as incomplete and complete them one by one + * on proper place - on_page_prepare() ? + */ + //gtk_assistant_set_page_complete(g_assistant, page, true); gtk_assistant_set_page_title(g_assistant, page, pages[i].title); gtk_assistant_set_page_type(g_assistant, page, pages[i].type); @@ -403,26 +411,91 @@ static void add_pages() g_tv_report_log = GTK_TEXT_VIEW(gtk_builder_get_object(builder, "tv_report_log")); g_tv_backtrace = GTK_TEXT_VIEW(gtk_builder_get_object(builder, "tv_backtrace")); g_tv_details = GTK_TREE_VIEW(gtk_builder_get_object(builder, "tv_details")); + g_box_warnings_area = GTK_BOX(gtk_builder_get_object(builder, "hb_warnings_area")); + /* hide the warnings by default */ + gtk_widget_hide(GTK_WIDGET(g_box_warnings_area)); + g_box_warning_labels = GTK_BOX(gtk_builder_get_object(builder, "hb_warning_labels")); + g_tb_approve_bt = GTK_TOGGLE_BUTTON(gtk_builder_get_object(builder, "cb_approve_bt")); + +} + +static void add_warning(const char *warning) +{ + char *label_str = xasprintf("• %s", warning); + GtkWidget *warning_lbl = gtk_label_new(label_str); + gtk_misc_set_alignment(GTK_MISC(warning_lbl), 0.0, 0.0); + gtk_label_set_justify(GTK_LABEL(warning_lbl), GTK_JUSTIFY_LEFT); + gtk_box_pack_start(g_box_warning_labels, warning_lbl, false, false, 0); + gtk_widget_show(GTK_WIDGET(warning_lbl)); + /* should be safe to free it, gtk calls strdup() to copy it */ + free(label_str); } -void on_bt_approve_toggle(GtkToggleButton *togglebutton, gpointer user_data) +static void check_backtrace_and_allow_send() +{ + gtk_widget_hide(GTK_WIDGET(g_box_warnings_area)); + /* erase all warnings */ + gtk_container_foreach(GTK_CONTAINER(g_box_warning_labels), &remove_child_widget, NULL); + /* FIXME: this should be bind to a reporter not to a compoment + * but we don't rate oopses, so for now we skip the "kernel" manually + */ + const char *component = get_crash_item_content_or_NULL(g_cd, FILENAME_COMPONENT); + if(strcmp(component, "kernel") != 0) + { + const char *rating = get_crash_item_content_or_NULL(g_cd, FILENAME_RATING); + switch(*rating) + { + case '4': //bt is ok - no warning here +VERB2 log("rating is 4\n"); + break; + case '3': //bt is usable, but not complete, so show a warning +VERB2 log("rating is 3 - adding warning"); + add_warning(_("The backtrace is incomplete, please make sure you provide the steps to reproduce.")); + break; + case '2': + case '1': + break; + } + } + + if(!gtk_toggle_button_get_active(g_tb_approve_bt)) + { +VERB2 log("bt is not approved"); + add_warning(_("You should check the backtrace for sensitive data.")); + add_warning(_("You must agree with sending the backtrace.")); + } + + //use a variable like bool show_warnings instead of this?? + if(g_list_length(gtk_container_get_children(GTK_CONTAINER(g_box_warning_labels))) > 0) + gtk_widget_show(GTK_WIDGET(g_box_warnings_area)); +} + +static void on_bt_approve_toggle(GtkToggleButton *togglebutton, gpointer user_data) { gtk_assistant_set_page_complete(g_assistant, pages[PAGENO_BACKTRACE_APPROVAL].page_widget, gtk_toggle_button_get_active(togglebutton)); + check_backtrace_and_allow_send(); } -//FIXME: hide/show warnings about rating and bt approval void on_page_prepare(GtkAssistant *assistant, GtkWidget *page, gpointer user_data) { + //FIXME: move some of this to the add_pages?? + if(pages[PAGENO_SUMMARY].page_widget == page) + { + /* the first page doesn't require any action to be completed, + * so lets make it complete and enable the "Forawrd" button + */ + gtk_assistant_set_page_complete(assistant, page, true); + } if (pages[PAGENO_BACKTRACE_APPROVAL].page_widget == page) { - GtkToggleButton* tb_approve_bt = GTK_TOGGLE_BUTTON(gtk_builder_get_object(builder, "cb_approve_bt")); - g_signal_connect(tb_approve_bt, "toggled", G_CALLBACK(on_bt_approve_toggle), NULL); + g_signal_connect(g_tb_approve_bt, "toggled", G_CALLBACK(on_bt_approve_toggle), NULL); gtk_assistant_set_page_complete(g_assistant, pages[PAGENO_BACKTRACE_APPROVAL].page_widget, false ); + check_backtrace_and_allow_send(); } } diff --git a/src/gui-wizard-gtk/wizard.glade b/src/gui-wizard-gtk/wizard.glade index bcf367f2..0a9eb9f7 100644 --- a/src/gui-wizard-gtk/wizard.glade +++ b/src/gui-wizard-gtk/wizard.glade @@ -324,7 +324,7 @@ </packing> </child> <child> - <object class="GtkHBox" id="hbox5"> + <object class="GtkHBox" id="hb_warnings_area"> <property name="visible">True</property> <property name="no_show_all">True</property> <child> @@ -340,47 +340,17 @@ </packing> </child> <child> - <object class="GtkVBox" id="vbox6"> + <object class="GtkVBox" id="hb_warning_labels"> <property name="visible">True</property> <property name="orientation">vertical</property> <child> - <object class="GtkLabel" id="lbl_warning_1"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="yalign">0</property> - <property name="label" translatable="yes">• The backtrace is incomplete, please make sure you provide the steps to reproduce.</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">0</property> - </packing> + <placeholder/> </child> <child> - <object class="GtkLabel" id="lbl_warning_2"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="yalign">0</property> - <property name="label" translatable="yes">• You should check the backtrace for sensitive data.</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">1</property> - </packing> + <placeholder/> </child> <child> - <object class="GtkLabel" id="lbl_warning_3"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="yalign">0</property> - <property name="label" translatable="yes">• You must agree with sending the backtrace.</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">2</property> - </packing> + <placeholder/> </child> </object> <packing> diff --git a/src/gui-wizard-gtk/wizard.h b/src/gui-wizard-gtk/wizard.h index 06916198..4bac5e05 100644 --- a/src/gui-wizard-gtk/wizard.h +++ b/src/gui-wizard-gtk/wizard.h @@ -33,3 +33,4 @@ extern char *g_analyze_events; extern char *g_report_events; extern crash_data_t *g_cd; void reload_dump_dir(void); +void remove_child_widget(GtkWidget *widget, gpointer container); |