From 834a3f2151dd8738a1f878489f6207664c4af5aa Mon Sep 17 00:00:00 2001 From: Benjamin Barenblat Date: Sun, 14 Jul 2013 17:14:53 -0700 Subject: Imported Upstream version 1.1.1 --- src/trg-sortable-filtered-model.c | 202 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 202 insertions(+) create mode 100644 src/trg-sortable-filtered-model.c (limited to 'src/trg-sortable-filtered-model.c') diff --git a/src/trg-sortable-filtered-model.c b/src/trg-sortable-filtered-model.c new file mode 100644 index 0000000..9db1827 --- /dev/null +++ b/src/trg-sortable-filtered-model.c @@ -0,0 +1,202 @@ +/* + * transmission-remote-gtk - A GTK RPC client to Transmission + * Copyright (C) 2011-2013 Alan Fitton + + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#include + +#include "trg-sortable-filtered-model.h" + +/* This class extends GtkTreeModelFilter, so it can implement the + * GtkTreeSortable interface. All of the sortable functions are passed on to + * a child GtkTreeModelSort. Also proxy the sort-column-changed signal + * so that a TreeViewColumn can track changes for indicators. + */ + +static void +trg_sortable_filtered_model_tree_sortable_init(GtkTreeSortableIface * + iface); + +/* TreeSortable interface */ +static GtkTreeSortable + * trg_sortable_filtered_model_get_real_sortable(GtkTreeSortable * + sortable); +static gboolean +trg_sortable_filtered_model_sort_get_sort_column_id(GtkTreeSortable * + sortable, + gint * sort_column_id, + GtkSortType * order); +static void +trg_sortable_filtered_model_sort_set_sort_column_id(GtkTreeSortable * + sortable, + gint sort_column_id, + GtkSortType order); +static void trg_sortable_filtered_model_sort_set_sort_func(GtkTreeSortable + * sortable, + gint + sort_column_id, + GtkTreeIterCompareFunc + func, + gpointer data, + GDestroyNotify + destroy); +static void +trg_sortable_filtered_model_sort_set_default_sort_func(GtkTreeSortable * + sortable, + GtkTreeIterCompareFunc + func, gpointer data, + GDestroyNotify + destroy); +static gboolean +trg_sortable_filtered_model_sort_has_default_sort_func(GtkTreeSortable * + sortable); +static void trg_sortable_filtered_model_sort_column_changed(GtkTreeSortable + * realSortable, + GtkTreeSortable + * + fakeSortable); + +G_DEFINE_TYPE_WITH_CODE(TrgSortableFilteredModel, + trg_sortable_filtered_model, + GTK_TYPE_TREE_MODEL_FILTER, + G_IMPLEMENT_INTERFACE(GTK_TYPE_TREE_SORTABLE, + trg_sortable_filtered_model_tree_sortable_init)) +static void +trg_sortable_filtered_model_class_init(TrgSortableFilteredModelClass * + klass) +{ +} + +static void +trg_sortable_filtered_model_init(TrgSortableFilteredModel * self) +{ +} + +static void +trg_sortable_filtered_model_tree_sortable_init(GtkTreeSortableIface * + iface) +{ + iface->get_sort_column_id = + trg_sortable_filtered_model_sort_get_sort_column_id; + iface->set_sort_column_id = + trg_sortable_filtered_model_sort_set_sort_column_id; + iface->set_sort_func = trg_sortable_filtered_model_sort_set_sort_func; + iface->set_default_sort_func = + trg_sortable_filtered_model_sort_set_default_sort_func; + iface->has_default_sort_func = + trg_sortable_filtered_model_sort_has_default_sort_func; +} + +static void +trg_sortable_filtered_model_sort_column_changed(GtkTreeSortable + * + realSortable + G_GNUC_UNUSED, + GtkTreeSortable + * fakeSortable) +{ + g_signal_emit_by_name(fakeSortable, "sort-column-changed"); +} + +GtkTreeModel *trg_sortable_filtered_model_new(GtkTreeSortable * + child_model, + GtkTreePath * root) +{ + GObject *obj = g_object_new(TRG_TYPE_SORTABLE_FILTERED_MODEL, + "child-model", GTK_TREE_MODEL(child_model), + "virtual-root", root, + NULL); + + g_signal_connect(child_model, "sort-column-changed", + G_CALLBACK + (trg_sortable_filtered_model_sort_column_changed), + obj); + + return GTK_TREE_MODEL(obj); +} + +static GtkTreeSortable + * trg_sortable_filtered_model_get_real_sortable(GtkTreeSortable * + sortable) +{ + return + GTK_TREE_SORTABLE(gtk_tree_model_filter_get_model + (GTK_TREE_MODEL_FILTER(sortable))); +} + +static gboolean +trg_sortable_filtered_model_sort_get_sort_column_id(GtkTreeSortable * + sortable, + gint * sort_column_id, + GtkSortType * order) +{ + GtkTreeSortable *realSortable = + trg_sortable_filtered_model_get_real_sortable(sortable); + return gtk_tree_sortable_get_sort_column_id(realSortable, + sort_column_id, order); +} + +static void +trg_sortable_filtered_model_sort_set_sort_column_id(GtkTreeSortable * + sortable, + gint sort_column_id, + GtkSortType order) +{ + GtkTreeSortable *realSortable = + trg_sortable_filtered_model_get_real_sortable(sortable); + gtk_tree_sortable_set_sort_column_id(realSortable, sort_column_id, + order); +} + +static void +trg_sortable_filtered_model_sort_set_sort_func(GtkTreeSortable + * sortable, + gint + sort_column_id, + GtkTreeIterCompareFunc + func, + gpointer data, + GDestroyNotify destroy) +{ + GtkTreeSortable *realSortable = + trg_sortable_filtered_model_get_real_sortable(sortable); + gtk_tree_sortable_set_sort_func(realSortable, sort_column_id, func, + data, destroy); +} + +static void +trg_sortable_filtered_model_sort_set_default_sort_func(GtkTreeSortable * + sortable, + GtkTreeIterCompareFunc + func, gpointer data, + GDestroyNotify + destroy) +{ + GtkTreeSortable *realSortable = + trg_sortable_filtered_model_get_real_sortable(sortable); + gtk_tree_sortable_set_default_sort_func(realSortable, func, data, + destroy); +} + +static gboolean +trg_sortable_filtered_model_sort_has_default_sort_func(GtkTreeSortable * + sortable) +{ + GtkTreeSortable *realSortable = + trg_sortable_filtered_model_get_real_sortable(sortable); + return gtk_tree_sortable_has_default_sort_func(realSortable); +} -- cgit v1.2.3