diff options
author | Alexander Larsson <alexl@redhat.com> | 2008-02-19 13:25:50 +0000 |
---|---|---|
committer | Alexander Larsson <alexl@src.gnome.org> | 2008-02-19 13:25:50 +0000 |
commit | 589a9ea91a1cc513ad1cf9a79d562f929b7dfaf7 (patch) | |
tree | bf58a62af9396fc17ccb655544280a28bc0ae0f0 | |
parent | 69a8b94268cddf4c7d7511804ebbbcf40e0297b4 (diff) | |
download | nautilus-589a9ea91a1cc513ad1cf9a79d562f929b7dfaf7.tar.gz |
Add fm_tree_model_iter_compare_roots to compare roots Report dummy rows
2008-02-19 Alexander Larsson <alexl@redhat.com>
* src/file-manager/fm-tree-model.[ch]:
Add fm_tree_model_iter_compare_roots to compare roots
Report dummy rows added before reporting has_child_toggled.
* src/file-manager/fm-tree-view.c:
(compare_rows):
Use fm_tree_model_iter_compare_roots when comparing roots
to force a stable sort, because GtkTreeModelSort isn't stable.
svn path=/trunk/; revision=13773
-rw-r--r-- | ChangeLog | 11 | ||||
-rw-r--r-- | src/file-manager/fm-tree-model.c | 41 | ||||
-rw-r--r-- | src/file-manager/fm-tree-model.h | 3 | ||||
-rw-r--r-- | src/file-manager/fm-tree-view.c | 6 |
4 files changed, 55 insertions, 6 deletions
@@ -1,3 +1,14 @@ +2008-02-19 Alexander Larsson <alexl@redhat.com> + + * src/file-manager/fm-tree-model.[ch]: + Add fm_tree_model_iter_compare_roots to compare roots + Report dummy rows added before reporting has_child_toggled. + + * src/file-manager/fm-tree-view.c: + (compare_rows): + Use fm_tree_model_iter_compare_roots when comparing roots + to force a stable sort, because GtkTreeModelSort isn't stable. + 2008-02-19 Cosimo Cecchi <cosimoc@gnome.org> * libnautilus-private/nautilus-file-operations.c: diff --git a/src/file-manager/fm-tree-model.c b/src/file-manager/fm-tree-model.c index 5af7bc9c3..f76449cc3 100644 --- a/src/file-manager/fm-tree-model.c +++ b/src/file-manager/fm-tree-model.c @@ -667,12 +667,13 @@ report_node_inserted (FMTreeModel *model, TreeNode *node) report_row_inserted (model, &iter); node->inserted = TRUE; + if (tree_node_has_dummy_child (node)) { + report_dummy_row_inserted (model, node); + } + if (node->directory != NULL || node->parent == NULL) { report_row_has_child_toggled (model, &iter); - } - if (tree_node_has_dummy_child (node)) { - report_dummy_row_inserted (model, node); } } @@ -1767,6 +1768,40 @@ fm_tree_model_iter_get_file (FMTreeModel *model, GtkTreeIter *iter) return node == NULL ? NULL : nautilus_file_ref (node->file); } +/* This is used to work around some sort order stability problems + with gtktreemodelsort */ +int +fm_tree_model_iter_compare_roots (FMTreeModel *model, + GtkTreeIter *iter_a, + GtkTreeIter *iter_b) +{ + TreeNode *a, *b, *n; + + g_return_val_if_fail (FM_IS_TREE_MODEL (model), 0); + g_return_val_if_fail (iter_is_valid (model, iter_a), 0); + g_return_val_if_fail (iter_is_valid (model, iter_b), 0); + + a = iter_a->user_data; + b = iter_b->user_data; + + g_assert (a != NULL && a->parent == NULL); + g_assert (b != NULL && b->parent == NULL); + + if (a == b) { + return 0; + } + + for (n = model->details->root_node; n != NULL; n = n->next) { + if (n == a) { + return -1; + } + if (n == b) { + return 1; + } + } + g_assert_not_reached (); +} + gboolean fm_tree_model_iter_is_root (FMTreeModel *model, GtkTreeIter *iter) { diff --git a/src/file-manager/fm-tree-model.h b/src/file-manager/fm-tree-model.h index 724bfd862..b3baca898 100644 --- a/src/file-manager/fm-tree-model.h +++ b/src/file-manager/fm-tree-model.h @@ -81,6 +81,9 @@ void fm_tree_model_remove_root_uri (FMTreeModel *model, const char *root_uri); gboolean fm_tree_model_iter_is_root (FMTreeModel *model, GtkTreeIter *iter); +int fm_tree_model_iter_compare_roots (FMTreeModel *model, + GtkTreeIter *iter_a, + GtkTreeIter *iter_b); gboolean fm_tree_model_file_get_iter (FMTreeModel *model, GtkTreeIter *iter, NautilusFile *file, diff --git a/src/file-manager/fm-tree-view.c b/src/file-manager/fm-tree-view.c index 6f46ffec2..b0cf32385 100644 --- a/src/file-manager/fm-tree-view.c +++ b/src/file-manager/fm-tree-view.c @@ -507,9 +507,9 @@ compare_rows (GtkTreeModel *model, GtkTreeIter *a, GtkTreeIter *b, gpointer call } /* don't sort root nodes */ - if (fm_tree_model_iter_is_root (FM_TREE_MODEL (model), a) - || fm_tree_model_iter_is_root (FM_TREE_MODEL (model), b)) { - return 0; + if (fm_tree_model_iter_is_root (FM_TREE_MODEL (model), a) && + fm_tree_model_iter_is_root (FM_TREE_MODEL (model), b)) { + return fm_tree_model_iter_compare_roots (FM_TREE_MODEL (model), a, b); } file_a = fm_tree_model_iter_get_file (FM_TREE_MODEL (model), a); |