// Copyright © SixtyFPS GmbH // SPDX-License-Identifier: GPL-3.0-only OR LicenseRef-Slint-commercial use i_slint_core::Coord; pub struct PhysicalPx; pub type PhysicalLength = euclid::Length; pub type PhysicalRect = euclid::Rect; pub type PhysicalSize = euclid::Size2D; pub type PhysicalPoint = euclid::Point2D; pub struct LogicalPx; pub type LogicalLength = euclid::Length; pub type LogicalRect = euclid::Rect; pub type LogicalPoint = euclid::Point2D; pub type LogicalSize = euclid::Size2D; pub type ScaleFactor = euclid::Scale; pub trait SizeLengths { type LengthType; fn width_length(&self) -> Self::LengthType; fn height_length(&self) -> Self::LengthType; } impl SizeLengths for euclid::Size2D { type LengthType = euclid::Length; fn width_length(&self) -> Self::LengthType { euclid::Length::new(self.width) } fn height_length(&self) -> Self::LengthType { euclid::Length::new(self.height) } } pub trait PointLengths { type LengthType; fn x_length(&self) -> Self::LengthType; fn y_length(&self) -> Self::LengthType; } impl PointLengths for euclid::Point2D { type LengthType = euclid::Length; fn x_length(&self) -> Self::LengthType { euclid::Length::new(self.x) } fn y_length(&self) -> Self::LengthType { euclid::Length::new(self.y) } } pub trait RectLengths { type SizeType; type LengthType; fn size_length(&self) -> Self::SizeType; fn width_length(&self) -> Self::LengthType; fn height_length(&self) -> Self::LengthType; } impl RectLengths for euclid::Rect { type LengthType = euclid::Length; type SizeType = euclid::Size2D; fn size_length(&self) -> Self::SizeType { euclid::Size2D::new(self.size.width, self.size.height) } fn width_length(&self) -> Self::LengthType { self.size_length().width_length() } fn height_length(&self) -> Self::LengthType { self.size_length().height_length() } } pub trait LogicalItemGeometry { fn logical_geometry(self: core::pin::Pin<&Self>) -> LogicalRect; } impl LogicalItemGeometry for T { fn logical_geometry(self: core::pin::Pin<&Self>) -> LogicalRect { LogicalRect::from_untyped(&self.geometry()) } }