summaryrefslogtreecommitdiffstats
path: root/widget
diff options
context:
space:
mode:
authorLibravatar Héctor Ramón Jiménez <hector@hecrj.dev>2025-01-27 00:36:21 +0100
committerLibravatar Héctor Ramón Jiménez <hector@hecrj.dev>2025-01-27 00:36:21 +0100
commitcdcfdb2e4e8416f3ebb57d10201d326e76e73c59 (patch)
treefe4dbb65f15967c783876456cd4a8bb35e662c65 /widget
parent24905ebd5d791dce11119a96f1487ee75276a6d0 (diff)
downloadiced-cdcfdb2e4e8416f3ebb57d10201d326e76e73c59.tar.gz
iced-cdcfdb2e4e8416f3ebb57d10201d326e76e73c59.tar.bz2
iced-cdcfdb2e4e8416f3ebb57d10201d326e76e73c59.zip
Implement `scale` support for `image` widget
Diffstat (limited to 'widget')
-rw-r--r--widget/src/image.rs17
1 files changed, 15 insertions, 2 deletions
diff --git a/widget/src/image.rs b/widget/src/image.rs
index f5a9c7f3..6c84ec92 100644
--- a/widget/src/image.rs
+++ b/widget/src/image.rs
@@ -63,6 +63,7 @@ pub struct Image<Handle = image::Handle> {
filter_method: FilterMethod,
rotation: Rotation,
opacity: f32,
+ scale: f32,
}
impl<Handle> Image<Handle> {
@@ -76,6 +77,7 @@ impl<Handle> Image<Handle> {
filter_method: FilterMethod::default(),
rotation: Rotation::default(),
opacity: 1.0,
+ scale: 1.0,
}
}
@@ -119,6 +121,15 @@ impl<Handle> Image<Handle> {
self.opacity = opacity.into();
self
}
+
+ /// Sets the scale of the [`Image`].
+ ///
+ /// The region of the [`Image`] drawn will be scaled from the center by the given scale factor.
+ /// This can be useful to create certain effects and animations, like smooth zoom in / out.
+ pub fn scale(mut self, scale: impl Into<f32>) -> Self {
+ self.scale = scale.into();
+ self
+ }
}
/// Computes the layout of an [`Image`].
@@ -173,6 +184,7 @@ pub fn draw<Renderer, Handle>(
filter_method: FilterMethod,
rotation: Rotation,
opacity: f32,
+ scale: f32,
) where
Renderer: image::Renderer<Handle = Handle>,
Handle: Clone,
@@ -184,12 +196,12 @@ pub fn draw<Renderer, Handle>(
let bounds = layout.bounds();
let adjusted_fit = content_fit.fit(rotated_size, bounds.size());
- let scale = Vector::new(
+ let fit_scale = Vector::new(
adjusted_fit.width / rotated_size.width,
adjusted_fit.height / rotated_size.height,
);
- let final_size = image_size * scale;
+ let final_size = image_size * fit_scale * scale;
let position = match content_fit {
ContentFit::None => Point::new(
@@ -276,6 +288,7 @@ where
self.filter_method,
self.rotation,
self.opacity,
+ self.scale,
);
}
}