diff --git a/data/resources/edit.css b/data/resources/edit.css new file mode 100644 index 0000000..a59c080 --- /dev/null +++ b/data/resources/edit.css @@ -0,0 +1,3 @@ +.saving-overlay { + background: rgba(25, 25, 25, 0.8); +} \ No newline at end of file diff --git a/data/resources/style.css b/data/resources/style.css index d3af624..358304e 100644 --- a/data/resources/style.css +++ b/data/resources/style.css @@ -1,3 +1,4 @@ +@import 'edit.css'; @import 'edit_crop.css'; :root { diff --git a/src/widgets/edit/crop_selection.rs b/src/widgets/edit/crop_selection.rs index 94f86a1..f3b830d 100644 --- a/src/widgets/edit/crop_selection.rs +++ b/src/widgets/edit/crop_selection.rs @@ -1,4 +1,5 @@ // Copyright (c) 2024-2025 Sophie Herold +// Copyright (c) 2025 Hubert Figuière // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by diff --git a/src/widgets/edit_window.rs b/src/widgets/edit_window.rs index e21e1f1..b796832 100644 --- a/src/widgets/edit_window.rs +++ b/src/widgets/edit_window.rs @@ -42,6 +42,12 @@ mod imp { cancel: TemplateChild, #[template_child] pub(crate) done: TemplateChild, + #[template_child] + saving_revealer: TemplateChild, + #[template_child] + saving_status: TemplateChild, + #[template_child] + saving_info: TemplateChild, #[property(get, construct_only)] original_image: OnceCell, @@ -208,6 +214,7 @@ mod imp { obj.edit_crop().apply_crop(); + self.set_saving_status(Some(gettext("Editing Image"))); let editor = glycin::Editor::new(current_file); if let Some(operations) = obj.operations() { log::debug!("Computing edited image."); @@ -232,6 +239,8 @@ mod imp { ); } Ok(data) => { + self.set_saving_status(Some(gettext("Saving Image"))); + if let Err(err) = new_file .replace_contents_future( data, @@ -255,8 +264,34 @@ mod imp { } } + self.set_saving_status(None); false } + + fn set_saving_status(&self, message: Option) { + let is_saving = message.is_some(); + self.saving_status.set_label(&message.unwrap_or_default()); + self.saving_revealer.set_reveal_child(is_saving); + self.done.set_sensitive(!is_saving); + + if is_saving { + // Show text and spinner delayed + glib::timeout_add_local_once( + std::time::Duration::from_millis( + self.saving_revealer.transition_duration().into(), + ), + glib::clone!( + #[weak(rename_to=imp)] + self, + move || { + imp.saving_info.set_reveal_child(true); + } + ), + ); + } else { + self.saving_info.set_reveal_child(false); + } + } } } diff --git a/src/widgets/edit_window.ui b/src/widgets/edit_window.ui index bb6ac1b..197eccc 100644 --- a/src/widgets/edit_window.ui +++ b/src/widgets/edit_window.ui @@ -4,7 +4,52 @@ raised - + + + + + + crossfade + 500 + + + + + + + crossfade + 500 + + + vertical + center + 18 + + + 64 + 64 + + + + + Preparing to Save Image + + + + + + + + + + + + + false