[nautilus/wip/corey/fix-sort: 2/9] general: Sort NautilusFile's directly rather than through a dummy item




commit abe9618425d6c22f9a436e83537b8a0d8555e4e0
Author: Corey Berla <corey berla me>
Date:   Sun Oct 16 10:24:52 2022 -0700

    general: Sort NautilusFile's directly rather than through a dummy item
    
    This wastes a lot of cycles while loading large folders.
    Re-work the sorter, to allow either NautilusViewItems
    or NautilusFiles directly.  This consistently saved
    about 3 seconds in a 100,000 item folder during my testing.

 src/nautilus-grid-view.c |  7 +++----
 src/nautilus-list-base.c |  8 +-------
 src/nautilus-list-base.h |  5 +++++
 src/nautilus-list-view.c | 19 +++++++++++++------
 4 files changed, 22 insertions(+), 17 deletions(-)
---
diff --git a/src/nautilus-grid-view.c b/src/nautilus-grid-view.c
index cbeea42de..10c24d977 100644
--- a/src/nautilus-grid-view.c
+++ b/src/nautilus-grid-view.c
@@ -37,11 +37,10 @@ nautilus_grid_view_sort (gconstpointer a,
                          gpointer      user_data)
 {
     NautilusGridView *self = user_data;
-    NautilusFile *file_a;
-    NautilusFile *file_b;
+    NautilusFile *file_a = NAUTILUS_FILE_FROM_FILE_OR_ITEM ((gpointer) a);
+    NautilusFile *file_b = NAUTILUS_FILE_FROM_FILE_OR_ITEM ((gpointer) b);
 
-    file_a = nautilus_view_item_get_file (NAUTILUS_VIEW_ITEM ((gpointer) a));
-    file_b = nautilus_view_item_get_file (NAUTILUS_VIEW_ITEM ((gpointer) b));
+    g_return_val_if_fail (file_a != NULL && file_b != NULL, GTK_ORDERING_EQUAL);
 
     return nautilus_file_compare_for_sort (file_a, file_b,
                                            self->sort_type,
diff --git a/src/nautilus-list-base.c b/src/nautilus-list-base.c
index c1f85e6d1..2e2552a10 100644
--- a/src/nautilus-list-base.c
+++ b/src/nautilus-list-base.c
@@ -1307,8 +1307,6 @@ real_compare_files (NautilusFilesView *files_view,
     NautilusListBase *self = NAUTILUS_LIST_BASE (files_view);
     NautilusListBasePrivate *priv = nautilus_list_base_get_instance_private (self);
     GtkSorter *sorter;
-    g_autoptr (NautilusViewItem) item1 = NULL;
-    g_autoptr (NautilusViewItem) item2 = NULL;
 
     sorter = nautilus_view_model_get_sorter (priv->model);
     if (sorter == NULL)
@@ -1316,11 +1314,7 @@ real_compare_files (NautilusFilesView *files_view,
         return 0;
     }
 
-    /* Generate fake model items for sorter use only. */
-    item1 = nautilus_view_item_new (file1, NAUTILUS_GRID_ICON_SIZE_SMALL);
-    item2 = nautilus_view_item_new (file2, NAUTILUS_GRID_ICON_SIZE_SMALL);
-
-    return gtk_sorter_compare (sorter, item1, item2);
+    return gtk_sorter_compare (sorter, file1, file2);
 }
 
 static void
diff --git a/src/nautilus-list-base.h b/src/nautilus-list-base.h
index 007ab07a6..c5ee8869e 100644
--- a/src/nautilus-list-base.h
+++ b/src/nautilus-list-base.h
@@ -7,11 +7,16 @@
 #pragma once
 
 #include "nautilus-files-view.h"
+#include "nautilus-view-item.h"
 
 G_BEGIN_DECLS
 
 #define NAUTILUS_TYPE_LIST_BASE (nautilus_list_base_get_type())
 
+#define NAUTILUS_FILE_FROM_FILE_OR_ITEM(obj) \
+    (NAUTILUS_IS_FILE(obj) ? NAUTILUS_FILE(obj) : \
+     NAUTILUS_IS_VIEW_ITEM(obj) ? nautilus_view_item_get_file(NAUTILUS_VIEW_ITEM(obj)) : NULL)
+
 G_DECLARE_DERIVABLE_TYPE (NautilusListBase, nautilus_list_base, NAUTILUS, LIST_BASE, NautilusFilesView)
 
 struct _NautilusListBaseClass
diff --git a/src/nautilus-list-view.c b/src/nautilus-list-view.c
index 2715e7e0e..b9b82a654 100644
--- a/src/nautilus-list-view.c
+++ b/src/nautilus-list-view.c
@@ -251,9 +251,11 @@ nautilus_list_view_sort (gconstpointer a,
                          gconstpointer b,
                          gpointer      user_data)
 {
+    NautilusFile *file_a = NAUTILUS_FILE_FROM_FILE_OR_ITEM ((gpointer) a);
+    NautilusFile *file_b = NAUTILUS_FILE_FROM_FILE_OR_ITEM ((gpointer) b);
     GQuark attribute_q = GPOINTER_TO_UINT (user_data);
-    NautilusFile *file_a = nautilus_view_item_get_file (NAUTILUS_VIEW_ITEM ((gpointer) a));
-    NautilusFile *file_b = nautilus_view_item_get_file (NAUTILUS_VIEW_ITEM ((gpointer) b));
+
+    g_return_val_if_fail (file_a != NULL && file_b != NULL, GTK_ORDERING_EQUAL);
 
     /* The reversed argument is FALSE because the columnview sorter handles that
      * itself and if we don't want to reverse the reverse. The directories_first
@@ -275,10 +277,15 @@ sort_directories_func (gconstpointer a,
 
     if (*directories_first)
     {
-        NautilusFile *file_a = nautilus_view_item_get_file (NAUTILUS_VIEW_ITEM ((gpointer) a));
-        NautilusFile *file_b = nautilus_view_item_get_file (NAUTILUS_VIEW_ITEM ((gpointer) b));
-        gboolean a_is_directory = nautilus_file_is_directory (file_a);
-        gboolean b_is_directory = nautilus_file_is_directory (file_b);
+        NautilusFile *file_a = NAUTILUS_FILE_FROM_FILE_OR_ITEM ((gpointer) a);
+        NautilusFile *file_b = NAUTILUS_FILE_FROM_FILE_OR_ITEM ((gpointer) b);
+        gboolean a_is_directory;
+        gboolean b_is_directory;
+
+        g_return_val_if_fail (file_a != NULL && file_b != NULL, GTK_ORDERING_EQUAL);
+
+        a_is_directory = nautilus_file_is_directory (file_a);
+        b_is_directory = nautilus_file_is_directory (file_b);
 
         if (a_is_directory && !b_is_directory)
         {


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]