From 0c4f29e85767154382cf2a46d3faa6b0ab742aa8 Mon Sep 17 00:00:00 2001 From: Kristian Rietveld Date: Sat, 5 Sep 2009 16:12:48 +0200 Subject: [PATCH] When the filter removes a node, it needs to remove its children too In gtk_tree_model_filter_remove_node(), we check if the given elt has children. If so, this level will be freed. This action is recursive. --- gtk/gtktreemodelfilter.c | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/gtk/gtktreemodelfilter.c b/gtk/gtktreemodelfilter.c index 1c20a0b8d..103663606 100644 --- a/gtk/gtktreemodelfilter.c +++ b/gtk/gtktreemodelfilter.c @@ -1008,9 +1008,13 @@ gtk_tree_model_filter_remove_node (GtkTreeModelFilter *filter, GtkTreePath *path; FilterElt *tmp; - /* we emit row-deleted, and remove the node from the cache. + /* We emit row-deleted, and remove the node from the cache. + * If it has any children, these will be removed here as well. */ + if (elt->children) + gtk_tree_model_filter_free_level (filter, elt->children); + path = gtk_tree_model_get_path (GTK_TREE_MODEL (filter), iter); elt->visible = FALSE; gtk_tree_model_filter_increment_stamp (filter); @@ -1052,10 +1056,16 @@ gtk_tree_model_filter_remove_node (GtkTreeModelFilter *filter, { GtkTreePath *path; - /* we emit row-deleted, but keep the node in the cache and - * referenced. + /* We emit row-deleted, but keep the node in the cache and + * referenced. Its children will be removed. */ + if (elt->children) + { + gtk_tree_model_filter_free_level (filter, elt->children); + elt->children = NULL; + } + path = gtk_tree_model_get_path (GTK_TREE_MODEL (filter), iter); elt->visible = FALSE; gtk_tree_model_filter_increment_stamp (filter); @@ -1066,7 +1076,7 @@ gtk_tree_model_filter_remove_node (GtkTreeModelFilter *filter, { GtkTreePath *path; - /* blow level away */ + /* Blow level away, including any child levels */ path = gtk_tree_model_get_path (GTK_TREE_MODEL (filter), iter); elt->visible = FALSE;