summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatar Héctor Ramón <hector@hecrj.dev>2024-01-31 19:15:24 +0100
committerLibravatar GitHub <noreply@github.com>2024-01-31 19:15:24 +0100
commit8ed3490280a4dd8a1d4e3cd421b1785725f65865 (patch)
treea96da5c4400aaa56e5dcc6bfb3708c51731a9b7a
parentf3145212319fe1376b5ec8d4d439c0b0e6f37bbf (diff)
parentf0a8064fb59e44934f797cef556779b475da6bff (diff)
downloadiced-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.md2
-rw-r--r--renderer/src/geometry.rs16
-rw-r--r--wgpu/src/geometry.rs16
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`].