summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Harper <jsh@eazel.com>2001-02-22 02:06:07 +0000
committerJohn Harper <jsh@src.gnome.org>2001-02-22 02:06:07 +0000
commita53631deb33df86f2a584a25fbe646185405b4c0 (patch)
tree1f10fbb213d7448b9470454ec2c2bb669bb50797
parent938249acae93466aca754ff4fbc8f7fa1dcaf904 (diff)
downloadnautilus-a53631deb33df86f2a584a25fbe646185405b4c0.tar.gz
reviewed by: Darin Adler <darin@eazel.com>
2001-02-21 John Harper <jsh@eazel.com> reviewed by: Darin Adler <darin@eazel.com> Fixed bug I introduced in my last sorting change (sort order was incorrect when nodes are first inserted): * components/tree/nautilus-tree-view-private.h: added an `inserting_node' flag field to the view details. This is used to tell the sorting comparison function when the nodes it's trying to sort haven't yet been fully initialized * components/tree/nautilus-tree-view.c (nautilus_tree_view_insert_model_node): set the inserting_node flag around the call to nautilus_ctree_insert_node (). After the node is fully initialized, call nautilus_ctree_sort_single_node () (ctree_compare_rows): when `inserting_node' is set, bail out with a nonsense value * libnautilus-extensions/nautilus-ctree.h, libnautilus-extensions/nautilus-ctree.c: reverted the change to insert_node (nautilus_ctree_sort_single_node): new function, reorders a given node, but no others
-rw-r--r--ChangeLog27
-rw-r--r--components/tree/nautilus-tree-view-private.h2
-rw-r--r--components/tree/nautilus-tree-view.c26
-rw-r--r--libnautilus-extensions/nautilus-ctree.c41
-rw-r--r--libnautilus-extensions/nautilus-ctree.h2
-rw-r--r--libnautilus-private/nautilus-ctree.c41
-rw-r--r--libnautilus-private/nautilus-ctree.h2
7 files changed, 124 insertions, 17 deletions
diff --git a/ChangeLog b/ChangeLog
index dc6f0ee87..7a12e4680 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,30 @@
+2001-02-21 John Harper <jsh@eazel.com>
+
+ reviewed by: Darin Adler <darin@eazel.com>
+
+ Fixed bug I introduced in my last sorting change (sort order
+ was incorrect when nodes are first inserted):
+
+ * components/tree/nautilus-tree-view-private.h: added an
+ `inserting_node' flag field to the view details. This is used
+ to tell the sorting comparison function when the nodes it's
+ trying to sort haven't yet been fully initialized
+
+ * components/tree/nautilus-tree-view.c
+ (nautilus_tree_view_insert_model_node): set the inserting_node
+ flag around the call to nautilus_ctree_insert_node (). After
+ the node is fully initialized, call
+ nautilus_ctree_sort_single_node ()
+
+ (ctree_compare_rows): when `inserting_node' is set, bail out
+ with a nonsense value
+
+ * libnautilus-extensions/nautilus-ctree.h,
+ libnautilus-extensions/nautilus-ctree.c: reverted the change to
+ insert_node
+ (nautilus_ctree_sort_single_node): new function, reorders a
+ given node, but no others
+
2001-02-21 Darin Adler <darin@eazel.com>
reviewed by: Pavel Cisler <pavel@eazel.com>
diff --git a/components/tree/nautilus-tree-view-private.h b/components/tree/nautilus-tree-view-private.h
index a7c6b7e73..c2ac05ff2 100644
--- a/components/tree/nautilus-tree-view-private.h
+++ b/components/tree/nautilus-tree-view-private.h
@@ -76,6 +76,8 @@ struct NautilusTreeViewDetails {
gboolean got_first_size_allocate;
+ gboolean inserting_node;
+
NautilusFile *activation_uri_wait_file;
NautilusTreeViewDndDetails *dnd;
diff --git a/components/tree/nautilus-tree-view.c b/components/tree/nautilus-tree-view.c
index 5addab5f8..505515903 100644
--- a/components/tree/nautilus-tree-view.c
+++ b/components/tree/nautilus-tree-view.c
@@ -275,6 +275,7 @@ nautilus_tree_view_insert_model_node (NautilusTreeView *view, NautilusTreeNode *
&open_mask);
+ view->details->inserting_node = TRUE;
view_node = nautilus_ctree_insert_node (NAUTILUS_CTREE (view->details->tree),
parent_view_node,
NULL,
@@ -283,6 +284,8 @@ nautilus_tree_view_insert_model_node (NautilusTreeView *view, NautilusTreeNode *
closed_pixmap, closed_mask, open_pixmap, open_mask,
! nautilus_file_is_directory (file),
FALSE);
+ view->details->inserting_node = FALSE;
+
gdk_pixmap_unref (closed_pixmap);
gdk_pixmap_unref (open_pixmap);
if (closed_mask != NULL) {
@@ -320,6 +323,8 @@ nautilus_tree_view_insert_model_node (NautilusTreeView *view, NautilusTreeNode *
}
}
+ nautilus_ctree_sort_single_node (NAUTILUS_CTREE (view->details->tree), view_node);
+
insert_unparented_nodes (view, node);
} else {
nautilus_tree_view_update_model_node (view, node);
@@ -819,18 +824,29 @@ ctree_compare_rows (GtkCList *clist,
{
NautilusTreeView *view;
NautilusFile *file1, *file2;
+ gint result;
+
+ /* Default to returning -1 in unknown cases. This magically
+ * ensures that inserted nodes are initially placed at the
+ * head of the list, instead of wasting time comparing
+ * against all files for no reason (makes expanding /dev/
+ * actually bearable)
+ */
+ result = -1;
view = gtk_object_get_data (GTK_OBJECT (clist), "tree_view");
g_assert (view != NULL);
- file1 = nautilus_tree_view_node_to_file (view, nautilus_ctree_find_node_ptr (NAUTILUS_CTREE (view->details->tree), (NautilusCTreeRow *) ptr1));
- file2 = nautilus_tree_view_node_to_file (view, nautilus_ctree_find_node_ptr (NAUTILUS_CTREE (view->details->tree), (NautilusCTreeRow *) ptr2));
+ if (!view->details->inserting_node) {
+ file1 = nautilus_tree_view_node_to_file (view, nautilus_ctree_find_node_ptr (NAUTILUS_CTREE (view->details->tree), (NautilusCTreeRow *) ptr1));
+ file2 = nautilus_tree_view_node_to_file (view, nautilus_ctree_find_node_ptr (NAUTILUS_CTREE (view->details->tree), (NautilusCTreeRow *) ptr2));
- if (file1 == NULL || file2 == NULL) {
- return 0;
+ if (file1 != NULL && file2 != NULL) {
+ result = nautilus_file_compare_for_sort (file1, file2, NAUTILUS_FILE_SORT_BY_NAME);
+ }
}
- return nautilus_file_compare_for_sort (file1, file2, NAUTILUS_FILE_SORT_BY_NAME);
+ return result;
}
static void
diff --git a/libnautilus-extensions/nautilus-ctree.c b/libnautilus-extensions/nautilus-ctree.c
index 39e2cc2f6..a874f4791 100644
--- a/libnautilus-extensions/nautilus-ctree.c
+++ b/libnautilus-extensions/nautilus-ctree.c
@@ -3818,8 +3818,6 @@ nautilus_ctree_insert_node (NautilusCTree *ctree,
text[ctree->tree_column] : NULL, spacing, pixmap_closed,
mask_closed, pixmap_opened, mask_opened, is_leaf, expanded);
- nautilus_ctree_link (ctree, node, parent, sibling, TRUE);
-
/* sorted insertion */
if (GTK_CLIST_AUTO_SORT (clist))
{
@@ -3828,14 +3826,14 @@ nautilus_ctree_insert_node (NautilusCTree *ctree,
else
sibling = NAUTILUS_CTREE_NODE (clist->row_list);
- while (sibling
- && (sibling == node || clist->compare (clist, NAUTILUS_CTREE_ROW (node), NAUTILUS_CTREE_ROW (sibling)) > 0))
+ while (sibling && clist->compare
+ (clist, NAUTILUS_CTREE_ROW (node), NAUTILUS_CTREE_ROW (sibling)) > 0)
sibling = NAUTILUS_CTREE_ROW (sibling)->sibling;
- nautilus_ctree_unlink (ctree, node, TRUE);
- nautilus_ctree_link (ctree, node, parent, sibling, TRUE);
}
+ nautilus_ctree_link (ctree, node, parent, sibling, TRUE);
+
if (text && !GTK_CLIST_AUTO_RESIZE_BLOCKED (clist) &&
nautilus_ctree_is_viewable (ctree, node))
{
@@ -5685,6 +5683,37 @@ nautilus_ctree_sort_node (NautilusCTree *ctree,
gtk_clist_thaw (clist);
}
+void
+nautilus_ctree_sort_single_node (NautilusCTree *ctree,
+ NautilusCTreeNode *node)
+{
+ NautilusCTreeNode *sibling, *parent;
+ GtkCList *clist;
+
+ clist = GTK_CLIST (ctree);
+
+ gtk_clist_freeze (clist);
+
+ if (GTK_CLIST_AUTO_SORT (clist))
+ {
+ parent = NAUTILUS_CTREE_ROW (node)->parent;
+
+ if (parent)
+ sibling = NAUTILUS_CTREE_ROW (parent)->children;
+ else
+ sibling = NAUTILUS_CTREE_NODE (clist->row_list);
+
+ while (sibling
+ && (sibling == node || clist->compare (clist, NAUTILUS_CTREE_ROW (node), NAUTILUS_CTREE_ROW (sibling)) > 0))
+ sibling = NAUTILUS_CTREE_ROW (sibling)->sibling;
+
+ nautilus_ctree_unlink (ctree, node, TRUE);
+ nautilus_ctree_link (ctree, node, parent, sibling, TRUE);
+ }
+
+ gtk_clist_thaw (clist);
+}
+
/************************************************************************/
static void
diff --git a/libnautilus-extensions/nautilus-ctree.h b/libnautilus-extensions/nautilus-ctree.h
index 1802b3c34..01ec63bf7 100644
--- a/libnautilus-extensions/nautilus-ctree.h
+++ b/libnautilus-extensions/nautilus-ctree.h
@@ -436,6 +436,8 @@ void nautilus_ctree_set_drag_compare_func (NautilusCTree *ctree,
void nautilus_ctree_sort_node (NautilusCTree *ctree,
NautilusCTreeNode *node);
+void nautilus_ctree_sort_single_node (NautilusCTree *ctree,
+ NautilusCTreeNode *node);
void nautilus_ctree_sort_recursive (NautilusCTree *ctree,
NautilusCTreeNode *node);
diff --git a/libnautilus-private/nautilus-ctree.c b/libnautilus-private/nautilus-ctree.c
index 39e2cc2f6..a874f4791 100644
--- a/libnautilus-private/nautilus-ctree.c
+++ b/libnautilus-private/nautilus-ctree.c
@@ -3818,8 +3818,6 @@ nautilus_ctree_insert_node (NautilusCTree *ctree,
text[ctree->tree_column] : NULL, spacing, pixmap_closed,
mask_closed, pixmap_opened, mask_opened, is_leaf, expanded);
- nautilus_ctree_link (ctree, node, parent, sibling, TRUE);
-
/* sorted insertion */
if (GTK_CLIST_AUTO_SORT (clist))
{
@@ -3828,14 +3826,14 @@ nautilus_ctree_insert_node (NautilusCTree *ctree,
else
sibling = NAUTILUS_CTREE_NODE (clist->row_list);
- while (sibling
- && (sibling == node || clist->compare (clist, NAUTILUS_CTREE_ROW (node), NAUTILUS_CTREE_ROW (sibling)) > 0))
+ while (sibling && clist->compare
+ (clist, NAUTILUS_CTREE_ROW (node), NAUTILUS_CTREE_ROW (sibling)) > 0)
sibling = NAUTILUS_CTREE_ROW (sibling)->sibling;
- nautilus_ctree_unlink (ctree, node, TRUE);
- nautilus_ctree_link (ctree, node, parent, sibling, TRUE);
}
+ nautilus_ctree_link (ctree, node, parent, sibling, TRUE);
+
if (text && !GTK_CLIST_AUTO_RESIZE_BLOCKED (clist) &&
nautilus_ctree_is_viewable (ctree, node))
{
@@ -5685,6 +5683,37 @@ nautilus_ctree_sort_node (NautilusCTree *ctree,
gtk_clist_thaw (clist);
}
+void
+nautilus_ctree_sort_single_node (NautilusCTree *ctree,
+ NautilusCTreeNode *node)
+{
+ NautilusCTreeNode *sibling, *parent;
+ GtkCList *clist;
+
+ clist = GTK_CLIST (ctree);
+
+ gtk_clist_freeze (clist);
+
+ if (GTK_CLIST_AUTO_SORT (clist))
+ {
+ parent = NAUTILUS_CTREE_ROW (node)->parent;
+
+ if (parent)
+ sibling = NAUTILUS_CTREE_ROW (parent)->children;
+ else
+ sibling = NAUTILUS_CTREE_NODE (clist->row_list);
+
+ while (sibling
+ && (sibling == node || clist->compare (clist, NAUTILUS_CTREE_ROW (node), NAUTILUS_CTREE_ROW (sibling)) > 0))
+ sibling = NAUTILUS_CTREE_ROW (sibling)->sibling;
+
+ nautilus_ctree_unlink (ctree, node, TRUE);
+ nautilus_ctree_link (ctree, node, parent, sibling, TRUE);
+ }
+
+ gtk_clist_thaw (clist);
+}
+
/************************************************************************/
static void
diff --git a/libnautilus-private/nautilus-ctree.h b/libnautilus-private/nautilus-ctree.h
index 1802b3c34..01ec63bf7 100644
--- a/libnautilus-private/nautilus-ctree.h
+++ b/libnautilus-private/nautilus-ctree.h
@@ -436,6 +436,8 @@ void nautilus_ctree_set_drag_compare_func (NautilusCTree *ctree,
void nautilus_ctree_sort_node (NautilusCTree *ctree,
NautilusCTreeNode *node);
+void nautilus_ctree_sort_single_node (NautilusCTree *ctree,
+ NautilusCTreeNode *node);
void nautilus_ctree_sort_recursive (NautilusCTree *ctree,
NautilusCTreeNode *node);