diff options
author | António Fernandes <antoniof@gnome.org> | 2023-01-14 18:16:04 +0000 |
---|---|---|
committer | António Fernandes <antoniof@gnome.org> | 2023-01-14 18:37:07 +0000 |
commit | e13e08a9b87bd467546ef1217687c6c87f5f1f26 (patch) | |
tree | 9577aaeb8ecd86e32a1956b98a66171b66ef72ec | |
parent | 60bd06138accf14e89cc5a30b756db932f9fa3bc (diff) | |
download | nautilus-e13e08a9b87bd467546ef1217687c6c87f5f1f26.tar.gz |
view-model: Remove moved item from old store
When an item is moved, we are still showing it in the old location as a
regression caused by commit 510a4202d25b82323a1307918b382aab603190eb
With the introduction of tree model, we maintain multiple list stores
(one for each TreeListRow when the TreeListRow is a directory) and the
item is associated with a directory store upon creation by checking
nautilus_file_get_parent(). When removing an item, we again find the
directory store to remove from, by checking directory_reverse_map for
the parent file.
But, when an item has been moved, the parent file is no longer the same
as when it was added. This means we try to remove the file from the new
parent instead of the old one.
Fortunately we already have a solution for this from the old list view:
NautilusFilesView.remove_file() gets passed the directory to remove the
file from. Let's use it instead of the current parent.
Heavily based on diagnosis and commit message from patch by Corey Berla
Fixes https://gitlab.gnome.org/GNOME/nautilus/-/issues/2784
-rw-r--r-- | src/nautilus-list-base.c | 2 | ||||
-rw-r--r-- | src/nautilus-view-model.c | 6 | ||||
-rw-r--r-- | src/nautilus-view-model.h | 3 |
3 files changed, 7 insertions, 4 deletions
diff --git a/src/nautilus-list-base.c b/src/nautilus-list-base.c index 210b9276b..6a881a399 100644 --- a/src/nautilus-list-base.c +++ b/src/nautilus-list-base.c @@ -1110,7 +1110,7 @@ real_remove_file (NautilusFilesView *files_view, item = nautilus_view_model_get_item_from_file (priv->model, file); if (item != NULL) { - nautilus_view_model_remove_item (priv->model, item); + nautilus_view_model_remove_item (priv->model, item, directory); nautilus_files_view_notify_selection_changed (files_view); } } diff --git a/src/nautilus-view-model.c b/src/nautilus-view-model.c index 7d6afa82d..2c63e62d7 100644 --- a/src/nautilus-view-model.c +++ b/src/nautilus-view-model.c @@ -1,5 +1,6 @@ #include "nautilus-view-model.h" #include "nautilus-view-item.h" +#include "nautilus-directory.h" #include "nautilus-global-preferences.h" struct _NautilusViewModel @@ -392,7 +393,8 @@ nautilus_view_model_get_item_from_file (NautilusViewModel *self, void nautilus_view_model_remove_item (NautilusViewModel *self, - NautilusViewItem *item) + NautilusViewItem *item, + NautilusDirectory *directory) { NautilusFile *file; g_autoptr (NautilusFile) parent = NULL; @@ -400,7 +402,7 @@ nautilus_view_model_remove_item (NautilusViewModel *self, guint i; file = nautilus_view_item_get_file (item); - parent = nautilus_file_get_parent (file); + parent = nautilus_directory_get_corresponding_file (directory); dir_store = get_directory_store (self, parent); if (g_list_store_find (dir_store, item, &i)) { diff --git a/src/nautilus-view-model.h b/src/nautilus-view-model.h index 5f613ca72..718412652 100644 --- a/src/nautilus-view-model.h +++ b/src/nautilus-view-model.h @@ -22,7 +22,8 @@ GQueue * nautilus_view_model_get_items_from_files (NautilusViewModel *self, GQueue *files); /* Don't use inside a loop, use nautilus_view_model_remove_all_items instead. */ void nautilus_view_model_remove_item (NautilusViewModel *self, - NautilusViewItem *item); + NautilusViewItem *item, + NautilusDirectory *directory); void nautilus_view_model_remove_all_items (NautilusViewModel *self); /* Don't use inside a loop, use nautilus_view_model_add_items instead. */ void nautilus_view_model_add_item (NautilusViewModel *self, |