diff options
author | Matthias Clasen <mclasen@redhat.com> | 2022-10-20 15:11:49 -0400 |
---|---|---|
committer | Matthias Clasen <mclasen@redhat.com> | 2022-10-20 22:34:41 -0400 |
commit | 1d9c61cada8d2aa18d3a6d193c5e5bf62fd2d38c (patch) | |
tree | 343fc3a0fa374396284d6ac2a1bb7fe77858dde0 /gtk | |
parent | 71adb26a0d7f378136a80a1695c7d50cd4e10fb8 (diff) | |
download | gtk+-1d9c61cada8d2aa18d3a6d193c5e5bf62fd2d38c.tar.gz |
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.
Diffstat (limited to 'gtk')
-rw-r--r-- | gtk/gtkfilechooserwidget.c | 57 |
1 files changed, 57 insertions, 0 deletions
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); @@ -7066,13 +7075,30 @@ get_name (GFileInfo *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); |