diff options
author | Martin Wehner <martin.wehner@gmail.com> | 2005-04-10 23:51:57 +0000 |
---|---|---|
committer | Martin Wehner <mwehner@src.gnome.org> | 2005-04-10 23:51:57 +0000 |
commit | 54b53e35f1827a865d8b88f005a806ab1ed3d1db (patch) | |
tree | 72e1756e3976be728d2ae3ad003f61f4de8c2a9b | |
parent | 0b3b3559952addacf1f62acd2684d1117cc554c8 (diff) | |
download | nautilus-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-- | ChangeLog | 12 | ||||
-rw-r--r-- | src/file-manager/fm-directory-view.c | 20 | ||||
-rw-r--r-- | src/file-manager/fm-list-view.c | 46 |
3 files changed, 53 insertions, 25 deletions
@@ -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); } |