summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2018-01-19 16:02:42 +0100
committerMatthias Clasen <mclasen@redhat.com>2018-01-19 23:29:13 +0300
commitf942d6f53cbbefd53afa03dd1e9492f690e68ea2 (patch)
tree58758bc4114ed1d7fc99cee83b34ef162c7f71b3
parent7d9af6d700a56f5f6c5858a64b1bf98bbea4757a (diff)
downloadgtk+-f942d6f53cbbefd53afa03dd1e9492f690e68ea2.tar.gz
Add a test for ::row-changed vs node refs
Test that filter models propagate ::row-changed if there is an external reference on the node, and not otherwise. This is showing up in buggy icon view behaviour, where the icon view is not redrawing if the content changes in a model that is below a filter model.
-rw-r--r--testsuite/gtk/filtermodel.c71
1 files changed, 71 insertions, 0 deletions
diff --git a/testsuite/gtk/filtermodel.c b/testsuite/gtk/filtermodel.c
index c54430b53b..ce0defacf5 100644
--- a/testsuite/gtk/filtermodel.c
+++ b/testsuite/gtk/filtermodel.c
@@ -6755,6 +6755,75 @@ specific_bug_679910 (void)
g_object_unref (store);
}
+static int row_changed_count;
+static int filter_row_changed_count;
+
+static void
+row_changed (GtkTreeModel *model,
+ GtkTreePath *path,
+ GtkTreeIter *iter,
+ gpointer data)
+{
+ int *count = data;
+
+ (*count)++;
+}
+
+static void
+test_row_changed (void)
+{
+ GtkTreeModel *filter;
+ GtkListStore *store;
+ GtkTreeIter iter1, iter2, iter3;
+ GtkTreeIter fiter1, fiter2, fiter3;
+
+ store = gtk_list_store_new (1, G_TYPE_INT);
+ filter = gtk_tree_model_filter_new (GTK_TREE_MODEL (store), NULL);
+
+ gtk_list_store_append (store, &iter1);
+ gtk_list_store_append (store, &iter2);
+ gtk_list_store_append (store, &iter3);
+
+ gtk_tree_model_filter_convert_child_iter_to_iter (GTK_TREE_MODEL_FILTER (filter), &fiter1, &iter1);
+ gtk_tree_model_filter_convert_child_iter_to_iter (GTK_TREE_MODEL_FILTER (filter), &fiter2, &iter2);
+ gtk_tree_model_filter_convert_child_iter_to_iter (GTK_TREE_MODEL_FILTER (filter), &fiter3, &iter3);
+
+ g_signal_connect (store, "row-changed", G_CALLBACK (row_changed), &row_changed_count);
+ g_signal_connect (filter, "row-changed", G_CALLBACK (row_changed), &filter_row_changed_count);
+
+ row_changed_count = 0;
+ filter_row_changed_count = 0;
+
+ gtk_list_store_set (store, &iter1, 0, 1, -1);
+ gtk_list_store_set (store, &iter2, 0, 1, -1);
+ gtk_list_store_set (store, &iter3, 0, 1, -1);
+
+ g_assert (row_changed_count == 3);
+ g_assert (filter_row_changed_count == 0);
+
+ row_changed_count = 0;
+ filter_row_changed_count = 0;
+
+ gtk_tree_model_ref_node (filter, &fiter1);
+ gtk_tree_model_ref_node (filter, &fiter2);
+ gtk_tree_model_ref_node (filter, &fiter3);
+
+ gtk_list_store_set (store, &iter1, 0, 2, -1);
+ gtk_list_store_set (store, &iter2, 0, 2, -1);
+ gtk_list_store_set (store, &iter3, 0, 2, -1);
+
+ g_assert (row_changed_count == 3);
+ g_assert (filter_row_changed_count == 3);
+
+ gtk_tree_model_unref_node (filter, &fiter1);
+ gtk_tree_model_unref_node (filter, &fiter2);
+ gtk_tree_model_unref_node (filter, &fiter3);
+
+ g_object_unref (filter);
+ g_object_unref (store);
+}
+
+
/* main */
void
@@ -7116,4 +7185,6 @@ register_filter_model_tests (void)
specific_bug_659022_row_deleted_free_level);
g_test_add_func ("/TreeModelFilter/specific/bug-679910",
specific_bug_679910);
+
+ g_test_add_func ("/TreeModelFilter/signal/row-changed", test_row_changed);
}