[nautilus/wip/corey/fix-sort: 9/9] TEMP: antoniof changes
- From: António Fernandes <antoniof src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [nautilus/wip/corey/fix-sort: 9/9] TEMP: antoniof changes
- Date: Thu, 20 Oct 2022 21:16:22 +0000 (UTC)
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]