summaryrefslogtreecommitdiffstats
path: root/src/gui-gtk
diff options
context:
space:
mode:
authorJiri Moskovcak <jmoskovc@redhat.com>2011-03-08 21:34:04 +0100
committerJiri Moskovcak <jmoskovc@redhat.com>2011-03-08 21:34:04 +0100
commitf849ea75e9511d0ac85a5e6a6144c82fca44a451 (patch)
tree87b83148495c0af9a741de1a0f6abe8f606d46d7 /src/gui-gtk
parente2fdf6c58eba440770624d13e25a63c3d77040db (diff)
downloadabrt-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.am2
-rw-r--r--src/gui-gtk/abrt-gtk.c26
-rw-r--r--src/gui-gtk/event_config_dialog.c174
-rw-r--r--src/gui-gtk/event_config_dialog.h1
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", &gtk_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);