summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAntónio Fernandes <antoniof@gnome.org>2023-01-14 18:16:04 +0000
committerAntónio Fernandes <antoniof@gnome.org>2023-01-14 18:37:07 +0000
commite13e08a9b87bd467546ef1217687c6c87f5f1f26 (patch)
tree9577aaeb8ecd86e32a1956b98a66171b66ef72ec
parent60bd06138accf14e89cc5a30b756db932f9fa3bc (diff)
downloadnautilus-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.c2
-rw-r--r--src/nautilus-view-model.c6
-rw-r--r--src/nautilus-view-model.h3
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,