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