From 8bb6f8da8809255a5da43438862465288a514b6f Mon Sep 17 00:00:00 2001 From: Sophie Herold Date: Fri, 31 Jan 2025 13:49:20 +0100 Subject: [PATCH] edit_window: Add save and cancel shortcuts --- data/resources/gtk/help-overlay.ui | 24 +++++++++ .../added-edit-save-and-cancel-shortcuts | 1 + src/widgets/edit_window.rs | 50 +++++++++++++++---- src/widgets/edit_window.ui | 6 +++ 4 files changed, 70 insertions(+), 11 deletions(-) create mode 100644 news.d/48.beta/added-edit-save-and-cancel-shortcuts diff --git a/data/resources/gtk/help-overlay.ui b/data/resources/gtk/help-overlay.ui index f5f9ce6..81026f6 100644 --- a/data/resources/gtk/help-overlay.ui +++ b/data/resources/gtk/help-overlay.ui @@ -286,6 +286,30 @@ Editing + + + Open Editing View + E + + + + + Replace Original + <Ctrl>S + + + + + Save As + <Ctrl><Shift>S + + + + + Cancel + Escape + + Rotate Clockwise diff --git a/news.d/48.beta/added-edit-save-and-cancel-shortcuts b/news.d/48.beta/added-edit-save-and-cancel-shortcuts new file mode 100644 index 0000000..53a4d5f --- /dev/null +++ b/news.d/48.beta/added-edit-save-and-cancel-shortcuts @@ -0,0 +1 @@ +edit: `Ctrl+S` and `Ctrl+Shift+S` shortcuts save images and `Esc` to exit the editing view. diff --git a/src/widgets/edit_window.rs b/src/widgets/edit_window.rs index 9a5e298..b985347 100644 --- a/src/widgets/edit_window.rs +++ b/src/widgets/edit_window.rs @@ -48,6 +48,8 @@ mod imp { saving_status: TemplateChild, #[template_child] saving_info: TemplateChild, + #[template_child] + shortcut_controller: TemplateChild, #[property(get, construct_only)] original_image: OnceCell, @@ -82,6 +84,10 @@ mod imp { async move { obj.imp().save_overwrite().await } )); }); + + klass.install_action("edit.cancel", None, move |obj, _, _| { + obj.imp().cancel(); + }); } fn instance_init(obj: &glib::subclass::InitializingObject) { @@ -96,17 +102,6 @@ mod imp { let obj = self.obj(); - self.cancel.connect_clicked(glib::clone!( - #[weak] - obj, - move |_| { - if let Some(cancellable) = obj.imp().save_cancellable.replace(None) { - cancellable.cancel(); - } - obj.window().show_image(); - } - )); - glib::spawn_future_local(glib::clone!( #[weak] obj, @@ -115,6 +110,30 @@ mod imp { obj.action_set_enabled("edit.save-overwrite", can_trash); } )); + + self.shortcut_controller.add_shortcut(gtk::Shortcut::new( + Some(gtk::KeyvalTrigger::new( + gdk::Key::S, + gdk::ModifierType::CONTROL_MASK, + )), + Some(gtk::NamedAction::new("edit.save-overwrite")), + )); + + self.shortcut_controller.add_shortcut(gtk::Shortcut::new( + Some(gtk::KeyvalTrigger::new( + gdk::Key::S, + gdk::ModifierType::CONTROL_MASK.union(gdk::ModifierType::SHIFT_MASK), + )), + Some(gtk::NamedAction::new("edit.save-copy")), + )); + + self.shortcut_controller.add_shortcut(gtk::Shortcut::new( + Some(gtk::KeyvalTrigger::new( + gdk::Key::Escape, + gdk::ModifierType::NO_MODIFIER_MASK, + )), + Some(gtk::NamedAction::new("edit.cancel")), + )); } } @@ -136,6 +155,15 @@ mod imp { impl BinImpl for LpEditWindow {} impl LpEditWindow { + fn cancel(&self) { + let obj = self.obj(); + + if let Some(cancellable) = obj.imp().save_cancellable.replace(None) { + cancellable.cancel(); + } + obj.window().show_image(); + } + async fn save_copy(&self) { let obj = self.obj(); self.done.popdown(); diff --git a/src/widgets/edit_window.ui b/src/widgets/edit_window.ui index a0003b2..8df7adc 100644 --- a/src/widgets/edit_window.ui +++ b/src/widgets/edit_window.ui @@ -1,6 +1,11 @@