From bbea6aff0ea6b718d068882e49377a8ac5776905 Mon Sep 17 00:00:00 2001 From: Corey Berla Date: Wed, 21 Dec 2022 09:52:16 -0800 Subject: list-view: Keep track of column order when dragging headers Now that we are keeping all of the columns in the correct order we can use the column views model to save the column order. --- src/nautilus-list-view.c | 45 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/src/nautilus-list-view.c b/src/nautilus-list-view.c index 6c9a752ee..2872f6833 100644 --- a/src/nautilus-list-view.c +++ b/src/nautilus-list-view.c @@ -63,6 +63,10 @@ static const char *default_columns_for_trash[] = "name", "size", "trashed_on", NULL }; +static char ** get_column_order (NautilusListView *self); +static GStrv get_columns_from_view (NautilusListView *self, + gboolean visible_only); + static guint get_icon_size_for_zoom_level (NautilusListZoomLevel zoom_level) { @@ -105,6 +109,35 @@ real_get_view_ui (NautilusListBase *list_base_view) return GTK_WIDGET (self->view_ui); } +static void +columns_items_changed (GListModel *self, + guint position, + guint removed, + guint added, + gpointer user_data) +{ + NautilusFile *file; + NautilusListView *view = user_data; + g_auto (GStrv) column_order = get_column_order (view); + g_auto (GStrv) new_column_order = get_columns_from_view (view, FALSE); + g_auto (GStrv) new_visible_order = NULL; + + if (g_strv_equal ((const gchar * const *) column_order, (const gchar * const *) new_column_order)) + { + return; + } + + file = nautilus_files_view_get_directory_as_file (NAUTILUS_FILES_VIEW (view)); + new_visible_order = get_columns_from_view (view, TRUE); + + nautilus_file_set_metadata_list (file, + NAUTILUS_METADATA_KEY_LIST_VIEW_COLUMN_ORDER, + new_column_order); + nautilus_file_set_metadata_list (file, + NAUTILUS_METADATA_KEY_LIST_VIEW_VISIBLE_COLUMNS, + new_visible_order); +} + static void apply_columns_settings (NautilusListView *self, char **column_order, @@ -195,10 +228,16 @@ apply_columns_settings (NautilusListView *self, continue; } + g_signal_handlers_block_by_func (gtk_column_view_get_columns (self->view_ui), + G_CALLBACK (columns_items_changed), self); + gtk_column_view_insert_column (self->view_ui, column_i, view_column); visible = g_hash_table_contains (visible_columns_hash, lowercase); gtk_column_view_column_set_visible (view_column, visible); + + g_signal_handlers_unblock_by_func (gtk_column_view_get_columns (self->view_ui), + G_CALLBACK (columns_items_changed), self); } } @@ -1438,6 +1477,9 @@ setup_view_columns (NautilusListView *self) section = g_menu_new (); g_menu_append (section, _("More Columns"), "view.visible-columns"); g_menu_append_section (menu, NULL, G_MENU_MODEL (section)); + + g_signal_connect (gtk_column_view_get_columns (self->view_ui), + "items-changed", G_CALLBACK (columns_items_changed), self); } static void @@ -1542,6 +1584,9 @@ nautilus_list_view_dispose (GObject *object) g_clear_pointer (&self->factory_to_column_map, g_hash_table_destroy); g_signal_handlers_disconnect_by_func (gtk_column_view_get_sorter (self->view_ui), on_sorter_changed, self); + g_signal_handlers_disconnect_by_func (gtk_column_view_get_columns (self->view_ui), + columns_items_changed, + self); G_OBJECT_CLASS (nautilus_list_view_parent_class)->dispose (object); } -- cgit v1.2.1