From 8cc810e1fbf069f808cfe3e9598273b2f3dd8aab Mon Sep 17 00:00:00 2001 From: Alan Fitton Date: Sun, 26 Aug 2012 11:42:39 +0100 Subject: add a menu for changing sort, useful when there are no column headers in Transmission style --- src/trg-tree-view.c | 85 +++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 82 insertions(+), 3 deletions(-) (limited to 'src/trg-tree-view.c') diff --git a/src/trg-tree-view.c b/src/trg-tree-view.c index 42d4885..d507fc3 100644 --- a/src/trg-tree-view.c +++ b/src/trg-tree-view.c @@ -149,7 +149,7 @@ trg_column_description *trg_tree_view_reg_column(TrgTreeView * tv, gint type, gint model_column, const gchar * header, - const gchar * id, gint flags) + const gchar * id, guint flags) { TrgTreeViewPrivate *priv = TRG_TREE_VIEW_GET_PRIVATE(tv); trg_column_description *desc = g_new0(trg_column_description, 1); @@ -209,6 +209,85 @@ trg_tree_view_user_add_column_cb(GtkWidget * w, trg_tree_view_add_column_after(tv, desc, -1, col); } +static void trg_tree_view_sort_menu_item_toggled(GtkCheckMenuItem * w, gpointer data) +{ + GtkTreeSortable *model = GTK_TREE_SORTABLE(data); + trg_column_description *desc = + (trg_column_description *)g_object_get_data(G_OBJECT(w), GDATA_KEY_COLUMN_DESC); + + if (gtk_check_menu_item_get_active(w)) { + GtkSortType sortType; + gtk_tree_sortable_get_sort_column_id (model, NULL, &sortType); + gtk_tree_sortable_set_sort_column_id(model, desc->model_column, sortType); + } +} + +static void trg_tree_view_sort_menu_type_toggled(GtkCheckMenuItem * w, gpointer data) +{ + GtkTreeSortable *model = GTK_TREE_SORTABLE(data); + + if (gtk_check_menu_item_get_active(w)) { + gint sortColumn; + gint sortType = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(w), "sort-type")); + gtk_tree_sortable_get_sort_column_id (model, &sortColumn, NULL); + gtk_tree_sortable_set_sort_column_id(model, sortColumn, sortType); + } +} + + +GtkWidget *trg_tree_view_sort_menu(TrgTreeView *tv, const gchar *label) +{ + TrgTreeViewPrivate *priv = TRG_TREE_VIEW_GET_PRIVATE(tv); + GtkWidget *item = gtk_menu_item_new_with_mnemonic(label); + GtkTreeModel *treeViewModel = gtk_tree_view_get_model(GTK_TREE_VIEW(tv)); + GtkTreeSortable *sortableModel = GTK_TREE_SORTABLE(gtk_tree_model_filter_get_model(GTK_TREE_MODEL_FILTER(treeViewModel))); + GtkWidget *menu = gtk_menu_new(); + GtkWidget *b; + GList *li; + gint sort; + GtkSortType sortType; + GSList *group = NULL; + + gtk_tree_sortable_get_sort_column_id(sortableModel, &sort, &sortType); + + b = gtk_radio_menu_item_new_with_label(group, _("Ascending")); + gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(b), sortType == GTK_SORT_ASCENDING); + g_object_set_data(G_OBJECT(b), "sort-type", GINT_TO_POINTER(GTK_SORT_ASCENDING)); + g_signal_connect(b, "toggled", G_CALLBACK(trg_tree_view_sort_menu_type_toggled), sortableModel); + gtk_menu_shell_append(GTK_MENU_SHELL(menu), b); + group = gtk_radio_menu_item_get_group(GTK_RADIO_MENU_ITEM(b)); + b = gtk_radio_menu_item_new_with_label(group, _("Descending")); + gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(b), sortType == GTK_SORT_DESCENDING); + g_object_set_data(G_OBJECT(b), "sort-type", GINT_TO_POINTER(GTK_SORT_DESCENDING)); + g_signal_connect(b, "toggled", G_CALLBACK(trg_tree_view_sort_menu_type_toggled), sortableModel); + gtk_menu_shell_append(GTK_MENU_SHELL(menu), b); + + group = NULL; + + gtk_menu_shell_append(GTK_MENU_SHELL(menu), gtk_separator_menu_item_new()); + + for (li = priv->columns; li; li = g_list_next(li)) { + trg_column_description *desc = + (trg_column_description *) li->data; + if (!(desc->flags & TRG_COLUMN_HIDE_FROM_TOP_MENU)) { + b = gtk_radio_menu_item_new_with_label(group, desc->header); + group = gtk_radio_menu_item_get_group(GTK_RADIO_MENU_ITEM(b)); + + if (desc->model_column == sort) + gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(b), TRUE); + + g_object_set_data(G_OBJECT(b), GDATA_KEY_COLUMN_DESC, desc); + g_signal_connect(b, "toggled", G_CALLBACK(trg_tree_view_sort_menu_item_toggled), sortableModel); + + gtk_menu_shell_append(GTK_MENU_SHELL(menu), b); + } + } + + gtk_menu_item_set_submenu(GTK_MENU_ITEM(item), menu); + + return item; +} + static void view_popup_menu(GtkButton * button, GdkEventButton * event, GtkTreeViewColumn * column) @@ -528,7 +607,7 @@ void trg_tree_view_persist(TrgTreeView * tv, guint flags) } void -trg_tree_view_restore_sort(TrgTreeView * tv, gboolean parentIsSortable) +trg_tree_view_restore_sort(TrgTreeView * tv, guint flags) { JsonObject *props = trg_prefs_get_tree_view_props(tv); GtkTreeModel *model = gtk_tree_view_get_model(GTK_TREE_VIEW(tv)); @@ -540,7 +619,7 @@ trg_tree_view_restore_sort(TrgTreeView * tv, gboolean parentIsSortable) gint64 sort_type = json_object_get_int_member(props, TRG_PREFS_KEY_TV_SORT_TYPE); gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE - (parentIsSortable ? + ((flags & TRG_TREE_VIEW_SORTABLE_PARENT)? gtk_tree_model_filter_get_model (GTK_TREE_MODEL_FILTER (model)) : model), sort_col, -- cgit v1.2.3