diff options
author | Jiri Moskovcak <jmoskovc@redhat.com> | 2011-03-08 21:34:04 +0100 |
---|---|---|
committer | Jiri Moskovcak <jmoskovc@redhat.com> | 2011-03-08 21:34:04 +0100 |
commit | f849ea75e9511d0ac85a5e6a6144c82fca44a451 (patch) | |
tree | 87b83148495c0af9a741de1a0f6abe8f606d46d7 /src/gui-gtk | |
parent | e2fdf6c58eba440770624d13e25a63c3d77040db (diff) | |
download | abrt-f849ea75e9511d0ac85a5e6a6144c82fca44a451.tar.gz abrt-f849ea75e9511d0ac85a5e6a6144c82fca44a451.tar.xz abrt-f849ea75e9511d0ac85a5e6a6144c82fca44a451.zip |
abrt-gtk: added event config dialog
- Edit->Plugins will show the list of all plugins
- it's just read only and the event config option shows only empty fields
Diffstat (limited to 'src/gui-gtk')
-rw-r--r-- | src/gui-gtk/Makefile.am | 2 | ||||
-rw-r--r-- | src/gui-gtk/abrt-gtk.c | 26 | ||||
-rw-r--r-- | src/gui-gtk/event_config_dialog.c | 174 | ||||
-rw-r--r-- | src/gui-gtk/event_config_dialog.h | 1 |
4 files changed, 176 insertions, 27 deletions
diff --git a/src/gui-gtk/Makefile.am b/src/gui-gtk/Makefile.am index 30d4f755..31cae91e 100644 --- a/src/gui-gtk/Makefile.am +++ b/src/gui-gtk/Makefile.am @@ -2,7 +2,7 @@ bin_PROGRAMS = abrt-gtk abrt_gtk_SOURCES = \ abrt-gtk.h abrt-gtk.c \ - event_config_dialog.c \ + event_config_dialog.h event_config_dialog.c \ main.c abrt_gtk_CFLAGS = \ -I$(srcdir)/../include/report -I$(srcdir)/../include \ diff --git a/src/gui-gtk/abrt-gtk.c b/src/gui-gtk/abrt-gtk.c index 751d1c7a..7ec671c4 100644 --- a/src/gui-gtk/abrt-gtk.c +++ b/src/gui-gtk/abrt-gtk.c @@ -3,9 +3,11 @@ #include "abrtlib.h" #include "abrt_dbus.h" #include "abrt-gtk.h" +#include "event_config_dialog.h" static GtkListStore *s_dumps_list_store; static GtkWidget *s_treeview; +static GtkWidget *g_main_window; enum { @@ -130,6 +132,11 @@ static gint on_key_press_event_cb(GtkTreeView *treeview, GdkEventKey *key, gpoin return FALSE; } +void show_events_list_dialog_cb(GtkMenuItem *menuitem, gpointer user_data) +{ + show_events_list_dialog(GTK_WINDOW(g_main_window)); +} + static void add_columns(GtkTreeView *treeview) { GtkCellRenderer *renderer; @@ -193,6 +200,8 @@ GtkWidget *create_menu(void) gtk_menu_shell_append(GTK_MENU_SHELL(file_submenu), quit_item); gtk_menu_item_set_submenu(GTK_MENU_ITEM(file_item), file_submenu); + g_signal_connect(quit_item, "activate", >k_main_quit, NULL); + /* edit submenu */ GtkWidget *edit_submenu = gtk_menu_new(); GtkWidget *plugins_item = gtk_menu_item_new_with_mnemonic(_("_Plugins")); @@ -201,6 +210,9 @@ GtkWidget *create_menu(void) gtk_menu_shell_append(GTK_MENU_SHELL(edit_submenu), preferences_item); gtk_menu_item_set_submenu(GTK_MENU_ITEM(edit_item), edit_submenu); + g_signal_connect(plugins_item, "activate", G_CALLBACK(show_events_list_dialog_cb), NULL); + + /* help submenu */ GtkWidget *help_submenu = gtk_menu_new(); GtkWidget *log_item = gtk_menu_item_new_with_mnemonic(_("View _log")); @@ -217,10 +229,10 @@ GtkWidget *create_menu(void) GtkWidget *create_main_window(void) { /* main window */ - GtkWidget *main_window = gtk_window_new(GTK_WINDOW_TOPLEVEL); - gtk_window_set_default_size(GTK_WINDOW(main_window), 600, 700); - gtk_window_set_title(GTK_WINDOW(main_window), _("Automatic Bug Reporting Tool")); - gtk_window_set_icon_name(GTK_WINDOW(main_window), "abrt"); + g_main_window = gtk_window_new(GTK_WINDOW_TOPLEVEL); + gtk_window_set_default_size(GTK_WINDOW(g_main_window), 600, 700); + gtk_window_set_title(GTK_WINDOW(g_main_window), _("Automatic Bug Reporting Tool")); + gtk_window_set_icon_name(GTK_WINDOW(g_main_window), "abrt"); GtkWidget *main_vbox = gtk_vbox_new(false, 0); @@ -234,7 +246,7 @@ GtkWidget *create_main_window(void) gtk_box_pack_start(GTK_BOX(main_vbox), create_menu(), false, false, 0); gtk_box_pack_start(GTK_BOX(main_vbox), scroll_win, true, true, 0); - gtk_container_add(GTK_CONTAINER(main_window), main_vbox); + gtk_container_add(GTK_CONTAINER(g_main_window), main_vbox); /* tree view inside scrolled region */ s_treeview = gtk_tree_view_new(); @@ -255,9 +267,9 @@ GtkWidget *create_main_window(void) /* Delete handler */ g_signal_connect(s_treeview, "key-press-event", G_CALLBACK(on_key_press_event_cb), NULL); /* Quit when user closes the main window */ - g_signal_connect(main_window, "destroy", gtk_main_quit, NULL); + g_signal_connect(g_main_window, "destroy", gtk_main_quit, NULL); - return main_window; + return g_main_window; } void sanitize_cursor(GtkTreePath *preferred_path) diff --git a/src/gui-gtk/event_config_dialog.c b/src/gui-gtk/event_config_dialog.c index 1da458d3..f6f7c5f1 100644 --- a/src/gui-gtk/event_config_dialog.c +++ b/src/gui-gtk/event_config_dialog.c @@ -2,8 +2,18 @@ #include <gtk/gtk.h> static GtkWidget *option_table; +static GtkWidget *parent_dialog; static int last_row = 0; +enum +{ + COLUMN_EVENT_NAME, + COLUMN_EVENT, + NUM_COLUMNS +}; + +static void show_event_config_dialog(event_config_t* event); + GtkWidget *gtk_label_new_justify_left(const gchar *label_str) { GtkWidget *label = gtk_label_new(label_str); @@ -12,9 +22,8 @@ GtkWidget *gtk_label_new_justify_left(const gchar *label_str) return label; } -void add_option_to_dialog(event_option_t *option) +static void add_option_to_dialog(event_option_t *option) { - GtkWidget *label; GtkWidget *option_input; GtkWidget *option_hbox = gtk_hbox_new(FALSE, 0); @@ -69,38 +78,87 @@ void add_option_to_dialog(event_option_t *option) gtk_widget_show_all(GTK_WIDGET(option_hbox)); } -void print_option(gpointer data, gpointer user_data) +static void add_option(gpointer data, gpointer user_data) { event_option_t * option = (event_option_t *)data; - /* - g_print("option:\n"); - g_print("\tlabel: %s\n", option->label); - g_print("\tenv name: %s\n", option->name); - g_print("\ttooltip: %s\n", option->description); - g_print("\ttype: %i\n", option->type); - */ add_option_to_dialog(option); } -void show_event_config_dialog(const char* event_name) +static void on_close_event_list_cb(GtkWidget *button, gpointer user_data) +{ + GtkWidget *window = (GtkWidget *)user_data; + gtk_widget_destroy(window); +} + +static event_config_t *get_event_config_from_row(GtkTreeView *treeview) { - event_config_t *ui = new_event_config(); - load_event_description_from_file(ui, "Bugzilla.xml"); + GtkTreeSelection *selection = gtk_tree_view_get_selection(treeview); + event_config_t *event_config = NULL; + if (selection) + { + GtkTreeIter iter; + GtkTreeModel *store = gtk_tree_view_get_model(treeview); + if (gtk_tree_selection_get_selected(selection, &store, &iter) == TRUE) + { + GValue value = { 0 }; + gtk_tree_model_get_value(store, &iter, COLUMN_EVENT, &value); + event_config = (event_config_t*)g_value_get_pointer(&value); + } + } + return event_config; +} +static void on_configure_event_cb(GtkWidget *button, gpointer user_data) +{ + GtkTreeView *events_tv = (GtkTreeView *)user_data; + event_config_t *ec = get_event_config_from_row(events_tv); + show_event_config_dialog(ec); +} + +static void on_event_row_activated_cb(GtkTreeView *treeview, GtkTreePath *path, GtkTreeViewColumn *column, gpointer user_data) +{ + event_config_t *ec = get_event_config_from_row(treeview); + show_event_config_dialog(ec); +} + +static void add_event_to_liststore(gpointer key, gpointer value, gpointer user_data) +{ + GtkListStore *events_list_store = (GtkListStore *)user_data; + event_config_t *ec = (event_config_t *)value; + char *event_label = NULL; + if(ec->name != NULL && ec->description != NULL) + event_label = xasprintf("<b>%s</b>\n%s", ec->name, ec->description); + else + //if event has no xml description + event_label = xasprintf("<b>%s</b>\nNo description available", key); + + GtkTreeIter iter; + gtk_list_store_append(events_list_store, &iter); + gtk_list_store_set(events_list_store, &iter, + COLUMN_EVENT_NAME, event_label, + COLUMN_EVENT, value, + -1); +} + +static void show_event_config_dialog(event_config_t* event) +{ GtkWidget *dialog = gtk_dialog_new_with_buttons( - ui->name, - NULL, + event->name, + GTK_WINDOW(parent_dialog), GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, GTK_STOCK_OK, GTK_RESPONSE_APPLY, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, NULL); - int length = g_list_length(ui->options); - //g_print("%i\n", length); + if(parent_dialog != NULL) + { + gtk_window_set_icon_name(GTK_WINDOW(dialog), + gtk_window_get_icon_name(GTK_WINDOW(parent_dialog))); + } + int length = g_list_length(event->options); option_table = gtk_table_new(length, 2, 0); - g_list_foreach(ui->options, &print_option, NULL); - free_event_config(ui); + g_list_foreach(event->options, &add_option, NULL); GtkWidget *content = gtk_dialog_get_content_area(GTK_DIALOG(dialog)); gtk_box_pack_start(GTK_BOX(content), option_table, 0, 0, 10); @@ -112,3 +170,81 @@ void show_event_config_dialog(const char* event_name) g_print("cancel\n"); gtk_widget_destroy(GTK_WIDGET(dialog)); } + +void show_events_list_dialog(GtkWindow *parent) +{ + /*remove this line if we want to reload the config + *everytime we show the config dialog + */ + if(g_event_config_list == NULL) + load_event_config_data(); + if(g_event_config_list == NULL) + g_print("can't load event's config\n"); + parent_dialog = gtk_window_new(GTK_WINDOW_TOPLEVEL); + gtk_window_set_title(GTK_WINDOW(parent_dialog), _("Event Config")); + gtk_window_set_default_size(GTK_WINDOW(parent_dialog), 450, 400); + if(parent != NULL) + { + gtk_window_set_transient_for(GTK_WINDOW(parent_dialog), parent); + // modal = parent window can't steal focus + gtk_window_set_modal(GTK_WINDOW(parent_dialog), true); + gtk_window_set_icon_name(GTK_WINDOW(parent_dialog), + gtk_window_get_icon_name(parent)); + } + + GtkWidget *main_vbox = gtk_vbox_new(0, 0); + GtkWidget *events_scroll = gtk_scrolled_window_new(NULL, NULL); + gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(events_scroll), + GTK_POLICY_AUTOMATIC, + GTK_POLICY_AUTOMATIC); + /* event list treeview */ + GtkWidget *events_tv = gtk_tree_view_new(); + /* column with event name and description */ + GtkCellRenderer *renderer; + GtkTreeViewColumn *column; + + /* add column to tree view */ + renderer = gtk_cell_renderer_text_new(); + column = gtk_tree_view_column_new_with_attributes(_("Event"), + renderer, + "markup", + COLUMN_EVENT_NAME, + NULL); + gtk_tree_view_column_set_resizable(column, TRUE); + gtk_tree_view_column_set_sort_column_id(column, COLUMN_EVENT_NAME); + gtk_tree_view_append_column(GTK_TREE_VIEW(events_tv), column); + + /* Create data store for the list and attach it + * COLUMN_EVENT_NAME -> name+description + * COLUMN_EVENT -> event_conf_t* so we can retrieve the event_config from the row + */ + GtkListStore *events_list_store = gtk_list_store_new(NUM_COLUMNS, + G_TYPE_STRING, /* Event name + description */ + G_TYPE_POINTER); + gtk_tree_view_set_model(GTK_TREE_VIEW(events_tv), GTK_TREE_MODEL(events_list_store)); + + g_hash_table_foreach(g_event_config_list, + &add_event_to_liststore, + events_list_store); + + /* Double click/Enter handler */ + g_signal_connect(events_tv, "row-activated", G_CALLBACK(on_event_row_activated_cb), NULL); + + gtk_container_add(GTK_CONTAINER(events_scroll), events_tv); + + GtkWidget *configure_event_btn = gtk_button_new_with_label(_("Configure")); + g_signal_connect(configure_event_btn, "clicked", G_CALLBACK(on_configure_event_cb), events_tv); + + GtkWidget *close_btn = gtk_button_new_from_stock(GTK_STOCK_CLOSE); + g_signal_connect(close_btn, "clicked", G_CALLBACK(on_close_event_list_cb), parent_dialog); + + GtkWidget *btnbox = gtk_hbutton_box_new(); + gtk_box_pack_end(GTK_BOX(btnbox), configure_event_btn, false, false, 0); + gtk_box_pack_end(GTK_BOX(btnbox), close_btn, false, false, 0); + + gtk_box_pack_start(GTK_BOX(main_vbox), events_scroll, true, true, 10); + gtk_box_pack_start(GTK_BOX(main_vbox), btnbox, false, false, 0); + gtk_container_add(GTK_CONTAINER(parent_dialog), main_vbox); + + gtk_widget_show_all(parent_dialog); +} diff --git a/src/gui-gtk/event_config_dialog.h b/src/gui-gtk/event_config_dialog.h new file mode 100644 index 00000000..1e70e549 --- /dev/null +++ b/src/gui-gtk/event_config_dialog.h @@ -0,0 +1 @@ +void show_events_list_dialog(GtkWindow *parent); |