diff options
author | Denys Vlasenko <dvlasenk@redhat.com> | 2011-03-11 19:30:11 +0100 |
---|---|---|
committer | Denys Vlasenko <dvlasenk@redhat.com> | 2011-03-11 19:30:11 +0100 |
commit | 6c17d7f56c0bbd290f6e03e6fc0955789c82b15c (patch) | |
tree | d79c82fa1a0e755cc23d71efef76eee04e840d82 | |
parent | d9cd2ab6ef3ebe4bb7883690efeb1b8dcb4c3c65 (diff) | |
download | abrt-6c17d7f56c0bbd290f6e03e6fc0955789c82b15c.tar.gz abrt-6c17d7f56c0bbd290f6e03e6fc0955789c82b15c.tar.xz abrt-6c17d7f56c0bbd290f6e03e6fc0955789c82b15c.zip |
gui-wizard-gtk: make one-line text elements selectable with mouse
Signed-off-by: Denys Vlasenko <dvlasenk@redhat.com>
-rw-r--r-- | src/gui-wizard-gtk/main.c | 4 | ||||
-rw-r--r-- | src/gui-wizard-gtk/wizard.c | 202 | ||||
-rw-r--r-- | src/gui-wizard-gtk/wizard.glade | 36 | ||||
-rw-r--r-- | src/gui-wizard-gtk/wizard.h | 26 | ||||
-rw-r--r-- | src/include/report/crash_data.h | 3 | ||||
-rw-r--r-- | src/lib/crash_data.c | 8 |
6 files changed, 129 insertions, 150 deletions
diff --git a/src/gui-wizard-gtk/main.c b/src/gui-wizard-gtk/main.c index 85f962cd..2148f740 100644 --- a/src/gui-wizard-gtk/main.c +++ b/src/gui-wizard-gtk/main.c @@ -7,7 +7,6 @@ char *g_glade_file = NULL; char *g_dump_dir_name = NULL; -char *g_analyze_label_selected = NULL; char *g_analyze_events = NULL; char *g_reanalyze_events = NULL; char *g_report_events = NULL; @@ -24,7 +23,10 @@ void reload_crash_data_from_dump_dir(void) struct dump_dir *dd = dd_opendir(g_dump_dir_name, DD_OPEN_READONLY); if (!dd) xfunc_die(); /* dd_opendir already logged error msg */ + g_cd = create_crash_data_from_dump_dir(dd); + add_to_crash_data_ext(g_cd, CD_DUMPDIR, g_dump_dir_name, CD_FLAG_TXT + CD_FLAG_ISNOTEDITABLE); + g_analyze_events = list_possible_events(dd, NULL, "analyze"); g_reanalyze_events = list_possible_events(dd, NULL, "reanalyze"); g_report_events = list_possible_events(dd, NULL, "report"); diff --git a/src/gui-wizard-gtk/wizard.c b/src/gui-wizard-gtk/wizard.c index 3fe2f128..fcfe7656 100644 --- a/src/gui-wizard-gtk/wizard.c +++ b/src/gui-wizard-gtk/wizard.c @@ -6,33 +6,42 @@ #define DEFAULT_WIDTH 800 #define DEFAULT_HEIGHT 500 -GtkAssistant *g_assistant; - -GtkBox *g_box_analyzers; -GtkLabel *g_lbl_analyze_log; -GtkTextView *g_tv_analyze_log; -GtkBox *g_box_reporters; -GtkLabel *g_lbl_report_log; -GtkTextView *g_tv_report_log; -GtkContainer *g_container_details1; -GtkContainer *g_container_details2; - -GtkLabel *g_lbl_cd_reason; -GtkLabel *g_lbl_dirname; -GtkTextView *g_tv_backtrace; -GtkTextView *g_tv_comment; -GtkTreeView *g_tv_details; -GtkListStore *g_ls_details; -GtkWidget *g_widget_warnings_area; -GtkBox *g_box_warning_labels; -GtkToggleButton *g_tb_approve_bt; -GtkButton *g_btn_refresh; - -GtkLabel *g_lbl_reporters; -GtkLabel *g_lbl_size; - - -/* required for search in bt */ +static GtkAssistant *g_assistant; + +static char *g_analyze_label_selected; + +static GtkBox *g_box_analyzers; +static GtkLabel *g_lbl_analyze_log; +static GtkTextView *g_tv_analyze_log; +static GtkBox *g_box_reporters; +static GtkLabel *g_lbl_report_log; +static GtkTextView *g_tv_report_log; +static GtkContainer *g_container_details1; +static GtkContainer *g_container_details2; + +static GtkLabel *g_lbl_cd_reason; +static GtkTextView *g_tv_backtrace; +static GtkTextView *g_tv_comment; +static GtkTreeView *g_tv_details; +static GtkWidget *g_widget_warnings_area; +static GtkBox *g_box_warning_labels; +static GtkToggleButton *g_tb_approve_bt; +static GtkButton *g_btn_refresh; + +static GtkLabel *g_lbl_reporters; +static GtkLabel *g_lbl_size; + +static GtkCellRenderer *g_tv_details_col2; +static GtkListStore *g_ls_details; +enum +{ + DETAIL_COLUMN_NAME, + DETAIL_COLUMN_VALUE, + //COLUMN_PATH, + DETAIL_NUM_COLUMNS, +}; + +/* Search in bt */ static guint g_timeout = 0; static GtkEntry *g_search_entry_bt; @@ -49,6 +58,16 @@ static PangoFontDescription *monospace_font; * page_6: summary * page_7: reporting progress */ +enum { + PAGENO_SUMMARY, + PAGENO_COMMENT, + PAGENO_ANALYZE_SELECTOR, + PAGENO_ANALYZE_PROGRESS, + PAGENO_REPORTER_SELECTOR, + PAGENO_BACKTRACE_APPROVAL, + PAGENO_REPORT, + PAGENO_REPORT_PROGRESS, +}; /* Use of arrays (instead of, say, #defines to C strings) * allows cheaper page_obj_t->name == PAGE_FOO comparisons @@ -171,7 +190,6 @@ struct dump_dir *steal_if_needed(struct dump_dir *dd) dd_close(dd); gtk_window_set_title(GTK_WINDOW(g_assistant), g_dump_dir_name); - gtk_label_set_text(g_lbl_dirname, g_dump_dir_name); delete_dump_dir_possibly_using_abrtd(old_name); //TODO: if (deletion_failed) error_msg("BAD")? free(old_name); @@ -255,6 +273,74 @@ static void append_to_textview(GtkTextView *tv, const char *str, int len) } +/* tv_details handling */ + +static void tv_details_row_activated( + GtkTreeView *tree_view, + GtkTreePath *path, + GtkTreeViewColumn *column, + gpointer user_data) +{ + GtkTreeModel *model; + GtkTreeIter iter; + GtkTreeSelection* selection = gtk_tree_view_get_selection(tree_view); + if (!gtk_tree_selection_get_selected(selection, &model, &iter)) + return; + + gchar *column_name; + gtk_tree_model_get(model, &iter, DETAIL_COLUMN_NAME, &column_name, -1); + struct crash_item *item = get_crash_data_item_or_NULL(g_cd, column_name); + if (!item || !(item->flags & CD_FLAG_TXT)) + return; + if (item->flags & CD_FLAG_ONELINE) + return; + + gchar *arg[3]; + arg[0] = (char *) "xdg-open"; + arg[1] = concat_path_file(g_dump_dir_name, column_name); + arg[2] = NULL; + g_free(column_name); + + g_spawn_sync(NULL, arg, NULL, + G_SPAWN_SEARCH_PATH | G_SPAWN_STDOUT_TO_DEV_NULL, + NULL, NULL, NULL, NULL, NULL, NULL); + + free(arg[1]); +} + +/* static gboolean tv_details_select_cursor_row( + GtkTreeView *tree_view, + gboolean arg1, + gpointer user_data) {...} */ + +static void tv_details_cursor_changed( + GtkTreeView *tree_view, + gpointer user_data) +{ + GtkTreeModel *model; + GtkTreeIter iter; + GtkTreeSelection* selection = gtk_tree_view_get_selection(tree_view); + if (!gtk_tree_selection_get_selected(selection, &model, &iter)) + return; + + gchar *column_name; + gtk_tree_model_get(model, &iter, DETAIL_COLUMN_NAME, &column_name, -1); + struct crash_item *item = get_crash_data_item_or_NULL(g_cd, column_name); + + gboolean editable = (item && (item->flags & (CD_FLAG_TXT|CD_FLAG_ONELINE)) == (CD_FLAG_TXT|CD_FLAG_ONELINE)); + + /* Allow user to select the text with mouse. + * Has undesirable side-effect of allowing user to "edit" the text, + * but changes aren't saved (the old text reappears as soon as user + * leaves the field). Need to disable editing somehow. + */ + g_object_set(G_OBJECT(g_tv_details_col2), + "editable", editable, + // "editable-set", editable, + NULL); +} + + /* update_gui_state_from_crash_data */ static void analyze_rb_was_toggled(GtkButton *button, gpointer user_data) @@ -326,39 +412,6 @@ struct cd_stats { unsigned filecount; }; -static void tv_details_edit_cb(GtkTreeView *tree_view, - GtkTreePath *path, - GtkTreeViewColumn *column, - gpointer user_data) -{ - GtkTreeModel *model; - GtkTreeIter iter; - GtkTreeSelection* selection = gtk_tree_view_get_selection(tree_view); - if (!gtk_tree_selection_get_selected(selection, &model, &iter)) - return; - - gchar *column_name; - gtk_tree_model_get(model, &iter, DETAIL_COLUMN_NAME, &column_name, -1); - struct crash_item *item = get_crash_data_item_or_NULL(g_cd, column_name); - if (!item || !IS_TXT(item->flags)) - return; - - if (item && IS_ONELINE(item->flags)) - return; - - gchar *arg[3]; - arg[0] = (char *) "xdg-open"; - arg[1] = concat_path_file(g_dump_dir_name, column_name); - arg[2] = NULL; - g_free(column_name); - - g_spawn_sync(NULL, arg, NULL, - G_SPAWN_SEARCH_PATH | G_SPAWN_STDOUT_TO_DEV_NULL, - NULL, NULL, NULL, NULL, NULL, NULL); - - free(arg[1]); -} - static void append_item_to_ls_details(gpointer name, gpointer value, gpointer data) { crash_item *item = (crash_item*)value; @@ -410,7 +463,6 @@ static void append_item_to_ls_details(gpointer name, gpointer value, gpointer da void update_gui_state_from_crash_data(void) { gtk_window_set_title(GTK_WINDOW(g_assistant), g_dump_dir_name); - gtk_label_set_text(g_lbl_dirname, g_dump_dir_name); 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)")); @@ -425,13 +477,6 @@ void update_gui_state_from_crash_data(void) load_text_to_text_view(g_tv_backtrace, FILENAME_BACKTRACE); load_text_to_text_view(g_tv_comment, FILENAME_COMMENT); -//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, /*prev:*/ g_analyze_label_selected); /* Update the value of currently selected analyzer */ @@ -979,19 +1024,7 @@ static void create_details_treeview() gtk_tree_view_column_set_sort_column_id(column, DETAIL_COLUMN_NAME); gtk_tree_view_append_column(g_tv_details, column); - renderer = gtk_cell_renderer_text_new(); - /* Allow user to select the text with mouse. - * Has undesirable side-effect of allowing user to "edit" the text, - * but changes aren't saved (the old text reappears as soon as user - * leaves the field). Need to disable editing somehow. - * Also, it interferes with "(click here to view/edit)" values. - * Need to find a way to _selectively_ enable editing only - * on some cells, not all at once. - */ - //g_object_set(G_OBJECT(renderer), - // "editable", TRUE, - // // "editable-set", TRUE, - // NULL); + g_tv_details_col2 = renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new_with_attributes(_("Value"), renderer, "text", @@ -1057,7 +1090,6 @@ static void add_pages(void) } /* Set pointers to objects we might need to work with */ g_lbl_cd_reason = GTK_LABEL( gtk_builder_get_object(builder, "lbl_cd_reason")); - g_lbl_dirname = GTK_LABEL( gtk_builder_get_object(builder, "lbl_dirname")); g_box_analyzers = GTK_BOX( gtk_builder_get_object(builder, "vb_analyzers")); g_lbl_analyze_log = GTK_LABEL( gtk_builder_get_object(builder, "lbl_analyze_log")); g_tv_analyze_log = GTK_TEXT_VIEW( gtk_builder_get_object(builder, "tv_analyze_log")); @@ -1119,7 +1151,9 @@ void create_assistant() g_signal_connect(g_tb_approve_bt, "toggled", G_CALLBACK(on_bt_approve_toggle), NULL); g_signal_connect(g_btn_refresh, "clicked", G_CALLBACK(on_btn_refresh_clicked), NULL); - g_signal_connect(g_tv_details, "row-activated", G_CALLBACK(tv_details_edit_cb), NULL); + g_signal_connect(g_tv_details, "row-activated", G_CALLBACK(tv_details_row_activated), NULL); + /* [Enter] on a row: g_signal_connect(g_tv_details, "select-cursor-row", G_CALLBACK(tv_details_select_cursor_row), NULL); */ + g_signal_connect(g_tv_details, "cursor-changed", G_CALLBACK(tv_details_cursor_changed), NULL); /* init searching */ GtkTextBuffer *backtrace_buf = gtk_text_view_get_buffer(g_tv_backtrace); diff --git a/src/gui-wizard-gtk/wizard.glade b/src/gui-wizard-gtk/wizard.glade index bfa0be67..fa9f15ed 100644 --- a/src/gui-wizard-gtk/wizard.glade +++ b/src/gui-wizard-gtk/wizard.glade @@ -40,38 +40,6 @@ </packing> </child> <child> - <object class="GtkHBox" id="hbox2"> - <property name="visible">True</property> - <child> - <object class="GtkLabel" id="label13"> - <property name="visible">True</property> - <property name="ypad">5</property> - <property name="label" translatable="yes">Problem data is stored in:</property> - </object> - <packing> - <property name="expand">False</property> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="lbl_dirname"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="xpad">5</property> - <property name="ypad">5</property> - <property name="selectable">True</property> - </object> - <packing> - <property name="position">1</property> - </packing> - </child> - </object> - <packing> - <property name="expand">False</property> - <property name="position">2</property> - </packing> - </child> - <child> <object class="GtkExpander" id="expander1"> <property name="visible">True</property> <property name="can_focus">True</property> @@ -97,7 +65,7 @@ </child> </object> <packing> - <property name="position">3</property> + <property name="position">2</property> </packing> </child> </object> @@ -492,7 +460,7 @@ <property name="width_request">750</property> <property name="visible">True</property> <property name="xalign">0</property> - <property name="label" translatable="yes">Click 'Forward' to start reporting</property> + <property name="label" translatable="yes">Click 'Apply' to start reporting</property> <property name="justify">fill</property> <property name="wrap">True</property> </object> diff --git a/src/gui-wizard-gtk/wizard.h b/src/gui-wizard-gtk/wizard.h index 00884b21..322b338f 100644 --- a/src/gui-wizard-gtk/wizard.h +++ b/src/gui-wizard-gtk/wizard.h @@ -1,28 +1,3 @@ -enum { - PAGENO_SUMMARY, - PAGENO_COMMENT, - PAGENO_ANALYZE_SELECTOR, - PAGENO_ANALYZE_PROGRESS, - PAGENO_REPORTER_SELECTOR, - PAGENO_BACKTRACE_APPROVAL, - PAGENO_REPORT, - PAGENO_REPORT_PROGRESS, -}; -extern GtkAssistant *g_assistant; -extern GtkLabel *g_lbl_cd_reason; -extern GtkLabel *g_lbl_analyze_log; -extern GtkBox *g_box_analyzers; -extern GtkBox *g_box_reporters; -extern GtkTextView *g_tv_backtrace; -enum -{ - DETAIL_COLUMN_NAME, - DETAIL_COLUMN_VALUE, - //COLUMN_PATH, - DETAIL_NUM_COLUMNS, -}; -extern GtkTreeView *g_tv_details; -extern GtkListStore *g_ls_details; void create_assistant(void); void update_gui_state_from_crash_data(void); void show_error_as_msgbox(const char *msg); @@ -30,7 +5,6 @@ void show_error_as_msgbox(const char *msg); extern char *g_glade_file; extern char *g_dump_dir_name; -extern char *g_analyze_label_selected; extern char *g_analyze_events; extern char *g_reanalyze_events; extern char *g_report_events; diff --git a/src/include/report/crash_data.h b/src/include/report/crash_data.h index 2dfdb242..3813cabf 100644 --- a/src/include/report/crash_data.h +++ b/src/include/report/crash_data.h @@ -35,9 +35,6 @@ enum { CD_FLAG_ONELINE = (1 << 4), }; -#define IS_TXT(flag) ((flag) & CD_FLAG_TXT) -#define IS_ONELINE(flag) ((flag) & CD_FLAG_ONELINE) - struct crash_item { char *content; unsigned flags; diff --git a/src/lib/crash_data.c b/src/lib/crash_data.c index 7f23c52f..a3ba3fb6 100644 --- a/src/lib/crash_data.c +++ b/src/lib/crash_data.c @@ -42,9 +42,13 @@ void add_to_crash_data_ext(crash_data_t *crash_data, const char *content, unsigned flags) { - if (!(flags & (CD_FLAG_BIN|CD_FLAG_TXT))) + if (!(flags & CD_FLAG_BIN)) + { flags |= CD_FLAG_TXT; - if (!(flags & (CD_FLAG_ISEDITABLE|CD_FLAG_ISNOTEDITABLE))) + if (!strchr(content, '\n')) + flags |= CD_FLAG_ONELINE; + } + if (!(flags & CD_FLAG_ISEDITABLE)) flags |= CD_FLAG_ISNOTEDITABLE; struct crash_item *item = (struct crash_item *)xzalloc(sizeof(*item)); |