summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCorey Berla <corey@berla.me>2022-11-29 09:55:48 -0800
committerAntónio Fernandes <antoniof@gnome.org>2023-01-10 02:01:27 +0000
commit2683cd5016ebfda68cfe061868d743d4fd78d085 (patch)
tree5eee135382aaba01e66ddd8e6c6a783dfec1eade
parent8030563fc9a2db38f86bb28f8e8ac9f8cfe16ab6 (diff)
downloadnautilus-2683cd5016ebfda68cfe061868d743d4fd78d085.tar.gz
list-base: Reimplement get_selection_for_file_transfer
The code for get_selection_for_file_transfer was abstracted from view_icon_controller which didn't account for the issues of selecting files with tree expanders. Reimplement get_selection_for_file_transfer to exclude children when the immediate parent is selected. As noted in 7ac81c87c84149b421a6869837deb852876e3d12 this is not a perfect solution because other ancestors (i.e. grandparents) could be selected, but at least it matches the behavior we had previously.
-rw-r--r--src/nautilus-list-base.c40
1 files changed, 33 insertions, 7 deletions
diff --git a/src/nautilus-list-base.c b/src/nautilus-list-base.c
index f0652615a..210b9276b 100644
--- a/src/nautilus-list-base.c
+++ b/src/nautilus-list-base.c
@@ -1031,7 +1031,8 @@ real_file_changed (NautilusFilesView *files_view,
}
static GList *
-real_get_selection (NautilusFilesView *files_view)
+get_selection (NautilusFilesView *files_view,
+ gboolean for_file_transfer)
{
NautilusListBase *self = NAUTILUS_LIST_BASE (files_view);
NautilusListBasePrivate *priv = nautilus_list_base_get_instance_private (self);
@@ -1044,10 +1045,26 @@ real_get_selection (NautilusFilesView *files_view)
for (guint i = 0; i < n_selected; i++)
{
g_autoptr (NautilusViewItem) item = NULL;
+ NautilusFile *file;
item = get_view_item (G_LIST_MODEL (selection), i);
- selected_files = g_list_prepend (selected_files,
- g_object_ref (nautilus_view_item_get_file (item)));
+ file = nautilus_view_item_get_file (item);
+
+ if (for_file_transfer)
+ {
+ /* If the parent is already selected don't include the child. */
+ g_autoptr (NautilusFile) parent = nautilus_file_get_parent (file);
+ g_autoptr (NautilusViewItem) parent_item = NULL;
+ guint parent_pos;
+
+ parent_item = nautilus_view_model_get_item_from_file (priv->model, parent);
+ parent_pos = nautilus_view_model_get_index (priv->model, parent_item);
+ if (gtk_selection_model_is_selected (GTK_SELECTION_MODEL (priv->model), parent_pos))
+ {
+ continue;
+ }
+ }
+ selected_files = g_list_prepend (selected_files, g_object_ref (file));
}
selected_files = g_list_reverse (selected_files);
@@ -1055,6 +1072,18 @@ real_get_selection (NautilusFilesView *files_view)
return selected_files;
}
+static GList *
+real_get_selection (NautilusFilesView *files_view)
+{
+ return get_selection (files_view, FALSE);
+}
+
+static GList *
+real_get_selection_for_file_transfer (NautilusFilesView *files_view)
+{
+ return get_selection (files_view, TRUE);
+}
+
static gboolean
real_is_empty (NautilusFilesView *files_view)
{
@@ -1719,10 +1748,7 @@ nautilus_list_base_class_init (NautilusListBaseClass *klass)
files_view_class->click_policy_changed = real_click_policy_changed;
files_view_class->file_changed = real_file_changed;
files_view_class->get_selection = real_get_selection;
- /* TODO: remove this get_selection_for_file_transfer, this doesn't even
- * take into account we could us the view for recursive search :/
- * CanvasView has the same issue. */
- files_view_class->get_selection_for_file_transfer = real_get_selection;
+ files_view_class->get_selection_for_file_transfer = real_get_selection_for_file_transfer;
files_view_class->is_empty = real_is_empty;
files_view_class->remove_file = real_remove_file;
files_view_class->select_all = real_select_all;