[nautilus/wip/corey/fix-sort: 9/9] TEMP: antoniof changes




commit e7adb0c3ff1a8d9f16e83ffda97363195200c99b
Author: António Fernandes <antoniof gnome org>
Date:   Thu Oct 20 22:16:01 2022 +0100

    TEMP: antoniof changes

 src/nautilus-list-view.c | 68 +++++++++++++++++++++++++++++++++++++-----------
 1 file changed, 53 insertions(+), 15 deletions(-)
---
diff --git a/src/nautilus-list-view.c b/src/nautilus-list-view.c
index 0960693c5..e97a30da1 100644
--- a/src/nautilus-list-view.c
+++ b/src/nautilus-list-view.c
@@ -37,8 +37,6 @@ struct _NautilusListView
     gint zoom_level;
 
     gboolean directories_first;
-    GQuark sort_attribute;
-    gboolean column_header_was_clicked;
 
     GQuark path_attribute_q;
     GFile *file_path_base_location;
@@ -47,14 +45,18 @@ struct _NautilusListView
     GtkWidget *column_editor;
     GHashTable *factory_to_column_map;
     GHashTable *all_view_columns_hash;
+
+    /* Column sort hack state */
+    gboolean column_header_was_clicked;
+    GQuark clicked_column_attribute_q;
 };
 
 G_DEFINE_TYPE (NautilusListView, nautilus_list_view, NAUTILUS_TYPE_LIST_BASE)
 
 
-static void on_sorter_changed (GtkSorter      *sorter,
-                               GtkSorterChange change,
-                               gpointer        user_data);
+static void on_sorter_changed (GtkSorter       *sorter,
+                               GtkSorterChange  change,
+                               gpointer         user_data);
 
 static const char *default_columns_for_recent[] =
 {
@@ -247,7 +249,10 @@ nautilus_list_view_sort (gconstpointer a,
      * headers are clicked. So let's just look at what attribute was most
      * recently used for sorting.
      * https://gitlab.gnome.org/GNOME/gtk/-/issues/4833 */
-    self->sort_attribute = attribute_q;
+    if (self->clicked_column_attribute_q == 0 && self->column_header_was_clicked)
+    {
+        self->clicked_column_attribute_q = attribute_q;
+    }
 
     g_return_val_if_fail (file_a != NULL && file_b != NULL, GTK_ORDERING_EQUAL);
 
@@ -686,6 +691,8 @@ action_sort_order_changed (GSimpleAction *action,
                                  reversed);
 
     g_simple_action_set_state (action, value);
+
+    nautilus_files_view_update_toolbar_menus (NAUTILUS_FILES_VIEW (self));
 }
 
 static void
@@ -748,7 +755,7 @@ real_begin_loading (NautilusFilesView *files_view)
 
     NAUTILUS_FILES_VIEW_CLASS (nautilus_list_view_parent_class)->begin_loading (files_view);
 
-    self->sort_attribute = 0;
+    self->clicked_column_attribute_q = 0;
 
     self->path_attribute_q = 0;
     g_clear_object (&self->file_path_base_location);
@@ -855,6 +862,33 @@ static void
 on_sorter_changed (GtkSorter       *sorter,
                    GtkSorterChange  change,
                    gpointer         user_data)
+{
+    NautilusListView *self = NAUTILUS_LIST_VIEW (user_data);
+    NautilusViewModel *model = nautilus_list_base_get_model (NAUTILUS_LIST_BASE (self));
+
+    /* Set the conditions to capture the sort attribute the first time that
+     * nautilus_list_view_sort() is called. */
+    self->column_header_was_clicked = TRUE;
+    self->clicked_column_attribute_q = 0;
+
+    /* If there is only one file, enforce a comparison against a dummy item, to
+     * ensure nautilus_list_view_sort() gets called at least once. */
+    if (g_list_model_get_n_items (G_LIST_MODEL (model)) == 1)
+    {
+        NautilusViewItem *item = g_list_model_get_item (G_LIST_MODEL (model), 0);
+        g_autoptr (NautilusViewItem) dummy_item = NULL;
+
+        dummy_item = nautilus_view_item_new (nautilus_view_item_get_file (item),
+                                             NAUTILUS_LIST_ICON_SIZE_SMALL);
+
+        gtk_sorter_compare (sorter, item, dummy_item);
+    }
+}
+
+static void
+on_after_sorter_changed (GtkSorter       *sorter,
+                         GtkSorterChange  change,
+                         gpointer         user_data)
 {
     NautilusListView *self = NAUTILUS_LIST_VIEW (user_data);
     NautilusFile *file = nautilus_files_view_get_directory_as_file (NAUTILUS_FILES_VIEW (self));
@@ -862,15 +896,14 @@ on_sorter_changed (GtkSorter       *sorter,
     gboolean reversed;
     g_autofree gchar *current_sort_text = NULL;
 
-    if (self->sort_attribute == 0)
-    {
-        new_sort_text = "unknown";
-    }
-    else
+    if (!self->column_header_was_clicked)
     {
-        new_sort_text = g_quark_to_string (self->sort_attribute);
+        return;
     }
 
+    g_return_if_fail (self->clicked_column_attribute_q != 0);
+
+    new_sort_text = g_quark_to_string (self->clicked_column_attribute_q);
     current_sort_text = nautilus_file_get_metadata (file,
                                                     NAUTILUS_METADATA_KEY_ICON_VIEW_SORT_BY,
                                                     "unknown");
@@ -881,8 +914,11 @@ on_sorter_changed (GtkSorter       *sorter,
                                                         NAUTILUS_METADATA_KEY_ICON_VIEW_SORT_REVERSED,
                                                         FALSE);
     }
+    else
+    {
+        reversed = FALSE;
+    }
 
-    self->column_header_was_clicked = TRUE;
     g_action_group_change_action_state (nautilus_files_view_get_action_group (NAUTILUS_FILES_VIEW (self)),
                                         "sort", g_variant_new ("(sb)", new_sort_text, reversed));
 }
@@ -1150,7 +1186,8 @@ nautilus_list_view_init (NautilusListView *self)
     sorter = gtk_multi_sorter_new ();
     gtk_multi_sorter_append (sorter, g_object_ref (GTK_SORTER (directories_sorter)));
     gtk_multi_sorter_append (sorter, g_object_ref (gtk_column_view_get_sorter (self->view_ui)));
-    g_signal_connect_after (sorter, "changed", G_CALLBACK (on_sorter_changed), self);
+    g_signal_connect (sorter, "changed", G_CALLBACK (on_sorter_changed), self);
+    g_signal_connect_after (sorter, "changed", G_CALLBACK (on_after_sorter_changed), self);
 
     model = nautilus_list_base_get_model (NAUTILUS_LIST_BASE (self));
     nautilus_view_model_set_sorter (model, GTK_SORTER (sorter));
@@ -1180,6 +1217,7 @@ nautilus_list_view_dispose (GObject *object)
     sorter = nautilus_view_model_get_sorter (model);
 
     g_signal_handlers_disconnect_by_func (sorter, on_sorter_changed, self);
+    g_signal_handlers_disconnect_by_func (sorter, on_after_sorter_changed, self);
 
     g_clear_object (&self->file_path_base_location);
     g_clear_pointer (&self->factory_to_column_map, g_hash_table_destroy);


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