summaryrefslogtreecommitdiffstats
path: root/src/gui-wizard-gtk
diff options
context:
space:
mode:
authorDenys Vlasenko <dvlasenk@redhat.com>2011-02-24 12:51:24 +0100
committerDenys Vlasenko <dvlasenk@redhat.com>2011-02-24 12:51:24 +0100
commite5cc6aec0dcdbb1ad1843bf9dfa7b853c80ed337 (patch)
tree6087e0f4cbc35cf61331734db4abd81e9af9d0e4 /src/gui-wizard-gtk
parentd8feb2968ee4c421b028e0e30c81f17e51b7c923 (diff)
downloadabrt-e5cc6aec0dcdbb1ad1843bf9dfa7b853c80ed337.tar.gz
abrt-e5cc6aec0dcdbb1ad1843bf9dfa7b853c80ed337.tar.xz
abrt-e5cc6aec0dcdbb1ad1843bf9dfa7b853c80ed337.zip
gui-wizard-gtk: reporter selector page should be complete only when at least one reporter is selected
Signed-off-by: Denys Vlasenko <dvlasenk@redhat.com>
Diffstat (limited to 'src/gui-wizard-gtk')
-rw-r--r--src/gui-wizard-gtk/main.c118
-rw-r--r--src/gui-wizard-gtk/wizard.c146
-rw-r--r--src/gui-wizard-gtk/wizard.h4
3 files changed, 150 insertions, 118 deletions
diff --git a/src/gui-wizard-gtk/main.c b/src/gui-wizard-gtk/main.c
index 707cf563..759390b6 100644
--- a/src/gui-wizard-gtk/main.c
+++ b/src/gui-wizard-gtk/main.c
@@ -13,82 +13,7 @@ char *g_report_events = NULL;
crash_data_t *g_cd;
-static void analyze_rb_was_toggled(GtkToggleButton *button, gpointer user_data)
-{
- const char *label = gtk_button_get_label(GTK_BUTTON(button));
- if (label)
- {
- free(g_analyze_label_selected);
- g_analyze_label_selected = xstrdup(label);
- }
-}
-
-void remove_child_widget(GtkWidget *widget, gpointer container)
-{
- /*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)
-{
-VERB2 log("removing all buttons from box %p", box);
- gtk_container_foreach(GTK_CONTAINER(box), &remove_child_widget, box);
-
- GtkWidget *first_button = NULL;
- while (event_name[0])
- {
- char *event_name_end = strchr(event_name, '\n');
- *event_name_end = '\0';
-
-VERB2 log("adding button '%s' to box %p", event_name, box);
- GtkWidget *button = radio
- ? gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(first_button), event_name)
- : gtk_check_button_new_with_label(event_name);
- if (!first_button)
- first_button = button;
-
- *event_name_end = '\n';
- event_name = event_name_end + 1;
-
- gtk_box_pack_start(box, button, /*expand*/ false, /*fill*/ false, /*padding*/ 0);
-
- if (func)
- g_signal_connect(G_OBJECT(button), "toggled", func, NULL);
- }
- return first_button;
-}
-
-static void append_item_to_details_ls(gpointer name, gpointer value, gpointer data)
-{
- crash_item *item = (crash_item*)value;
- GtkTreeIter iter;
-
- gtk_list_store_append(g_ls_details, &iter);
-
- //FIXME: use the value representation here
- /* If text and not multiline... */
- if ((item->flags & CD_FLAG_TXT) && !strchr(item->content, '\n'))
- {
- gtk_list_store_set(g_ls_details, &iter,
- DETAIL_COLUMN_NAME, (char *)name,
- DETAIL_COLUMN_VALUE, item->content,
- //DETAIL_COLUMN_PATH, xasprintf("%s%s", g_dump_dir_name, name),
- -1);
- }
- else
- {
- gtk_list_store_set(g_ls_details, &iter,
- DETAIL_COLUMN_NAME, (char *)name,
- DETAIL_COLUMN_VALUE, _("(click here to view/edit)"),
- //DETAIL_COLUMN_PATH, xasprintf("%s%s", g_dump_dir_name, name),
- -1);
- //WARNING: will leak xasprintf results above if uncommented
- }
-}
-
-void reload_dump_dir(void)
+void reload_crash_data_from_dump_dir(void)
{
free_crash_data(g_cd);
free(g_analyze_events);
@@ -100,44 +25,7 @@ void reload_dump_dir(void)
g_cd = create_crash_data_from_dump_dir(dd);
g_analyze_events = list_possible_events(dd, g_dump_dir_name, "analyze");
g_report_events = list_possible_events(dd, g_dump_dir_name, "report");
-VERB2 log("g_analyze_events:'%s'", g_analyze_events);
-VERB2 log("g_report_events:'%s'", g_report_events);
dd_close(dd);
-
- const char *reason = get_crash_item_content_or_NULL(g_cd, FILENAME_REASON);
- gtk_label_set_text(g_lbl_cd_reason, reason ? reason : _("(no description)"));
-
- gtk_list_store_clear(g_ls_details);
- g_hash_table_foreach(g_cd, append_item_to_details_ls, NULL);
-
- GtkTextBuffer *backtrace_buf = gtk_text_view_get_buffer(g_tv_backtrace);
- const char *bt = g_cd ? get_crash_item_content_or_NULL(g_cd, FILENAME_BACKTRACE) : NULL;
- gtk_text_buffer_set_text(backtrace_buf, bt ? bt : "", -1);
-
-//Doesn't work: shows empty page
-// if (!g_analyze_events[0])
-// {
-// /* No available analyze events, go to reporter selector page */
-// gtk_assistant_set_current_page(GTK_ASSISTANT(assistant), PAGENO_REPORTER_SELECTOR);
-// }
-
- GtkWidget *first_rb = add_event_buttons(g_box_analyzers, g_analyze_events, G_CALLBACK(analyze_rb_was_toggled), /*radio:*/ true);
- if (first_rb)
- {
- const char *label = gtk_button_get_label(GTK_BUTTON(first_rb));
- if (label)
- {
- free(g_analyze_label_selected);
- g_analyze_label_selected = xstrdup(label);
- }
- }
-
- add_event_buttons(g_box_reporters, g_report_events, /*callback:*/ NULL, /*radio:*/ false);
-
- /* We can't just do gtk_widget_show_all once in main:
- * We created new widgets (buttons). Need to make them visible.
- */
- gtk_widget_show_all(GTK_WIDGET(g_assistant));
}
int main(int argc, char **argv)
@@ -176,7 +64,9 @@ int main(int argc, char **argv)
create_assistant();
- reload_dump_dir();
+ reload_crash_data_from_dump_dir();
+
+ update_gui_state_from_crash_data();
/* Enter main loop */
gtk_main();
diff --git a/src/gui-wizard-gtk/wizard.c b/src/gui-wizard-gtk/wizard.c
index 484ed3bd..6598301a 100644
--- a/src/gui-wizard-gtk/wizard.c
+++ b/src/gui-wizard-gtk/wizard.c
@@ -95,15 +95,155 @@ static page_obj_t pages[] =
};
+static void remove_child_widget(GtkWidget *widget, gpointer container)
+{
+ /*destroy will safely remove it and free the memory if there are no refs
+ * left
+ */
+ gtk_widget_destroy(widget);
+}
+
+
void on_b_refresh_clicked(GtkButton *button)
{
g_print("Refresh clicked!\n");
}
+/* update_gui_state_from_crash_data */
+
+static void analyze_rb_was_toggled(GtkButton *button, gpointer user_data)
+{
+ const char *label = gtk_button_get_label(button);
+ if (label)
+ {
+ free(g_analyze_label_selected);
+ g_analyze_label_selected = xstrdup(label);
+ }
+}
+
+static void report_tb_was_toggled(GtkButton *button, gpointer user_data)
+{
+ GList *reporters = gtk_container_get_children(GTK_CONTAINER(g_box_reporters));
+ GList *li = reporters;
+ if (reporters)
+ {
+ for (; li; li = li->next)
+ if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(li->data)) == TRUE)
+ break;
+ }
+ g_list_free(reporters);
+ gtk_assistant_set_page_complete(g_assistant,
+ pages[PAGENO_REPORTER_SELECTOR].page_widget,
+ li != NULL /* true if at least one checkbox is active */
+ );
+}
+
+static GtkWidget *add_event_buttons(GtkBox *box, char *event_name, GCallback func, bool radio)
+{
+VERB2 log("removing all buttons from box %p", box);
+ gtk_container_foreach(GTK_CONTAINER(box), &remove_child_widget, box);
+
+ GtkWidget *first_button = NULL;
+ while (event_name[0])
+ {
+ char *event_name_end = strchr(event_name, '\n');
+ *event_name_end = '\0';
+
+VERB2 log("adding button '%s' to box %p", event_name, box);
+ GtkWidget *button = radio
+ ? gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(first_button), event_name)
+ : gtk_check_button_new_with_label(event_name);
+ if (!first_button)
+ first_button = button;
+
+ *event_name_end = '\n';
+ event_name = event_name_end + 1;
+
+ gtk_box_pack_start(box, button, /*expand*/ false, /*fill*/ false, /*padding*/ 0);
+
+ if (func)
+ g_signal_connect(G_OBJECT(button), "toggled", func, NULL);
+ }
+ return first_button;
+}
+
+static void append_item_to_details_ls(gpointer name, gpointer value, gpointer data)
+{
+ crash_item *item = (crash_item*)value;
+ GtkTreeIter iter;
+
+ gtk_list_store_append(g_ls_details, &iter);
+
+ //FIXME: use the value representation here
+ /* If text and not multiline... */
+ if ((item->flags & CD_FLAG_TXT) && !strchr(item->content, '\n'))
+ {
+ gtk_list_store_set(g_ls_details, &iter,
+ DETAIL_COLUMN_NAME, (char *)name,
+ DETAIL_COLUMN_VALUE, item->content,
+ //DETAIL_COLUMN_PATH, xasprintf("%s%s", g_dump_dir_name, name),
+ -1);
+ }
+ else
+ {
+ gtk_list_store_set(g_ls_details, &iter,
+ DETAIL_COLUMN_NAME, (char *)name,
+ DETAIL_COLUMN_VALUE, _("(click here to view/edit)"),
+ //DETAIL_COLUMN_PATH, xasprintf("%s%s", g_dump_dir_name, name),
+ -1);
+ //WARNING: will leak xasprintf results above if uncommented
+ }
+}
+
+void update_gui_state_from_crash_data(void)
+{
+ const char *reason = get_crash_item_content_or_NULL(g_cd, FILENAME_REASON);
+ gtk_label_set_text(g_lbl_cd_reason, reason ? reason : _("(no description)"));
+
+ gtk_list_store_clear(g_ls_details);
+ g_hash_table_foreach(g_cd, append_item_to_details_ls, NULL);
+
+ GtkTextBuffer *backtrace_buf = gtk_text_view_get_buffer(g_tv_backtrace);
+ const char *bt = g_cd ? get_crash_item_content_or_NULL(g_cd, FILENAME_BACKTRACE) : NULL;
+ gtk_text_buffer_set_text(backtrace_buf, bt ? bt : "", -1);
+
+//Doesn't work: shows empty page
+// if (!g_analyze_events[0])
+// {
+// /* No available analyze events, go to reporter selector page */
+// gtk_assistant_set_current_page(GTK_ASSISTANT(assistant), PAGENO_REPORTER_SELECTOR);
+// }
+
+ /* Update analyze radio buttons */
+ GtkWidget *first_rb = add_event_buttons(g_box_analyzers, g_analyze_events, G_CALLBACK(analyze_rb_was_toggled), /*radio:*/ true);
+ /* Update the value of currently selected analyzer */
+ if (first_rb)
+ {
+ const char *label = gtk_button_get_label(GTK_BUTTON(first_rb));
+ if (label)
+ {
+ free(g_analyze_label_selected);
+ g_analyze_label_selected = xstrdup(label);
+ }
+ }
+
+ /* Update reporter checkboxes */
+ add_event_buttons(g_box_reporters, g_report_events, /*callback:*/ G_CALLBACK(report_tb_was_toggled), /*radio:*/ false);
+ /* Update readiness state of reporter selector page: */
+ report_tb_was_toggled(NULL, NULL);
+
+ /* We can't just do gtk_widget_show_all once in main:
+ * We created new widgets (buttons). Need to make them visible.
+ */
+ gtk_widget_show_all(GTK_WIDGET(g_assistant));
+}
+
+
/* start_event_run */
-struct analyze_event_data {
+struct analyze_event_data
+{
struct run_event_state *run_state;
const char *event_name;
GList *more_events;
@@ -178,7 +318,9 @@ static gboolean consume_cmd_output(GIOChannel *source, GIOCondition condition, g
free_run_event_state(evd->run_state);
free(evd);
- reload_dump_dir();
+ reload_crash_data_from_dump_dir();
+ update_gui_state_from_crash_data();
+
return FALSE; /* "please remove this event" */
}
diff --git a/src/gui-wizard-gtk/wizard.h b/src/gui-wizard-gtk/wizard.h
index 4bac5e05..38f9bfd8 100644
--- a/src/gui-wizard-gtk/wizard.h
+++ b/src/gui-wizard-gtk/wizard.h
@@ -24,6 +24,7 @@ enum
extern GtkTreeView *g_tv_details;
extern GtkListStore *g_ls_details;
void create_assistant(void);
+void update_gui_state_from_crash_data(void);
extern char *g_glade_file;
@@ -32,5 +33,4 @@ extern char *g_analyze_label_selected;
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);
+void reload_crash_data_from_dump_dir(void);