summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2020-07-03 00:35:59 -0400
committerMatthias Clasen <mclasen@redhat.com>2020-07-03 00:35:59 -0400
commit011c0e5fa8218257e6c97b434489a20d2383e511 (patch)
tree01a25329d53a38c5f463466d45799eb89d8e79e7
parent6b7d295cfec59d55deee2132b5c1c98b181802f4 (diff)
downloadgtk+-list-store-sorter.tar.gz
gtk-demo: Avoid a sort model in the settings demolist-store-sorter
This shows how to use a GtkSorter with GListStore.
-rw-r--r--demos/gtk-demo/listview_settings.c48
1 files changed, 42 insertions, 6 deletions
diff --git a/demos/gtk-demo/listview_settings.c b/demos/gtk-demo/listview_settings.c
index 3c0de54d9f..c60f02b5e2 100644
--- a/demos/gtk-demo/listview_settings.c
+++ b/demos/gtk-demo/listview_settings.c
@@ -201,6 +201,46 @@ strvcmp (gconstpointer p1,
static GtkFilter *current_filter;
+static int
+compare_by_sorter (gconstpointer a,
+ gconstpointer b,
+ gpointer data)
+{
+ return gtk_sorter_compare (GTK_SORTER (data), (gpointer)a, (gpointer)b);
+}
+
+static void
+resort (GListStore *store)
+{
+ GtkSorter *sorter;
+
+ g_signal_handlers_block_by_func (store, resort, NULL);
+ sorter = GTK_SORTER (g_object_get_data (G_OBJECT (store), "sorter"));
+ g_list_store_sort (store, compare_by_sorter, sorter);
+ g_signal_handlers_unblock_by_func (store, resort, NULL);
+}
+
+static void
+sorter_changed (GtkSorter *sorter,
+ int change,
+ GListStore *store)
+{
+ if (gtk_sorter_get_order (sorter) != GTK_SORTER_ORDER_NONE)
+ resort (store);
+}
+
+static void
+gtk_list_store_set_sorter (GListStore *store,
+ GtkSorter *sorter)
+{
+ g_object_set_data_full (G_OBJECT (store), "sorter", g_object_ref (sorter), g_object_unref );
+
+ g_signal_connect (store, "items-changed", G_CALLBACK (resort), NULL);
+ g_signal_connect (sorter, "changed", G_CALLBACK (sorter_changed), store);
+
+ resort (store);
+}
+
static gboolean
transform_settings_to_keys (GBinding *binding,
const GValue *from_value,
@@ -211,7 +251,6 @@ transform_settings_to_keys (GBinding *binding,
GSettings *settings;
GSettingsSchema *schema;
GListStore *store;
- GtkSortListModel *sort_model;
GtkFilterListModel *filter_model;
GtkFilter *filter;
GtkNoSelection *selection_model;
@@ -242,16 +281,13 @@ transform_settings_to_keys (GBinding *binding,
g_settings_schema_unref (schema);
g_object_unref (settings);
- sort_model = gtk_sort_list_model_new (G_LIST_MODEL (store),
- gtk_column_view_get_sorter (GTK_COLUMN_VIEW (data)));
- g_object_unref (store);
+ gtk_list_store_set_sorter (store, gtk_column_view_get_sorter (GTK_COLUMN_VIEW (data)));
expression = gtk_property_expression_new (SETTINGS_TYPE_KEY, NULL, "name");
filter = gtk_string_filter_new ();
gtk_string_filter_set_expression (GTK_STRING_FILTER (filter), expression);
- filter_model = gtk_filter_list_model_new (G_LIST_MODEL (sort_model), filter);
+ filter_model = gtk_filter_list_model_new (G_LIST_MODEL (store), filter);
gtk_expression_unref (expression);
- g_object_unref (sort_model);
g_set_object (&current_filter, filter);