[gtk+] When the filter removes a node, it needs to remove its children too



commit 0c4f29e85767154382cf2a46d3faa6b0ab742aa8
Author: Kristian Rietveld <kris gtk org>
Date:   Sat Sep 5 16:12:48 2009 +0200

    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 files changed, 14 insertions(+), 4 deletions(-)
---
diff --git a/gtk/gtktreemodelfilter.c b/gtk/gtktreemodelfilter.c
index 1c20a0b..1036636 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;



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]