summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDenys Vlasenko <dvlasenk@redhat.com>2011-03-11 19:30:11 +0100
committerDenys Vlasenko <dvlasenk@redhat.com>2011-03-11 19:30:11 +0100
commit6c17d7f56c0bbd290f6e03e6fc0955789c82b15c (patch)
treed79c82fa1a0e755cc23d71efef76eee04e840d82
parentd9cd2ab6ef3ebe4bb7883690efeb1b8dcb4c3c65 (diff)
downloadabrt-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.c4
-rw-r--r--src/gui-wizard-gtk/wizard.c202
-rw-r--r--src/gui-wizard-gtk/wizard.glade36
-rw-r--r--src/gui-wizard-gtk/wizard.h26
-rw-r--r--src/include/report/crash_data.h3
-rw-r--r--src/lib/crash_data.c8
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));