summaryrefslogtreecommitdiff
path: root/src/trg-tree-view.c
diff options
context:
space:
mode:
authorGravatar Alan Fitton <ajf@eth0.org.uk>2012-08-26 11:42:39 +0100
committerGravatar Alan Fitton <ajf@eth0.org.uk>2012-08-26 11:42:39 +0100
commit8cc810e1fbf069f808cfe3e9598273b2f3dd8aab (patch)
tree317c17d3b95daaba04ac655b76010f2e8207e504 /src/trg-tree-view.c
parenta666f9ee1d3e3859712111d84d0cd5275179d696 (diff)
add a menu for changing sort, useful when there are no column headers in Transmission style
Diffstat (limited to 'src/trg-tree-view.c')
-rw-r--r--src/trg-tree-view.c85
1 files changed, 82 insertions, 3 deletions
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,