diff options
author | 2024-01-31 19:15:24 +0100 | |
---|---|---|
committer | 2024-01-31 19:15:24 +0100 | |
commit | 8ed3490280a4dd8a1d4e3cd421b1785725f65865 (patch) | |
tree | a96da5c4400aaa56e5dcc6bfb3708c51731a9b7a | |
parent | f3145212319fe1376b5ec8d4d439c0b0e6f37bbf (diff) | |
parent | f0a8064fb59e44934f797cef556779b475da6bff (diff) | |
download | iced-8ed3490280a4dd8a1d4e3cd421b1785725f65865.tar.gz iced-8ed3490280a4dd8a1d4e3cd421b1785725f65865.tar.bz2 iced-8ed3490280a4dd8a1d4e3cd421b1785725f65865.zip |
Merge pull request #1994 from MichalLebeda/frame-fn-returns
Add return values to ```Frame::with_clip()``` and ```Frame::with_save()```
-rw-r--r-- | CHANGELOG.md | 2 | ||||
-rw-r--r-- | renderer/src/geometry.rs | 16 | ||||
-rw-r--r-- | wgpu/src/geometry.rs | 16 |
3 files changed, 26 insertions, 8 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md index d302b5a7..6cf01a82 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -44,6 +44,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Use workspace dependencies and package inheritance. [#2069](https://github.com/iced-rs/iced/pull/2069) - Update `wgpu` to `0.17`. [#2065](https://github.com/iced-rs/iced/pull/2065) - Support automatic style type casting for `Button`. [#2046](https://github.com/iced-rs/iced/pull/2046) +- `with_clip` and `with_save` in `Frame` can now return the data of the provided closure. [#1994](https://github.com/iced-rs/iced/pull/1994) ### Fixed - Clipping of `TextInput` selection. [#2199](https://github.com/iced-rs/iced/pull/2199) @@ -99,6 +100,7 @@ Many thanks to... - @joshuamegnauth54 - @lufte - @matze +- @MichalLebeda - @MrAntix - @nicksenger - @Nisatru diff --git a/renderer/src/geometry.rs b/renderer/src/geometry.rs index 19ac87da..cd2140dc 100644 --- a/renderer/src/geometry.rs +++ b/renderer/src/geometry.rs @@ -111,12 +111,14 @@ impl Frame { /// This method is useful to compose transforms and perform drawing /// operations in different coordinate systems. #[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()); - f(self); + let result = f(self); delegate!(self, frame, frame.pop_transform()); + + result } /// 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 /// clipped. #[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 { Self::TinySkia(_) => Self::TinySkia( 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); @@ -152,6 +158,8 @@ impl Frame { #[allow(unreachable_patterns)] _ => unreachable!(), }; + + result } /// Applies a translation to the current transform of the [`Frame`]. diff --git a/wgpu/src/geometry.rs b/wgpu/src/geometry.rs index 4d7f443e..a4d4fb1f 100644 --- a/wgpu/src/geometry.rs +++ b/wgpu/src/geometry.rs @@ -388,12 +388,14 @@ impl Frame { /// This method is useful to compose transforms and perform drawing /// operations in different coordinate systems. #[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(); - f(self); + let result = f(self); self.pop_transform(); + + result } /// 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 /// clipped. #[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()); - f(&mut frame); + let result = f(&mut frame); let origin = Point::new(region.x, region.y); self.clip(frame, origin); + + result } /// Draws the clipped contents of the given [`Frame`] with origin at the given [`Point`]. |