From 448a320aeb1b523893bd450c2ac9e52230da9410 Mon Sep 17 00:00:00 2001 From: Alan Fitton Date: Sat, 23 Apr 2011 13:35:04 +0000 Subject: header right click menu to show/hide --- src/trg-tree-view.c | 95 ++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 90 insertions(+), 5 deletions(-) (limited to 'src/trg-tree-view.c') diff --git a/src/trg-tree-view.c b/src/trg-tree-view.c index 42e7343..c1b8bcc 100644 --- a/src/trg-tree-view.c +++ b/src/trg-tree-view.c @@ -20,6 +20,7 @@ #include #include #include +#include #include "trg-tree-view.h" #include "trg-cell-renderer-speed.h" @@ -39,11 +40,15 @@ struct _TrgTreeViewPrivate { GList *columns; }; +static void trg_tree_view_add_column_after(TrgTreeView * tv, + trg_column_description * desc, + gchar ** widths, gint i, GtkTreeViewColumn *after_col); + trg_column_description *trg_tree_view_reg_column(TrgTreeView * tv, gint type, gint model_column, gchar * header, - gchar * id, gint show) + gchar * id, gint flags) { TrgTreeViewPrivate *priv = TRG_TREE_VIEW_GET_PRIVATE(tv); trg_column_description *desc = g_new0(trg_column_description, 1); @@ -52,7 +57,7 @@ trg_column_description *trg_tree_view_reg_column(TrgTreeView * tv, desc->model_column = model_column; desc->header = g_strdup(header); desc->id = g_strdup(id); - desc->show = show; + desc->flags = flags; priv->columns = g_list_append(priv->columns, desc); @@ -95,9 +100,79 @@ static gchar **trg_gconf_get_csv(TrgTreeView * tv, gchar * key) return ret; } +static void trg_tree_view_hide_column(GtkWidget *w, GtkTreeViewColumn *col) +{ + trg_column_description *desc = g_object_get_data(G_OBJECT(col), "column-desc"); + GtkWidget *tv = gtk_tree_view_column_get_tree_view(col); + desc->flags &= ~TRG_COLUMN_SHOWING; + gtk_tree_view_remove_column(GTK_TREE_VIEW(tv), col); +} + static void trg_tree_view_add_column(TrgTreeView * tv, trg_column_description * desc, gchar ** widths, gint i) +{ + trg_tree_view_add_column_after(tv, desc, widths, i, NULL); +} + +static void trg_tree_view_user_add_column_cb(GtkWidget *w, trg_column_description *desc) +{ + GtkTreeViewColumn *col = g_object_get_data(G_OBJECT(w), "parent-col"); + TrgTreeView *tv = TRG_TREE_VIEW(gtk_tree_view_column_get_tree_view(col)); + + trg_tree_view_add_column_after(tv, desc, NULL, -1, col); +} + +static void +view_popup_menu(GtkButton *button, GdkEventButton * event, + GtkTreeViewColumn *column) +{ + GtkWidget *tv = gtk_tree_view_column_get_tree_view(column); + TrgTreeViewPrivate *priv = TRG_TREE_VIEW_GET_PRIVATE(tv); + GtkWidget *menu, *menuitem; + trg_column_description *desc; + GList *li; + + menu = gtk_menu_new(); + + desc = g_object_get_data(G_OBJECT(column), "column-desc"); + menuitem = gtk_check_menu_item_new_with_label(desc->header); + gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem), TRUE); + g_signal_connect(menuitem, "activate", G_CALLBACK(trg_tree_view_hide_column), column); + gtk_widget_set_sensitive(menuitem, !(desc->flags & TRG_COLUMN_ALWAYS)); + gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); + + for (li = priv->columns; li; li = g_list_next(li)) { + trg_column_description *desc = (trg_column_description *)li->data; + if (!(desc->flags & TRG_COLUMN_SHOWING)) { + menuitem = gtk_check_menu_item_new_with_label(desc->header); + g_object_set_data(G_OBJECT(menuitem), "parent-col", column); + g_signal_connect(menuitem, "activate", G_CALLBACK(trg_tree_view_user_add_column_cb), desc); + gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); + } + } + gtk_widget_show_all(menu); + + gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, + (event != NULL) ? event->button : 0, + gdk_event_get_time((GdkEvent *) event)); +} + +static gboolean +col_onButtonPressed(GtkButton* button, GdkEventButton * event, + GtkTreeViewColumn *col) +{ + if (event->type == GDK_BUTTON_PRESS && event->button == 3) { + view_popup_menu(button, event, col); + return TRUE; + } + + return FALSE; +} + +static void trg_tree_view_add_column_after(TrgTreeView * tv, + trg_column_description * desc, + gchar ** widths, gint i, GtkTreeViewColumn *after_col) { GtkCellRenderer *renderer; GtkTreeViewColumn *column = NULL; @@ -204,7 +279,7 @@ static void trg_tree_view_add_column(TrgTreeView * tv, gtk_tree_view_column_set_reorderable(column, TRUE); gtk_tree_view_column_set_sort_column_id(column, desc->model_column); - if (i < 0 && desc->defaultWidth > 0) { + if (!widths && desc->defaultWidth > 0) { gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED); gtk_tree_view_column_set_fixed_width(column, desc->defaultWidth); @@ -220,8 +295,16 @@ static void trg_tree_view_add_column(TrgTreeView * tv, gtk_tree_view_append_column(GTK_TREE_VIEW(tv), column); + if (after_col) + gtk_tree_view_move_column_after(GTK_TREE_VIEW(tv), column, after_col); + + g_signal_connect(column->button, "button-press-event", + G_CALLBACK(col_onButtonPressed), column); + if (desc->out) *(desc->out) = column; + + desc->flags |= TRG_COLUMN_SHOWING; } void trg_tree_view_persist(TrgTreeView * tv) @@ -283,11 +366,13 @@ void trg_tree_view_setup_columns(TrgTreeView * tv) if (desc) trg_tree_view_add_column(tv, desc, widths, i); } + g_strfreev(columns); + g_strfreev(widths); } else { for (li = priv->columns; li; li = g_list_next(li)) { desc = (trg_column_description *) li->data; - if (desc && desc->show != 0) - trg_tree_view_add_column(tv, desc, widths, -1); + if (desc && !(desc->flags & TRG_COLUMN_EXTRA)) + trg_tree_view_add_column(tv, desc, NULL, -1); } } } -- cgit v1.2.3