diff --git a/src/nautilus-column-chooser.c b/src/nautilus-column-chooser.c index 23aa5af5c5bab14f07ccb36d4ea0f73fc337d223..72e18bcc3914077936eb9b1c0481daf334f85c35 100644 --- a/src/nautilus-column-chooser.c +++ b/src/nautilus-column-chooser.c @@ -155,11 +155,20 @@ toggle_path (NautilusColumnChooser *chooser, { GtkTreeIter iter; gboolean visible; + g_autofree gchar *name = NULL; gtk_tree_model_get_iter (GTK_TREE_MODEL (chooser->store), &iter, path); - gtk_tree_model_get (GTK_TREE_MODEL (chooser->store), - &iter, COLUMN_VISIBLE, &visible, -1); + gtk_tree_model_get (GTK_TREE_MODEL (chooser->store), &iter, + COLUMN_VISIBLE, &visible, + COLUMN_NAME, &name, -1); + + if (g_strcmp0 (name, "name") == 0) + { + /* Don't allow name column to be disabled. */ + return; + } + gtk_list_store_set (chooser->store, &iter, COLUMN_VISIBLE, !visible, -1); list_changed (chooser); diff --git a/src/nautilus-files-view.c b/src/nautilus-files-view.c index f19fab7123e3358e6da6320651b9b0e5d93bb70e..afc57e0974447724dc414f0c48c2c186484d6837 100644 --- a/src/nautilus-files-view.c +++ b/src/nautilus-files-view.c @@ -4085,38 +4085,6 @@ ready_to_load (NautilusFile *file) NAUTILUS_FILE_ATTRIBUTES_FOR_ICON); } -static int -compare_files_cover (gconstpointer a, - gconstpointer b, - gpointer callback_data) -{ - const FileAndDirectory *fad1, *fad2; - NautilusFilesView *view; - - view = callback_data; - fad1 = a; - fad2 = b; - - if (fad1->directory < fad2->directory) - { - return -1; - } - else if (fad1->directory > fad2->directory) - { - return 1; - } - else - { - return NAUTILUS_FILES_VIEW_CLASS (G_OBJECT_GET_CLASS (view))->compare_files (view, fad1->file, fad2->file); - } -} -static void -sort_files (NautilusFilesView *view, - GList **list) -{ - *list = g_list_sort_with_data (*list, compare_files_cover, view); -} - /* Go through all the new added and changed files. * Put any that are not ready to load in the non_ready_files hash table. * Add all the rest to the old_added_files and old_changed_files lists. @@ -4203,20 +4171,14 @@ process_new_files (NautilusFilesView *view) } } - /* If any files were added to old_added_files, then resort it. */ if (old_added_files != priv->old_added_files) { priv->old_added_files = old_added_files; - sort_files (view, &priv->old_added_files); } - /* Resort old_changed_files too, since file attributes - * relevant to sorting could have changed. - */ if (old_changed_files != priv->old_changed_files) { priv->old_changed_files = old_changed_files; - sort_files (view, &priv->old_changed_files); } } diff --git a/src/nautilus-files-view.h b/src/nautilus-files-view.h index e1882b7ba082f1f115850c78177a1baef124b594..74375a7ccc4ae3fc6c65e7d2982d43e643b47969 100644 --- a/src/nautilus-files-view.h +++ b/src/nautilus-files-view.h @@ -183,14 +183,6 @@ struct _NautilusFilesViewClass { void (* update_actions_state) (NautilusFilesView *view); - /* sort_files is a function pointer that subclasses can override - * to provide a sorting order to determine which files should be - * presented when only a partial list is provided. - */ - int (* compare_files) (NautilusFilesView *view, - NautilusFile *a, - NautilusFile *b); - /* is_empty is a function pointer that subclasses must * override to report whether the view contains any items. */ diff --git a/src/nautilus-grid-cell.c b/src/nautilus-grid-cell.c index bf19a36a103123f9ff608b0be12cf683bad11089..475d849904d4410f7c36de8fda9ce1edfff39c8f 100644 --- a/src/nautilus-grid-cell.c +++ b/src/nautilus-grid-cell.c @@ -28,7 +28,7 @@ G_DEFINE_TYPE (NautilusGridCell, nautilus_grid_cell, NAUTILUS_TYPE_VIEW_CELL) static void update_icon (NautilusGridCell *self) { - NautilusViewItem *item; + g_autoptr (NautilusViewItem) item = NULL; NautilusFileIconFlags flags; g_autoptr (GdkPaintable) icon_paintable = NULL; GtkStyleContext *style_context; @@ -66,7 +66,7 @@ update_icon (NautilusGridCell *self) static void update_captions (NautilusGridCell *self) { - NautilusViewItem *item; + g_autoptr (NautilusViewItem) item = NULL; NautilusFile *file; GtkWidget * const caption_labels[] = { @@ -98,7 +98,7 @@ update_captions (NautilusGridCell *self) static void update_emblems (NautilusGridCell *self) { - NautilusViewItem *item; + g_autoptr (NautilusViewItem) item = NULL; NautilusFile *file; GtkWidget *child; g_autolist (GIcon) emblems = NULL; @@ -125,7 +125,7 @@ update_emblems (NautilusGridCell *self) static void on_file_changed (NautilusGridCell *self) { - NautilusViewItem *item; + g_autoptr (NautilusViewItem) item = NULL; NautilusFile *file; g_autofree gchar *name = NULL; @@ -153,8 +153,10 @@ static void on_item_is_cut_changed (NautilusGridCell *self) { gboolean is_cut; + g_autoptr (NautilusViewItem) item = NULL; - g_object_get (nautilus_view_cell_get_item (NAUTILUS_VIEW_CELL (self)), + item = nautilus_view_cell_get_item (NAUTILUS_VIEW_CELL (self)); + g_object_get (item, "is-cut", &is_cut, NULL); if (is_cut) diff --git a/src/nautilus-label-cell.c b/src/nautilus-label-cell.c index 7d3319dba11d971ae6e87cf1646b530f240cdc96..e8b62dfb78c6d8b76acf271334b14029b9700be4 100644 --- a/src/nautilus-label-cell.c +++ b/src/nautilus-label-cell.c @@ -37,7 +37,7 @@ static GParamSpec *properties[N_PROPS] = { NULL, }; static void on_file_changed (NautilusLabelCell *self) { - NautilusViewItem *item; + g_autoptr (NautilusViewItem) item = NULL; NautilusFile *file; g_autofree gchar *string = NULL; diff --git a/src/nautilus-list-base.c b/src/nautilus-list-base.c index c1f85e6d12a8690253d10ad4c603e7a0593129b7..21c49707f2079d9517ec76672383268c83dcf185 100644 --- a/src/nautilus-list-base.c +++ b/src/nautilus-list-base.c @@ -82,19 +82,19 @@ static const SortConstants sorts_constants[] = }, { NAUTILUS_FILE_SORT_BY_MTIME, - "modification date", + "date_modified", }, { NAUTILUS_FILE_SORT_BY_ATIME, - "access date", + "date_accessed", }, { NAUTILUS_FILE_SORT_BY_BTIME, - "creation date", + "date_created", }, { NAUTILUS_FILE_SORT_BY_TRASHED_TIME, - "trashed", + "trashed_on", }, { NAUTILUS_FILE_SORT_BY_SEARCH_RELEVANCE, @@ -1299,30 +1299,6 @@ real_reveal_selection (NautilusFilesView *files_view) nautilus_list_base_scroll_to_item (self, get_first_selected_item (self)); } -static int -real_compare_files (NautilusFilesView *files_view, - NautilusFile *file1, - NautilusFile *file2) -{ - NautilusListBase *self = NAUTILUS_LIST_BASE (files_view); - NautilusListBasePrivate *priv = nautilus_list_base_get_instance_private (self); - GtkSorter *sorter; - g_autoptr (NautilusViewItem) item1 = NULL; - g_autoptr (NautilusViewItem) item2 = NULL; - - sorter = nautilus_view_model_get_sorter (priv->model); - if (sorter == NULL) - { - return 0; - } - - /* Generate fake model items for sorter use only. */ - item1 = nautilus_view_item_new (file1, NAUTILUS_GRID_ICON_SIZE_SMALL); - item2 = nautilus_view_item_new (file2, NAUTILUS_GRID_ICON_SIZE_SMALL); - - return gtk_sorter_compare (sorter, item1, item2); -} - static void on_clipboard_contents_received (GObject *source_object, GAsyncResult *res, @@ -1737,7 +1713,6 @@ nautilus_list_base_class_init (NautilusListBaseClass *klass) files_view_class->select_all = real_select_all; files_view_class->set_selection = real_set_selection; files_view_class->invert_selection = real_invert_selection; - files_view_class->compare_files = real_compare_files; files_view_class->end_file_changes = real_end_file_changes; files_view_class->end_loading = real_end_loading; files_view_class->get_first_visible_file = real_get_first_visible_file; diff --git a/src/nautilus-list-view.c b/src/nautilus-list-view.c index 4b7a5f2e1dfaf5ab893d454f49951ebe934025a4..7960d6ad89b28e441585d1cde9bdbb37e659cf51 100644 --- a/src/nautilus-list-view.c +++ b/src/nautilus-list-view.c @@ -44,6 +44,12 @@ struct _NautilusListView GtkColumnViewColumn *star_column; GtkWidget *column_editor; GHashTable *factory_to_column_map; + + GHashTable *all_view_columns_hash; + + /* Column sort hack state */ + gboolean column_header_was_clicked; + GQuark clicked_column_attribute_q; }; G_DEFINE_TYPE (NautilusListView, nautilus_list_view, NAUTILUS_TYPE_LIST_BASE) @@ -117,7 +123,6 @@ apply_columns_settings (NautilusListView *self, g_autoptr (GList) view_columns = NULL; GListModel *old_view_columns; g_autoptr (GHashTable) visible_columns_hash = NULL; - g_autoptr (GHashTable) old_view_columns_hash = NULL; int column_i = 0; file = nautilus_files_view_get_directory_as_file (NAUTILUS_FILES_VIEW (self)); @@ -162,25 +167,7 @@ apply_columns_settings (NautilusListView *self, } } - old_view_columns_hash = g_hash_table_new_full (g_str_hash, - g_str_equal, - (GDestroyNotify) g_free, - NULL); old_view_columns = gtk_column_view_get_columns (self->view_ui); - for (guint i = 0; i < g_list_model_get_n_items (old_view_columns); i++) - { - g_autoptr (GtkColumnViewColumn) view_column = NULL; - GtkListItemFactory *factory; - NautilusColumn *nautilus_column; - gchar *name; - - view_column = g_list_model_get_item (old_view_columns, i); - factory = gtk_column_view_column_get_factory (view_column); - nautilus_column = g_hash_table_lookup (self->factory_to_column_map, factory); - g_object_get (nautilus_column, "name", &name, NULL); - g_hash_table_insert (old_view_columns_hash, name, view_column); - } - for (GList *l = all_columns; l != NULL; l = l->next) { g_autofree char *name = NULL; @@ -193,7 +180,7 @@ apply_columns_settings (NautilusListView *self, { GtkColumnViewColumn *view_column; - view_column = g_hash_table_lookup (old_view_columns_hash, name); + view_column = g_hash_table_lookup (self->all_view_columns_hash, name); if (view_column != NULL) { view_columns = g_list_prepend (view_columns, view_column); @@ -211,11 +198,7 @@ apply_columns_settings (NautilusListView *self, view_column = g_list_model_get_item (old_view_columns, i); if (g_list_find (view_columns, view_column) == NULL) { - gtk_column_view_column_set_visible (view_column, FALSE); - } - else - { - gtk_column_view_column_set_visible (view_column, TRUE); + gtk_column_view_remove_column (self->view_ui, view_column); } } @@ -246,15 +229,34 @@ real_scroll_to_item (NautilusListBase *list_base_view, } } +typedef struct +{ + GQuark attribute; + NautilusListView *view; +} SortData; + static gint nautilus_list_view_sort (gconstpointer a, gconstpointer b, gpointer user_data) { - GQuark attribute_q = GPOINTER_TO_UINT (user_data); + SortData *data = user_data; + NautilusListView *self = data->view; + GQuark attribute_q = data->attribute; NautilusFile *file_a = nautilus_view_item_get_file (NAUTILUS_VIEW_ITEM ((gpointer) a)); NautilusFile *file_b = nautilus_view_item_get_file (NAUTILUS_VIEW_ITEM ((gpointer) b)); + /* Hack: We don't know what column is being sorted on when the column + * headers are clicked. So let's just look at what attribute was most + * recently used for sorting. + * https://gitlab.gnome.org/GNOME/gtk/-/issues/4833 */ + if (self->clicked_column_attribute_q == 0 && self->column_header_was_clicked) + { + self->clicked_column_attribute_q = attribute_q; + } + + g_return_val_if_fail (file_a != NULL && file_b != NULL, GTK_ORDERING_EQUAL); + /* The reversed argument is FALSE because the columnview sorter handles that * itself and if we don't want to reverse the reverse. The directories_first * argument is also FALSE for the same reason: we don't want the columnview @@ -606,6 +608,7 @@ action_sort_order_changed (GSimpleAction *action, NautilusFileSortType sort_type; NautilusListView *self; GListModel *view_columns; + NautilusViewModel *model; g_autoptr (GtkColumnViewColumn) sort_column = NULL; GtkSorter *sorter; @@ -668,14 +671,21 @@ action_sort_order_changed (GSimpleAction *action, } } - sorter = gtk_column_view_get_sorter (self->view_ui); + model = nautilus_list_base_get_model (NAUTILUS_LIST_BASE (self)); + sorter = nautilus_view_model_get_sorter (model); - g_signal_handlers_block_by_func (sorter, on_sorter_changed, self); - /* FIXME: Set NULL to stop drawing the arrow on previous sort column - * to workaround https://gitlab.gnome.org/GNOME/gtk/-/issues/4696 */ - gtk_column_view_sort_by_column (self->view_ui, NULL, FALSE); - gtk_column_view_sort_by_column (self->view_ui, sort_column, reversed); - g_signal_handlers_unblock_by_func (sorter, on_sorter_changed, self); + /* Ask the column view to sort by column if it hasn't just done so already. */ + if (!self->column_header_was_clicked) + { + g_signal_handlers_block_by_func (sorter, on_sorter_changed, self); + /* FIXME: Set NULL to stop drawing the arrow on previous sort column + * to workaround https://gitlab.gnome.org/GNOME/gtk/-/issues/4696 */ + gtk_column_view_sort_by_column (self->view_ui, NULL, FALSE); + gtk_column_view_sort_by_column (self->view_ui, sort_column, reversed); + g_signal_handlers_unblock_by_func (sorter, on_sorter_changed, self); + } + + self->column_header_was_clicked = FALSE; set_directory_sort_metadata (nautilus_files_view_get_directory_as_file (NAUTILUS_FILES_VIEW (self)), target_name, @@ -739,9 +749,12 @@ real_begin_loading (NautilusFilesView *files_view) NautilusListView *self = NAUTILUS_LIST_VIEW (files_view); NautilusFile *file; + /* We need to setup the columns before chaining up */ + update_columns_settings_from_metadata_and_preferences (self); + NAUTILUS_FILES_VIEW_CLASS (nautilus_list_view_parent_class)->begin_loading (files_view); - update_columns_settings_from_metadata_and_preferences (self); + self->clicked_column_attribute_q = 0; self->path_attribute_q = 0; g_clear_object (&self->file_path_base_location); @@ -850,12 +863,60 @@ on_sorter_changed (GtkSorter *sorter, gpointer user_data) { NautilusListView *self = NAUTILUS_LIST_VIEW (user_data); + NautilusViewModel *model = nautilus_list_base_get_model (NAUTILUS_LIST_BASE (self)); - /* When user clicks a header to change sort order, we don't know what the - * new sort order is. Make sure the sort menu doesn't indicate a outdated - * action state. */ - g_action_group_change_action_state (nautilus_files_view_get_action_group (NAUTILUS_FILES_VIEW (self)), - "sort", g_variant_new ("(sb)", "unknown", FALSE)); + /* Set the conditions to capture the sort attribute the first time that + * nautilus_list_view_sort() is called. */ + self->column_header_was_clicked = TRUE; + self->clicked_column_attribute_q = 0; + + /* If there is only one file, enforce a comparison against a dummy item, to + * ensure nautilus_list_view_sort() gets called at least once. */ + if (g_list_model_get_n_items (G_LIST_MODEL (model)) == 1) + { + NautilusViewItem *item = g_list_model_get_item (G_LIST_MODEL (model), 0); + g_autoptr (NautilusViewItem) dummy_item = NULL; + + dummy_item = nautilus_view_item_new (nautilus_view_item_get_file (item), + NAUTILUS_LIST_ICON_SIZE_SMALL); + + gtk_sorter_compare (sorter, item, dummy_item); + } +} + +static void +on_after_sorter_changed (GtkSorter *sorter, + GtkSorterChange change, + gpointer user_data) +{ + NautilusListView *self = NAUTILUS_LIST_VIEW (user_data); + GActionGroup *action_group = nautilus_files_view_get_action_group (NAUTILUS_FILES_VIEW (self)); + g_autoptr (GVariant) state = NULL; + const gchar *new_sort_text; + gboolean reversed; + g_autofree gchar *current_sort_text = NULL; + + if (!self->column_header_was_clicked || self->clicked_column_attribute_q == 0) + { + return; + } + + state = g_action_group_get_action_state (action_group, "sort"); + g_variant_get (state, "(&sb)", ¤t_sort_text, &reversed); + + new_sort_text = g_quark_to_string (self->clicked_column_attribute_q); + + if (g_strcmp0 (new_sort_text, current_sort_text) == 0) + { + reversed = !reversed; + } + else + { + reversed = FALSE; + } + + g_action_group_change_action_state (action_group, "sort", + g_variant_new ("(sb)", new_sort_text, reversed)); } static guint @@ -880,7 +941,7 @@ on_item_click_released_workaround (GtkGestureClick *gesture, modifiers & (GDK_CONTROL_MASK | GDK_SHIFT_MASK)) { NautilusViewModel *model; - NautilusViewItem *item; + g_autoptr (NautilusViewItem) item = NULL; guint i; model = nautilus_list_base_get_model (NAUTILUS_LIST_BASE (self)); @@ -935,8 +996,6 @@ setup_name_cell (GtkSignalListItemFactory *factory, nautilus_name_cell_show_snippet (NAUTILUS_NAME_CELL (cell)); } - gtk_list_item_set_child (listitem, GTK_WIDGET (cell)); - setup_selection_click_workaround (cell); } @@ -1021,10 +1080,15 @@ setup_view_columns (NautilusListView *self) g_direct_equal, NULL, g_object_unref); + self->all_view_columns_hash = g_hash_table_new_full (g_str_hash, + g_str_equal, + (GDestroyNotify) g_free, + g_object_unref); for (GList *l = nautilus_columns; l != NULL; l = l->next) { NautilusColumn *nautilus_column = NAUTILUS_COLUMN (l->data); + SortData *data; g_autofree gchar *name = NULL; g_autofree gchar *label = NULL; GQuark attribute_q = 0; @@ -1039,9 +1103,13 @@ setup_view_columns (NautilusListView *self) "default-sort-order", &sort_order, NULL); + data = g_new0 (SortData, 1); + data->attribute = attribute_q; + data->view = self; + sorter = gtk_custom_sorter_new (nautilus_list_view_sort, - GUINT_TO_POINTER (attribute_q), - NULL); + data, + g_free); factory = gtk_signal_list_item_factory_new (); view_column = gtk_column_view_column_new (NULL, factory); @@ -1072,11 +1140,12 @@ setup_view_columns (NautilusListView *self) g_signal_connect (factory, "setup", G_CALLBACK (setup_label_cell), self); } - gtk_column_view_append_column (self->view_ui, view_column); - g_hash_table_insert (self->factory_to_column_map, factory, g_object_ref (nautilus_column)); + g_hash_table_insert (self->all_view_columns_hash, + g_steal_pointer (&name), + g_steal_pointer (&view_column)); } } @@ -1115,6 +1184,7 @@ nautilus_list_view_init (NautilusListView *self) gtk_multi_sorter_append (sorter, g_object_ref (GTK_SORTER (directories_sorter))); gtk_multi_sorter_append (sorter, g_object_ref (gtk_column_view_get_sorter (self->view_ui))); g_signal_connect_object (sorter, "changed", G_CALLBACK (on_sorter_changed), self, 0); + g_signal_connect_object (sorter, "changed", G_CALLBACK (on_after_sorter_changed), self, G_CONNECT_AFTER); model = nautilus_list_base_get_model (NAUTILUS_LIST_BASE (self)); nautilus_view_model_set_sorter (model, GTK_SORTER (sorter)); @@ -1137,9 +1207,14 @@ static void nautilus_list_view_dispose (GObject *object) { NautilusListView *self = NAUTILUS_LIST_VIEW (object); + NautilusViewModel *model; + + model = nautilus_list_base_get_model (NAUTILUS_LIST_BASE (self)); + nautilus_view_model_set_sorter (model, NULL); g_clear_object (&self->file_path_base_location); g_clear_pointer (&self->factory_to_column_map, g_hash_table_destroy); + g_clear_pointer (&self->all_view_columns_hash, g_hash_table_destroy); G_OBJECT_CLASS (nautilus_list_view_parent_class)->dispose (object); } diff --git a/src/nautilus-name-cell.c b/src/nautilus-name-cell.c index a58415f9eec2fff64f1a638f36c9e1f19b647e64..23e57ed22d7cd6cf6bdd4d9a82c3ed62f41f2c67 100644 --- a/src/nautilus-name-cell.c +++ b/src/nautilus-name-cell.c @@ -92,7 +92,7 @@ get_path_text (NautilusFile *file, static void update_labels (NautilusNameCell *self) { - NautilusViewItem *item; + g_autoptr (NautilusViewItem) item = NULL; NautilusFile *file; g_autofree gchar *display_name = NULL; g_autofree gchar *path_text = NULL; @@ -125,7 +125,7 @@ update_icon (NautilusNameCell *self) NautilusFileIconFlags flags; g_autoptr (GdkPaintable) icon_paintable = NULL; GtkStyleContext *style_context; - NautilusViewItem *item; + g_autoptr (NautilusViewItem) item = NULL; NautilusFile *file; guint icon_size; gint scale_factor; @@ -177,7 +177,7 @@ update_icon (NautilusNameCell *self) static void update_emblems (NautilusNameCell *self) { - NautilusViewItem *item; + g_autoptr (NautilusViewItem) item = NULL; NautilusFile *file; GtkWidget *child; g_autolist (GIcon) emblems = NULL; @@ -218,7 +218,7 @@ static void on_item_drag_accept_changed (NautilusNameCell *self) { gboolean drag_accept; - NautilusViewItem *item; + g_autoptr (NautilusViewItem) item = NULL; GtkWidget *list_row = gtk_widget_get_parent (gtk_widget_get_parent (GTK_WIDGET (self))); item = nautilus_view_cell_get_item (NAUTILUS_VIEW_CELL (self)); @@ -237,8 +237,10 @@ static void on_item_is_cut_changed (NautilusNameCell *self) { gboolean is_cut; + g_autoptr (NautilusViewItem) item = NULL; - g_object_get (nautilus_view_cell_get_item (NAUTILUS_VIEW_CELL (self)), + item = nautilus_view_cell_get_item (NAUTILUS_VIEW_CELL (self)); + g_object_get (item, "is-cut", &is_cut, NULL); if (is_cut) diff --git a/src/nautilus-star-cell.c b/src/nautilus-star-cell.c index a47a6b2ffeb9d2350331170b0aa652c2727e18d8..9f210280890a766d78482f668dd7d61e0e8f7672 100644 --- a/src/nautilus-star-cell.c +++ b/src/nautilus-star-cell.c @@ -27,7 +27,7 @@ on_star_click_released (GtkGestureClick *gesture, { NautilusStarCell *self = user_data; NautilusTagManager *tag_manager = nautilus_tag_manager_get (); - NautilusViewItem *item; + g_autoptr (NautilusViewItem) item = NULL; NautilusFile *file; g_autofree gchar *uri = NULL; @@ -77,7 +77,7 @@ update_star (GtkImage *star, static void on_file_changed (NautilusStarCell *self) { - NautilusViewItem *item; + g_autoptr (NautilusViewItem) item = NULL; NautilusFile *file; g_autofree gchar *string = NULL; @@ -94,7 +94,7 @@ on_starred_changed (NautilusTagManager *tag_manager, gpointer user_data) { NautilusStarCell *self = user_data; - NautilusViewItem *item; + g_autoptr (NautilusViewItem) item = NULL; NautilusFile *file; item = nautilus_view_cell_get_item (NAUTILUS_VIEW_CELL (self)); diff --git a/src/nautilus-vfs-file.c b/src/nautilus-vfs-file.c index d9d288e43bba2d23707c6c3fd0c5b4215e247a7f..9e6038c5271f4c955b48936190c3f165986d4530 100644 --- a/src/nautilus-vfs-file.c +++ b/src/nautilus-vfs-file.c @@ -203,7 +203,14 @@ vfs_file_set_metadata_as_list (NautilusFile *file, info = g_file_info_new (); gio_key = g_strconcat ("metadata::", key, NULL); - g_file_info_set_attribute_stringv (info, gio_key, value); + if (value == NULL) + { + g_file_info_set_attribute (info, gio_key, G_FILE_ATTRIBUTE_TYPE_INVALID, NULL); + } + else + { + g_file_info_set_attribute_stringv (info, gio_key, value); + } g_free (gio_key); location = nautilus_file_get_location (file); diff --git a/src/nautilus-view-model.c b/src/nautilus-view-model.c index 0ce806713919c7747da6d8e3d5b08e63de249bc2..2d472ef6ca23de0836fc228f0a898e5aab42e902 100644 --- a/src/nautilus-view-model.c +++ b/src/nautilus-view-model.c @@ -301,9 +301,12 @@ nautilus_view_model_set_sorter (NautilusViewModel *self, g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_SORTER]); } - self->sorter_changed_id = g_signal_connect (self->sorter, "changed", - G_CALLBACK (on_sorter_changed), self); - g_list_store_sort (self->internal_model, compare_data_func, self); + if (self->sorter != NULL) + { + self->sorter_changed_id = g_signal_connect (self->sorter, "changed", + G_CALLBACK (on_sorter_changed), self); + g_list_store_sort (self->internal_model, compare_data_func, self); + } } GQueue * @@ -391,6 +394,10 @@ nautilus_view_model_add_items (NautilusViewModel *self, GList *l; int i = 0; + /* Sort items before adding them to the internal model. This ensures that + * the first sorted item is become the initial focus and scroll anchor. */ + g_queue_sort (items, compare_data_func, self); + array = g_malloc_n (g_queue_get_length (items), sizeof (NautilusViewItem *)); diff --git a/src/resources/ui/nautilus-toolbar-view-menu.ui b/src/resources/ui/nautilus-toolbar-view-menu.ui index 03c6e8e8d238f86c16b3e8f96c61b38c5ac5b325..ffdd3ac077b5059144e056ec4805d114ff85391a 100644 --- a/src/resources/ui/nautilus-toolbar-view-menu.ui +++ b/src/resources/ui/nautilus-toolbar-view-menu.ui @@ -16,13 +16,13 @@ view.sort - ('modification date',true) + ('date_modified',true) Last _Modified action-disabled view.sort - ('modification date',false) + ('date_modified',false) _First Modified action-disabled @@ -40,7 +40,7 @@ view.sort - ('trashed',true) + ('trashed_on',true) Last _Trashed action-disabled last_trashed