diff --git a/src/widgets/edit/crop.rs b/src/widgets/edit/crop.rs index 87ad0e2..1a9f609 100644 --- a/src/widgets/edit/crop.rs +++ b/src/widgets/edit/crop.rs @@ -18,7 +18,6 @@ //! Shows an resizable cropping selection use std::cell::OnceCell; -use std::marker::PhantomData; use adw::prelude::*; use adw::subclass::prelude::*; @@ -74,8 +73,6 @@ mod imp { #[property(get, construct_only)] original_image: OnceCell, - #[property(get=Self::cropped)] - cropped: PhantomData, #[property(get, set)] child: OnceCell, @@ -141,6 +138,14 @@ mod imp { obj.insert_action_group("edit-crop", Some(&actions)); obj.action_set_enabled("edit-crop.reset", false); + + self.selection.connect_cropped_notify(glib::clone!( + #[weak] + obj, + move |_| { + obj.action_set_enabled("edit-crop.reset", obj.imp().is_reset_enabled()); + } + )); } fn dispose(&self) { @@ -152,10 +157,6 @@ mod imp { impl BinImpl for LpEditCrop {} impl LpEditCrop { - fn cropped(&self) -> bool { - self.selection.is_cropped() - } - fn reset_selection(&self) { self.selection.reset(); } @@ -246,6 +247,10 @@ mod imp { obj.action_set_enabled("edit-crop.reset", true); } } + + fn is_reset_enabled(&self) -> bool { + self.obj().edit_window().operations().is_some() || self.selection.cropped() + } } } diff --git a/src/widgets/edit/crop_selection.rs b/src/widgets/edit/crop_selection.rs index d5bd1b3..c917c04 100644 --- a/src/widgets/edit/crop_selection.rs +++ b/src/widgets/edit/crop_selection.rs @@ -214,6 +214,9 @@ mod imp { /// Last selected crop area crop_area_image_coord: Cell>, + #[property(get)] + cropped: Cell, + #[property(get, set=Self::set_crop_x, explicit_notify)] crop_x: Cell, #[property(get, set=Self::set_crop_y, explicit_notify)] @@ -391,6 +394,11 @@ mod imp { self.update_apply_crop_visibility(); + if self.is_cropped() != self.cropped.get() { + self.cropped.set(self.is_cropped()); + self.obj().notify_cropped(); + } + // Selection area self.selection_overlay.allocate( width as i32, @@ -925,7 +933,7 @@ mod imp { } fn update_apply_crop_visibility(&self) { - let visibile = self.obj().is_cropped() + let visibile = self.is_cropped() && self.selection_in_resize.get().is_none() && self.selection_in_move.get().is_none(); @@ -944,7 +952,7 @@ mod imp { pub(super) fn crop_area_image_coord(&self) -> Option<(u32, u32, u32, u32)> { let obj = self.obj(); - if !obj.is_cropped() { + if !self.is_cropped() { return None; } @@ -1010,6 +1018,7 @@ mod imp { && obj.crop_y() == 0. && obj.crop_width() as i32 == self.total_width() && obj.crop_height() as i32 == self.total_height(); + !untouched } @@ -1044,8 +1053,4 @@ impl LpEditCropSelection { pub fn image(&self) -> LpImage { self.imp().image() } - - pub fn is_cropped(&self) -> bool { - self.imp().is_cropped() - } } diff --git a/src/widgets/edit_window.rs b/src/widgets/edit_window.rs index e1ed7ca..85eacbc 100644 --- a/src/widgets/edit_window.rs +++ b/src/widgets/edit_window.rs @@ -120,11 +120,13 @@ mod imp { let obj = self.obj(); - obj.edit_crop().connect_cropped_notify(glib::clone!( - #[weak] - obj, - move |_| obj.imp().done.set_sensitive(obj.is_done_sensitive()) - )); + obj.edit_crop() + .selection() + .connect_cropped_notify(glib::clone!( + #[weak] + obj, + move |_| obj.imp().done.set_sensitive(obj.is_done_sensitive()) + )); } } impl BinImpl for LpEditWindow {} @@ -376,7 +378,7 @@ impl LpEditWindow { .borrow() .as_ref() .is_some_and(|x| !x.operations().is_empty()) - || self.edit_crop().cropped() + || self.edit_crop().selection().cropped() } pub fn add_operation(&self, operation: glycin::Operation) {