Add return values to Frame::with_clip() and Frame::with_save()

This commit is contained in:
Michal Lebeda 2023-08-02 14:35:53 +02:00 committed by Héctor Ramón Jiménez
parent 5540ac07e4
commit f1c63398b3
No known key found for this signature in database
GPG key ID: 7CC46565708259A7
2 changed files with 24 additions and 8 deletions

View file

@ -111,12 +111,14 @@ impl Frame {
/// This method is useful to compose transforms and perform drawing /// This method is useful to compose transforms and perform drawing
/// operations in different coordinate systems. /// operations in different coordinate systems.
#[inline] #[inline]
pub fn with_save(&mut self, f: impl FnOnce(&mut Frame)) { pub fn with_save<R>(&mut self, f: impl FnOnce(&mut Frame) -> R) -> R {
delegate!(self, frame, frame.push_transform()); delegate!(self, frame, frame.push_transform());
f(self); let result = f(self);
delegate!(self, frame, frame.pop_transform()); delegate!(self, frame, frame.pop_transform());
result
} }
/// Executes the given drawing operations within a [`Rectangle`] region, /// Executes the given drawing operations within a [`Rectangle`] region,
@ -126,7 +128,11 @@ impl Frame {
/// This method is useful to perform drawing operations that need to be /// This method is useful to perform drawing operations that need to be
/// clipped. /// clipped.
#[inline] #[inline]
pub fn with_clip(&mut self, region: Rectangle, f: impl FnOnce(&mut Frame)) { pub fn with_clip<R>(
&mut self,
region: Rectangle,
f: impl FnOnce(&mut Frame) -> R,
) -> R {
let mut frame = match self { let mut frame = match self {
Self::TinySkia(_) => Self::TinySkia( Self::TinySkia(_) => Self::TinySkia(
iced_tiny_skia::geometry::Frame::new(region.size()), iced_tiny_skia::geometry::Frame::new(region.size()),
@ -137,7 +143,7 @@ impl Frame {
} }
}; };
f(&mut frame); let result = f(&mut frame);
let origin = Point::new(region.x, region.y); let origin = Point::new(region.x, region.y);
@ -152,6 +158,8 @@ impl Frame {
#[allow(unreachable_patterns)] #[allow(unreachable_patterns)]
_ => unreachable!(), _ => unreachable!(),
}; };
result
} }
/// Applies a translation to the current transform of the [`Frame`]. /// Applies a translation to the current transform of the [`Frame`].

View file

@ -388,12 +388,14 @@ impl Frame {
/// This method is useful to compose transforms and perform drawing /// This method is useful to compose transforms and perform drawing
/// operations in different coordinate systems. /// operations in different coordinate systems.
#[inline] #[inline]
pub fn with_save(&mut self, f: impl FnOnce(&mut Frame)) { pub fn with_save<R>(&mut self, f: impl FnOnce(&mut Frame) -> R) -> R {
self.push_transform(); self.push_transform();
f(self); let result = f(self);
self.pop_transform(); self.pop_transform();
result
} }
/// Pushes the current transform in the transform stack. /// Pushes the current transform in the transform stack.
@ -413,14 +415,20 @@ impl Frame {
/// This method is useful to perform drawing operations that need to be /// This method is useful to perform drawing operations that need to be
/// clipped. /// clipped.
#[inline] #[inline]
pub fn with_clip(&mut self, region: Rectangle, f: impl FnOnce(&mut Frame)) { pub fn with_clip<R>(
&mut self,
region: Rectangle,
f: impl FnOnce(&mut Frame) -> R,
) -> R {
let mut frame = Frame::new(region.size()); let mut frame = Frame::new(region.size());
f(&mut frame); let result = f(&mut frame);
let origin = Point::new(region.x, region.y); let origin = Point::new(region.x, region.y);
self.clip(frame, origin); self.clip(frame, origin);
result
} }
/// Draws the clipped contents of the given [`Frame`] with origin at the given [`Point`]. /// Draws the clipped contents of the given [`Frame`] with origin at the given [`Point`].