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 | |
| 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.
| -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); |
