diff options
author | Corey Berla <corey@berla.me> | 2022-11-29 09:55:48 -0800 |
---|---|---|
committer | António Fernandes <antoniof@gnome.org> | 2023-01-10 02:01:27 +0000 |
commit | 2683cd5016ebfda68cfe061868d743d4fd78d085 (patch) | |
tree | 5eee135382aaba01e66ddd8e6c6a783dfec1eade | |
parent | 8030563fc9a2db38f86bb28f8e8ac9f8cfe16ab6 (diff) | |
download | nautilus-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.c | 40 |
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; |