From 0dc71357f1680da87ec9d9aee232252982e55170 Mon Sep 17 00:00:00 2001 From: Sophie Herold Date: Fri, 9 Feb 2024 21:19:35 +0100 Subject: [PATCH] window: Add permanently delete shortcut Permanently delete images with Shift + Delete like in Files. Adding this since EOG supported it as well. Closes #323 Part-of: --- data/resources/gtk/help-overlay.ui | 6 ++++++ src/application.rs | 1 + src/window.rs | 23 +++++++++++++++++++---- 3 files changed, 26 insertions(+), 4 deletions(-) diff --git a/data/resources/gtk/help-overlay.ui b/data/resources/gtk/help-overlay.ui index df55e2f..9d831ad 100644 --- a/data/resources/gtk/help-overlay.ui +++ b/data/resources/gtk/help-overlay.ui @@ -27,6 +27,12 @@ Delete + + + Permanently Delete Image + <Shift>Delete + + Toggle Image Properties diff --git a/src/application.rs b/src/application.rs index f65a6be..0503cf8 100644 --- a/src/application.rs +++ b/src/application.rs @@ -158,6 +158,7 @@ impl LpApplication { self.set_accels_for_action("win.print", &["P"]); self.set_accels_for_action("win.copy", &["C"]); self.set_accels_for_action("win.trash", &["Delete", "KP_Delete"]); + self.set_accels_for_action("win.delete", &["Delete", "KP_Delete"]); self.set_accels_for_action("win.show-help-overlay", &["question"]); self.set_accels_for_action("win.leave-fullscreen", &["Escape"]); self.set_accels_for_action("win.toggle-properties", &["F9", "Return"]); diff --git a/src/window.rs b/src/window.rs index 443eb75..1e06ccf 100644 --- a/src/window.rs +++ b/src/window.rs @@ -276,6 +276,10 @@ mod imp { win.trash().await; }); + klass.install_action_async("win.delete", None, |win, _, _| async move { + win.delete().await; + }); + klass.install_action( "win.show-toast", Some(VariantTy::TUPLE), @@ -704,7 +708,7 @@ impl LpWindow { } Err(err) => { if Some(gio::IOErrorEnum::NotSupported) == err.kind::() { - self.delete(&path).await; + self.delete_future(&path).await; } else { log::error!("Failed to delete file {path:?}: {err}"); self.show_toast( @@ -716,16 +720,27 @@ impl LpWindow { } } + /// Delete action called + async fn delete(&self) { + let image_view = self.image_view(); + let Some(path) = image_view.current_file().and_then(|x| x.path()) else { + log::error!("No file to delete"); + return; + }; + + self.delete_future(&path).await; + } + /// Permanently delete image /// - /// Fallback for when trash not available - async fn delete(&self, path: &Path) { + /// Fallback for when trash not available or explicit call with shortcut + async fn delete_future(&self, path: &Path) { let dialog = adw::MessageDialog::builder() .modal(true) .transient_for(self) .heading(gettext("Permanently Delete Image?")) .body(gettext_f( - "The image “{}” can only be deleted permanently.", + "After deleting the image “{}” it will be permanently lost.", [PathBuf::from(&path.file_name().unwrap_or_default()) .display() .to_string()],