summaryrefslogtreecommitdiff
path: root/src/trg-tree-view.c
diff options
context:
space:
mode:
authorGravatar Alan Fitton <ajf@eth0.org.uk>2011-04-23 13:35:04 +0000
committerGravatar Alan Fitton <ajf@eth0.org.uk>2011-04-23 13:35:04 +0000
commit448a320aeb1b523893bd450c2ac9e52230da9410 (patch)
tree2c91dd1ec8635ec5d5e9d4d9bae1aa68187f8bac /src/trg-tree-view.c
parentfc4ffcaa3bc34da935ac6f46cab71be932de306c (diff)
header right click menu to show/hide
Diffstat (limited to 'src/trg-tree-view.c')
-rw-r--r--src/trg-tree-view.c95
1 files changed, 90 insertions, 5 deletions
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 <stdlib.h>
#include <gtk/gtk.h>
#include <gconf/gconf-client.h>
+#include <glib/gi18n.h>
#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,10 +100,80 @@ 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);
}
}
}