summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Larsson <alexl@redhat.com>2008-02-19 13:25:50 +0000
committerAlexander Larsson <alexl@src.gnome.org>2008-02-19 13:25:50 +0000
commit589a9ea91a1cc513ad1cf9a79d562f929b7dfaf7 (patch)
treebf58a62af9396fc17ccb655544280a28bc0ae0f0
parent69a8b94268cddf4c7d7511804ebbbcf40e0297b4 (diff)
downloadnautilus-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--ChangeLog11
-rw-r--r--src/file-manager/fm-tree-model.c41
-rw-r--r--src/file-manager/fm-tree-model.h3
-rw-r--r--src/file-manager/fm-tree-view.c6
4 files changed, 55 insertions, 6 deletions
diff --git a/ChangeLog b/ChangeLog
index 89952b707..3e8bdc4c0 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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);