summaryrefslogtreecommitdiffstats
path: root/core/src/rotation.rs
diff options
context:
space:
mode:
Diffstat (limited to 'core/src/rotation.rs')
-rw-r--r--core/src/rotation.rs37
1 files changed, 37 insertions, 0 deletions
diff --git a/core/src/rotation.rs b/core/src/rotation.rs
new file mode 100644
index 00000000..821aa494
--- /dev/null
+++ b/core/src/rotation.rs
@@ -0,0 +1,37 @@
+//! Control the rotation of some content (like an image) with the `RotationLayout` within a
+//! space.
+use crate::Size;
+
+/// The strategy used to rotate the content.
+///
+/// This is used to control the behavior of the layout when the content is rotated
+/// by a certain angle.
+#[derive(Debug, Hash, Clone, Copy, PartialEq, Eq)]
+pub enum RotationLayout {
+ /// The layout is kept exactly as it was before the rotation.
+ ///
+ /// This is especially useful when used for animations, as it will avoid the
+ /// layout being shifted or resized when smoothly i.e. an icon.
+ Keep,
+ /// The layout is adjusted to fit the rotated content.
+ ///
+ /// This allows you to rotate an image and have the layout adjust to fit the new
+ /// size of the image.
+ Change,
+}
+
+impl RotationLayout {
+ /// Applies the rotation to the layout while respecting the [`RotationLayout`] strategy.
+ /// The rotation is given in radians.
+ pub fn apply_to_size(&self, size: Size, rotation: f32) -> Size {
+ match self {
+ Self::Keep => size,
+ Self::Change => Size {
+ width: (size.width * rotation.cos()).abs()
+ + (size.height * rotation.sin()).abs(),
+ height: (size.width * rotation.sin()).abs()
+ + (size.height * rotation.cos()).abs(),
+ },
+ }
+ }
+}