[nautilus/wip/corey/fix-sort: 2/9] general: Sort NautilusFile's directly rather than through a dummy item
- From: Corey Berla <coreyberla src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [nautilus/wip/corey/fix-sort: 2/9] general: Sort NautilusFile's directly rather than through a dummy item
- Date: Sun, 16 Oct 2022 17:27:08 +0000 (UTC)
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]