diff options
Diffstat (limited to 'src/gui-wizard-gtk/wizard.c')
-rw-r--r-- | src/gui-wizard-gtk/wizard.c | 109 |
1 files changed, 87 insertions, 22 deletions
diff --git a/src/gui-wizard-gtk/wizard.c b/src/gui-wizard-gtk/wizard.c index 2dc87018..39f90e37 100644 --- a/src/gui-wizard-gtk/wizard.c +++ b/src/gui-wizard-gtk/wizard.c @@ -36,6 +36,7 @@ typedef struct event_gui_data_t static GtkAssistant *g_assistant; static char *g_analyze_event_selected; +static unsigned g_black_event_count = 0; static GtkBox *g_box_analyzers; /* List of event_gui_data's */ @@ -403,11 +404,12 @@ static gint find_by_button(gconstpointer a, gconstpointer button) static void analyze_rb_was_toggled(GtkButton *button, gpointer user_data) { + free(g_analyze_event_selected); + g_analyze_event_selected = NULL; GList *found = g_list_find_custom(g_list_analyzers, button, find_by_button); if (found) { event_gui_data_t *evdata = found->data; - free(g_analyze_event_selected); g_analyze_event_selected = xstrdup(evdata->event_name); } } @@ -461,6 +463,9 @@ static event_gui_data_t *add_event_buttons(GtkBox *box, g_list_free(*p_event_list); *p_event_list = NULL; + if (radio) + g_black_event_count = 0; + bool have_activated_btn = false; event_gui_data_t *first_button = NULL; while (event_name[0]) @@ -475,7 +480,10 @@ static event_gui_data_t *add_event_buttons(GtkBox *box, event_screen_name++; else event_screen_name = event_name; +///vda const char *event_description = NULL; + char *tmp_description = NULL; + bool green_choice = false; event_config_t *cfg = get_event_config(event_name); if (cfg) { @@ -483,7 +491,17 @@ static event_gui_data_t *add_event_buttons(GtkBox *box, if (cfg->screen_name) event_screen_name = cfg->screen_name; event_description = cfg->description; + if (cfg->creates_elements) + { + if (get_problem_data_item_or_NULL(g_cd, cfg->creates_elements)) + { + green_choice = true; + event_description = tmp_description = xasprintf("(not needed, %s already exists)", cfg->creates_elements); + } + } } + if (radio && !green_choice) + g_black_event_count++; //VERB2 log("adding button '%s' to box %p", event_name, box); char *event_label = xasprintf("%s%s%s", @@ -491,6 +509,8 @@ static event_gui_data_t *add_event_buttons(GtkBox *box, (event_description ? " - " : ""), event_description ? event_description : "" ); + free(tmp_description); + GtkWidget *button = radio ? gtk_radio_button_new_with_label_from_widget( (first_button ? GTK_RADIO_BUTTON(first_button->toggle_button) : NULL), @@ -498,6 +518,20 @@ static event_gui_data_t *add_event_buttons(GtkBox *box, ) : gtk_check_button_new_with_label(event_label); free(event_label); + + if (green_choice) + { + //static const GdkColor red = { .red = 0xffff }; + //gtk_widget_modify_text(button, GTK_STATE_NORMAL, &red); + GtkWidget *child = gtk_bin_get_child(GTK_BIN(button)); + if (child) + { + static const GdkColor green = { .green = 0x7fff }; + gtk_widget_modify_fg(child, GTK_STATE_NORMAL, &green); + gtk_widget_modify_fg(child, GTK_STATE_ACTIVE, &green); + gtk_widget_modify_fg(child, GTK_STATE_PRELIGHT, &green); + } + } if (func) g_signal_connect(G_OBJECT(button), "toggled", func, NULL); if (cfg->long_descr) @@ -511,19 +545,48 @@ static event_gui_data_t *add_event_buttons(GtkBox *box, if (!first_button) first_button = event_gui_data; - if (prev_selected && strcmp(prev_selected, event_name) == 0) - { + if ((radio && !prev_selected && !have_activated_btn && !green_choice) + || (prev_selected && strcmp(prev_selected, event_name) == 0) + ) { + prev_selected = NULL; gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), true); have_activated_btn = true; - prev_selected = NULL; } *event_name_end = '\n'; event_name = event_name_end + 1; gtk_box_pack_start(box, button, /*expand*/ false, /*fill*/ false, /*padding*/ 0); + } + + if (radio) + { + GtkWidget *button = radio + ? gtk_radio_button_new_with_label_from_widget( + (first_button ? GTK_RADIO_BUTTON(first_button->toggle_button) : NULL), + "Don't do anything" + ) + : gtk_check_button_new_with_label("Don't do anything"); + if (func) + g_signal_connect(G_OBJECT(button), "toggled", func, NULL); + + event_gui_data_t *event_gui_data = new_event_gui_data_t(); + event_gui_data->event_name = xstrdup(""); + event_gui_data->toggle_button = GTK_TOGGLE_BUTTON(button); + *p_event_list = g_list_append(*p_event_list, event_gui_data); + + if (!first_button) + first_button = event_gui_data; + if (g_black_event_count == 0 && !have_activated_btn) + { + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), true); + have_activated_btn = true; + } + + gtk_box_pack_start(box, button, /*expand*/ false, /*fill*/ false, /*padding*/ 0); } + return (have_activated_btn ? NULL : first_button); } @@ -652,7 +715,7 @@ void update_gui_state_from_problem_data(void) */ gtk_widget_show_all(GTK_WIDGET(g_assistant)); - if (g_reanalyze_events[0]) + if (g_analyze_events[0]) gtk_widget_show(GTK_WIDGET(g_btn_refresh)); else gtk_widget_hide(GTK_WIDGET(g_btn_refresh)); @@ -1047,19 +1110,14 @@ static void on_bt_approve_toggle(GtkToggleButton *togglebutton, gpointer user_da static void on_btn_refresh_clicked(GtkButton *button) { - if (g_reanalyze_events[0]) - { - /* Save backtrace text if changed */ - save_text_from_text_view(g_tv_backtrace, FILENAME_BACKTRACE); + /* Save backtrace text if changed */ + save_text_from_text_view(g_tv_backtrace, FILENAME_BACKTRACE); - g_analyze_events = append_to_malloced_string(g_analyze_events, g_reanalyze_events); - g_reanalyze_events[0] = '\0'; - /* Refresh GUI so that we see new analyze+reanalyze buttons */ - update_gui_state_from_problem_data(); + /* Refresh GUI so that we see new analyze buttons */ + update_gui_state_from_problem_data(); - /* Change page to analyzer selector - let user play with them */ - gtk_assistant_set_current_page(g_assistant, PAGENO_ANALYZE_SELECTOR); - } + /* Change page to analyzer selector - let user play with them */ + gtk_assistant_set_current_page(g_assistant, PAGENO_ANALYZE_SELECTOR); } @@ -1075,6 +1133,7 @@ static void next_page(GtkAssistant *assistant, gpointer user_data) if (added_pages[page_no]->name == PAGE_ANALYZE_SELECTOR && g_analyze_event_selected != NULL + && g_analyze_event_selected[0] ) { start_event_run(g_analyze_event_selected, NULL, @@ -1146,11 +1205,12 @@ static void on_page_prepare(GtkAssistant *assistant, GtkWidget *page, gpointer u static gint next_page_no(gint current_page_no, gpointer data) { - again: - current_page_no++; /* we don't need any magic here if we're in only-report mode */ if (g_report_only) - return current_page_no; + return current_page_no + 1; + + again: + current_page_no++; switch (current_page_no) { @@ -1167,12 +1227,17 @@ static gint next_page_no(gint current_page_no, gpointer data) goto again; /* no backtrace, skip next page */ case PAGENO_ANALYZE_SELECTOR: - if (!g_analyze_events[0]) + if (!g_analyze_events[0] || g_black_event_count == 0) { - //TODO: if (!g_reporter_events[0]) /* no reporters available */ then what? - return PAGENO_REPORTER_SELECTOR; /* skip analyze pages */ + /* skip analyze selector page and analyze log page */ + current_page_no = PAGENO_REPORTER_SELECTOR-1; + goto again; } break; + + case PAGENO_ANALYZE_PROGRESS: + if (!g_analyze_event_selected || !g_analyze_event_selected[0]) + goto again; } VERB2 log("next page_no:%d", current_page_no); |