diff options
author | Kristian Rietveld <kris@gtk.org> | 2002-02-15 18:38:02 +0000 |
---|---|---|
committer | Kristian Rietveld <kristian@src.gnome.org> | 2002-02-15 18:38:02 +0000 |
commit | baf21fbfa2cfacad32b1bf593ce81927f2ba7836 (patch) | |
tree | 5f1dd665d615c47f2dfb10a508d2363e61ee33a9 /gtk | |
parent | d7f8af9af0e0e0364c03a7c42a593a0d3cac2e27 (diff) | |
download | gtk+-baf21fbfa2cfacad32b1bf593ce81927f2ba7836.tar.gz |
new function (gtk_tree_store_clear): traverse the tree, so we emit
Fri Feb 15 19:38:00 2002 Kristian Rietveld <kris@gtk.org>
* gtk/gtktreestore.c (gtk_tree_store_clear_traverse): new function
(gtk_tree_store_clear): traverse the tree, so we emit row_deleted
for every node. This way we don't have confused row refs crashing the
application. (#70631)
Diffstat (limited to 'gtk')
-rw-r--r-- | gtk/gtktreestore.c | 50 |
1 files changed, 42 insertions, 8 deletions
diff --git a/gtk/gtktreestore.c b/gtk/gtktreestore.c index ebe1e6a8dc..c4497be735 100644 --- a/gtk/gtktreestore.c +++ b/gtk/gtktreestore.c @@ -1423,6 +1423,47 @@ gtk_tree_store_iter_depth (GtkTreeStore *tree_store, return g_node_depth (G_NODE (iter->user_data)) - 2; } +/* simple ripoff from g_node_traverse_post_order */ +static gboolean +gtk_tree_store_clear_traverse (GNode *node, + GtkTreeStore *store) +{ + GtkTreeIter iter; + + if (node->children) + { + GNode *child; + + child = node->children; + while (child) + { + register GNode *current; + + current = child; + child = current->next; + if (gtk_tree_store_clear_traverse (current, store)) + return TRUE; + } + + if (node->parent) + { + iter.stamp = store->stamp; + iter.user_data = node; + + gtk_tree_store_remove (store, &iter); + } + } + else if (node->parent) + { + iter.stamp = store->stamp; + iter.user_data = node; + + gtk_tree_store_remove (store, &iter); + } + + return FALSE; +} + /** * gtk_tree_store_clear: * @tree_store: a #GtkTreeStore @@ -1432,16 +1473,9 @@ gtk_tree_store_iter_depth (GtkTreeStore *tree_store, void gtk_tree_store_clear (GtkTreeStore *tree_store) { - GtkTreeIter iter; - g_return_if_fail (GTK_IS_TREE_STORE (tree_store)); - while (G_NODE (tree_store->root)->children) - { - iter.stamp = tree_store->stamp; - iter.user_data = G_NODE (tree_store->root)->children; - gtk_tree_store_remove (tree_store, &iter); - } + gtk_tree_store_clear_traverse (tree_store->root, tree_store); } /* DND */ |