From 1d9c61cada8d2aa18d3a6d193c5e5bf62fd2d38c Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Thu, 20 Oct 2022 15:11:49 -0400 Subject: filechooserwidget: Remember sort columns and order These settings existed before, we keep using them. This loses some information about sorting by multiple columns, but it is sufficient to get the same primary sort column back. --- gtk/gtkfilechooserwidget.c | 57 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) (limited to 'gtk') diff --git a/gtk/gtkfilechooserwidget.c b/gtk/gtkfilechooserwidget.c index 993a316076..7d18ea03df 100644 --- a/gtk/gtkfilechooserwidget.c +++ b/gtk/gtkfilechooserwidget.c @@ -89,6 +89,7 @@ #include "gtkcustomsorter.h" #include "gtkstringsorter.h" #include "gtkmultisorter.h" +#include "gtkcolumnviewsorter.h" #include "gtkexpression.h" #ifndef G_OS_WIN32 @@ -3063,13 +3064,21 @@ cancel_all_operations (GtkFileChooserWidget *impl) search_stop_searching (impl, TRUE); } +static void sorter_changed (GtkSorter *main_sorter, + GParamSpec *pspec, + GtkFileChooserWidget *impl); + static void gtk_file_chooser_widget_dispose (GObject *object) { GtkFileChooserWidget *impl = (GtkFileChooserWidget *) object; + GtkSorter *sorter; cancel_all_operations (impl); + sorter = gtk_column_view_get_sorter (GTK_COLUMN_VIEW (impl->browse_files_column_view)); + g_signal_handlers_disconnect_by_func (sorter, G_CALLBACK (sorter_changed), impl); + /* browse_files_popover is not a template child */ g_clear_pointer (&impl->browse_files_popover, gtk_widget_unparent); g_clear_pointer (&impl->bookmarks_manager, _gtk_bookmarks_manager_free); @@ -7065,14 +7074,31 @@ get_name (GFileInfo *info) return g_strdup (g_file_info_get_display_name (info)); } +static void +sorter_changed (GtkSorter *sorter, + GParamSpec *pspec, + GtkFileChooserWidget *impl) +{ + GtkColumnViewSorter *main_sorter = GTK_COLUMN_VIEW_SORTER (sorter); + GtkColumnViewColumn *primary; + + primary = gtk_column_view_sorter_get_primary_sort_column (main_sorter); + impl->sort_column = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (primary), "column")); + impl->sort_order = gtk_column_view_sorter_get_primary_sort_order (main_sorter); +} + static void setup_sorting (GtkFileChooserWidget *impl) { GtkFileSystemModel *fsmodel; + GtkSorter *main_sorter; GtkSorter *sorter = NULL; fsmodel = GTK_FILE_SYSTEM_MODEL (get_current_model (impl)); + main_sorter = gtk_column_view_get_sorter (GTK_COLUMN_VIEW (impl->browse_files_column_view)); + g_signal_handlers_disconnect_by_func (main_sorter, G_CALLBACK (sorter_changed), impl); + gtk_column_view_column_set_sorter (impl->column_view_name_column, NULL); gtk_column_view_column_set_sorter (impl->column_view_location_column, NULL); gtk_column_view_column_set_sorter (impl->column_view_size_column, NULL); @@ -7082,6 +7108,7 @@ setup_sorting (GtkFileChooserWidget *impl) if (fsmodel == impl->browse_files_model) { GtkExpression *expression; + GtkColumnViewColumn *column; expression = gtk_cclosure_expression_new (G_TYPE_STRING, NULL, 0, NULL, @@ -7107,6 +7134,31 @@ setup_sorting (GtkFileChooserWidget *impl) sorter = GTK_SORTER (gtk_multi_sorter_new ()); gtk_multi_sorter_append (GTK_MULTI_SORTER (sorter), GTK_SORTER (gtk_custom_sorter_new (directory_sort_func, impl, NULL))); gtk_multi_sorter_append (GTK_MULTI_SORTER (sorter), g_object_ref (gtk_column_view_get_sorter (GTK_COLUMN_VIEW (impl->browse_files_column_view)))); + + switch (impl->sort_column) + { + case 0: + column = impl->column_view_name_column; + break; + case 1: + column = impl->column_view_size_column; + break; + case 2: + column = impl->column_view_type_column; + break; + case 3: + column = impl->column_view_time_column; + break; + default: + g_assert_not_reached (); + } + + gtk_column_view_sort_by_column (GTK_COLUMN_VIEW (impl->browse_files_column_view), + column, impl->sort_order); + + sorter_changed (main_sorter, NULL, impl); + g_signal_connect (main_sorter, "notify::primary-sort-column", G_CALLBACK (sorter_changed), impl); + g_signal_connect (main_sorter, "notify::primary-sort-order", G_CALLBACK (sorter_changed), impl); } else if (fsmodel == impl->recent_model) { @@ -7166,6 +7218,11 @@ gtk_file_chooser_widget_init (GtkFileChooserWidget *impl) gtk_column_view_set_model (GTK_COLUMN_VIEW (impl->browse_files_column_view), impl->selection_model); + g_object_set_data (G_OBJECT (impl->column_view_name_column), "column", GINT_TO_POINTER (0)); + g_object_set_data (G_OBJECT (impl->column_view_size_column), "column", GINT_TO_POINTER (1)); + g_object_set_data (G_OBJECT (impl->column_view_type_column), "column", GINT_TO_POINTER (2)); + g_object_set_data (G_OBJECT (impl->column_view_time_column), "column", GINT_TO_POINTER (3)); + impl->bookmarks_manager = _gtk_bookmarks_manager_new (NULL, NULL); impl->filters = g_list_store_new (GTK_TYPE_FILE_FILTER); -- cgit v1.2.1