diff options
author | John Harper <jsh@eazel.com> | 2001-02-22 02:06:07 +0000 |
---|---|---|
committer | John Harper <jsh@src.gnome.org> | 2001-02-22 02:06:07 +0000 |
commit | a53631deb33df86f2a584a25fbe646185405b4c0 (patch) | |
tree | 1f10fbb213d7448b9470454ec2c2bb669bb50797 | |
parent | 938249acae93466aca754ff4fbc8f7fa1dcaf904 (diff) | |
download | nautilus-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-- | ChangeLog | 27 | ||||
-rw-r--r-- | components/tree/nautilus-tree-view-private.h | 2 | ||||
-rw-r--r-- | components/tree/nautilus-tree-view.c | 26 | ||||
-rw-r--r-- | libnautilus-extensions/nautilus-ctree.c | 41 | ||||
-rw-r--r-- | libnautilus-extensions/nautilus-ctree.h | 2 | ||||
-rw-r--r-- | libnautilus-private/nautilus-ctree.c | 41 | ||||
-rw-r--r-- | libnautilus-private/nautilus-ctree.h | 2 |
7 files changed, 124 insertions, 17 deletions
@@ -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); |