diff options
| author | 2023-03-09 19:05:38 +0100 | |
|---|---|---|
| committer | 2023-03-09 19:05:38 +0100 | |
| commit | caf2836b1b15bff6e8a2ea72441d67f297eb8707 (patch) | |
| tree | 0ffa0d1d604780999892b88de85ee93e3ed7d539 /core/src/layout.rs | |
| parent | 11b2c3bbe31a43e73a61b9bd9f022233f302ae27 (diff) | |
| parent | 424ac8177309440bbd8efe0dd9f7622cb10807ce (diff) | |
| download | iced-caf2836b1b15bff6e8a2ea72441d67f297eb8707.tar.gz iced-caf2836b1b15bff6e8a2ea72441d67f297eb8707.tar.bz2 iced-caf2836b1b15bff6e8a2ea72441d67f297eb8707.zip | |
Merge pull request #1748 from iced-rs/feature/software-renderer
Software renderer, runtime renderer fallback, and core consolidation
Diffstat (limited to 'core/src/layout.rs')
| -rw-r--r-- | core/src/layout.rs | 65 | 
1 files changed, 65 insertions, 0 deletions
| diff --git a/core/src/layout.rs b/core/src/layout.rs new file mode 100644 index 00000000..04954fb9 --- /dev/null +++ b/core/src/layout.rs @@ -0,0 +1,65 @@ +//! Position your widgets properly. +mod limits; +mod node; + +pub mod flex; + +pub use limits::Limits; +pub use node::Node; + +use crate::{Point, Rectangle, Vector}; + +/// The bounds of a [`Node`] and its children, using absolute coordinates. +#[derive(Debug, Clone, Copy)] +pub struct Layout<'a> { +    position: Point, +    node: &'a Node, +} + +impl<'a> Layout<'a> { +    /// Creates a new [`Layout`] for the given [`Node`] at the origin. +    pub fn new(node: &'a Node) -> Self { +        Self::with_offset(Vector::new(0.0, 0.0), node) +    } + +    /// Creates a new [`Layout`] for the given [`Node`] with the provided offset +    /// from the origin. +    pub fn with_offset(offset: Vector, node: &'a Node) -> Self { +        let bounds = node.bounds(); + +        Self { +            position: Point::new(bounds.x, bounds.y) + offset, +            node, +        } +    } + +    /// Returns the position of the [`Layout`]. +    pub fn position(&self) -> Point { +        self.position +    } + +    /// Returns the bounds of the [`Layout`]. +    /// +    /// The returned [`Rectangle`] describes the position and size of a +    /// [`Node`]. +    pub fn bounds(&self) -> Rectangle { +        let bounds = self.node.bounds(); + +        Rectangle { +            x: self.position.x, +            y: self.position.y, +            width: bounds.width, +            height: bounds.height, +        } +    } + +    /// Returns an iterator over the [`Layout`] of the children of a [`Node`]. +    pub fn children(self) -> impl Iterator<Item = Layout<'a>> { +        self.node.children().iter().map(move |node| { +            Layout::with_offset( +                Vector::new(self.position.x, self.position.y), +                node, +            ) +        }) +    } +} | 
