summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Wehner <martin.wehner@gmail.com>2005-04-10 23:51:57 +0000
committerMartin Wehner <mwehner@src.gnome.org>2005-04-10 23:51:57 +0000
commit54b53e35f1827a865d8b88f005a806ab1ed3d1db (patch)
tree72e1756e3976be728d2ae3ad003f61f4de8c2a9b
parent0b3b3559952addacf1f62acd2684d1117cc554c8 (diff)
downloadnautilus-54b53e35f1827a865d8b88f005a806ab1ed3d1db.tar.gz
Remember if the current selection was already removed and don't try to
2005-04-11 Martin Wehner <martin.wehner@gmail.com> * src/file-manager/fm-directory-view.c: (trash_or_delete_selected_files), (fm_directory_view_notify_selection_changed): Remember if the current selection was already removed and don't try to remove it again. * src/file-manager/fm-list-view.c: (fm_list_view_remove_file): Only set a new selection if the removal affects the current selection. Free the stored selection path only when setting a new one.
-rw-r--r--ChangeLog12
-rw-r--r--src/file-manager/fm-directory-view.c20
-rw-r--r--src/file-manager/fm-list-view.c46
3 files changed, 53 insertions, 25 deletions
diff --git a/ChangeLog b/ChangeLog
index ae6133fae..42d4ef399 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,15 @@
+2005-04-11 Martin Wehner <martin.wehner@gmail.com>
+
+ * src/file-manager/fm-directory-view.c:
+ (trash_or_delete_selected_files),
+ (fm_directory_view_notify_selection_changed):
+ Remember if the current selection was already removed
+ and don't try to remove it again.
+
+ * src/file-manager/fm-list-view.c: (fm_list_view_remove_file):
+ Only set a new selection if the removal affects the current selection.
+ Free the stored selection path only when setting a new one.
+
2005-04-10 Martin Wehner <martin.wehner@gmail.com>
* src/file-manager/fm-directory-view.c:
diff --git a/src/file-manager/fm-directory-view.c b/src/file-manager/fm-directory-view.c
index ec7da2468..97dcd0f4b 100644
--- a/src/file-manager/fm-directory-view.c
+++ b/src/file-manager/fm-directory-view.c
@@ -224,6 +224,8 @@ struct FMDirectoryViewDetails
gboolean batching_selection_level;
gboolean selection_changed_while_batched;
+ gboolean selection_was_removed;
+
gboolean metadata_for_directory_as_file_pending;
gboolean metadata_for_files_in_directory_pending;
@@ -768,11 +770,17 @@ static void
trash_or_delete_selected_files (FMDirectoryView *view)
{
GList *selection;
-
- selection = fm_directory_view_get_selection (view);
- trash_or_delete_files (view, selection);
- fm_directory_view_set_selection (view, NULL);
- nautilus_file_list_free (selection);
+
+ /* This might be rapidly called multiple times for the same selection
+ * when using keybindings. So we remember if the current selection
+ * was already removed (but the view doesn't know about it yet).
+ */
+ if (!view->details->selection_was_removed) {
+ selection = fm_directory_view_get_selection (view);
+ trash_or_delete_files (view, selection);
+ nautilus_file_list_free (selection);
+ view->details->selection_was_removed = TRUE;
+ }
}
static gboolean
@@ -6494,6 +6502,8 @@ fm_directory_view_notify_selection_changed (FMDirectoryView *view)
g_return_if_fail (FM_IS_DIRECTORY_VIEW (view));
+ view->details->selection_was_removed = FALSE;
+
if (!view->details->selection_change_is_due_to_shell) {
view->details->send_selection_change_to_shell = TRUE;
}
diff --git a/src/file-manager/fm-list-view.c b/src/file-manager/fm-list-view.c
index cb0f50238..96006e07f 100644
--- a/src/file-manager/fm-list-view.c
+++ b/src/file-manager/fm-list-view.c
@@ -1417,11 +1417,13 @@ static void
fm_list_view_remove_file (FMDirectoryView *view, NautilusFile *file)
{
GtkTreePath *path;
+ GtkTreePath *file_path;
GtkTreeIter iter;
GtkTreeIter temp_iter;
GtkTreeRowReference* row_reference;
FMListView *list_view;
GtkTreeModel* tree_model;
+ GtkTreeSelection *selection;
path = NULL;
row_reference = NULL;
@@ -1429,32 +1431,36 @@ fm_list_view_remove_file (FMDirectoryView *view, NautilusFile *file)
tree_model = GTK_TREE_MODEL(list_view->details->model);
if(fm_list_model_get_tree_iter_from_file (list_view->details->model, file, &iter)) {
- temp_iter = iter;
-
- /* get reference for next element in the list view. If the element to be deleted is the
- * last one, get reference to previous element. If there is only one element in view
- * no need to select anything. */
-
- if(gtk_tree_model_iter_next (tree_model, &iter)) {
- path = gtk_tree_model_get_path (tree_model, &iter);
- row_reference = gtk_tree_row_reference_new (tree_model, path);
- } else {
- path = gtk_tree_model_get_path (tree_model, &temp_iter);
- if(gtk_tree_path_prev (path)) {
- row_reference = gtk_tree_row_reference_new (tree_model, path);
+ selection = gtk_tree_view_get_selection (list_view->details->tree_view);
+ file_path = gtk_tree_model_get_path (tree_model, &iter);
+
+ if (gtk_tree_selection_path_is_selected (selection, file_path)) {
+ /* get reference for next element in the list view. If the element to be deleted is the
+ * last one, get reference to previous element. If there is only one element in view
+ * no need to select anything.
+ */
+ temp_iter = iter;
+
+ if (gtk_tree_model_iter_next (tree_model, &iter)) {
+ path = gtk_tree_model_get_path (tree_model, &iter);
+ row_reference = gtk_tree_row_reference_new (tree_model, path);
+ } else {
+ path = gtk_tree_model_get_path (tree_model, &temp_iter);
+ if (gtk_tree_path_prev (path)) {
+ row_reference = gtk_tree_row_reference_new (tree_model, path);
+ }
}
+ gtk_tree_path_free (path);
}
- gtk_tree_path_free (path);
+ gtk_tree_path_free (file_path);
fm_list_model_remove_file (list_view->details->model, file);
- if (list_view->details->new_selection_path) {
- gtk_tree_path_free (list_view->details->new_selection_path);
- list_view->details->new_selection_path = NULL;
- }
-
- if(gtk_tree_row_reference_valid(row_reference)) {
+ if (gtk_tree_row_reference_valid (row_reference)) {
+ if (list_view->details->new_selection_path) {
+ gtk_tree_path_free (list_view->details->new_selection_path);
+ }
list_view->details->new_selection_path = gtk_tree_row_reference_get_path (row_reference);
}