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.
This commit is contained in:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user