diff options
author | 2019-11-10 06:05:20 +0100 | |
---|---|---|
committer | 2019-11-11 03:08:00 +0100 | |
commit | 0240c3981b716c82ecb3364945815335b420a63e (patch) | |
tree | 441eebaa9441649a4e878bde71cdec20d4a67391 /native/src/layout.rs | |
parent | 2303111e09d806ef2a652bddc2b73be6dccf6ae2 (diff) | |
download | iced-0240c3981b716c82ecb3364945815335b420a63e.tar.gz iced-0240c3981b716c82ecb3364945815335b420a63e.tar.bz2 iced-0240c3981b716c82ecb3364945815335b420a63e.zip |
Draft custom layout engine based on `druid`
Diffstat (limited to 'native/src/layout.rs')
-rw-r--r-- | native/src/layout.rs | 75 |
1 files changed, 34 insertions, 41 deletions
diff --git a/native/src/layout.rs b/native/src/layout.rs index 520bcd88..0a744346 100644 --- a/native/src/layout.rs +++ b/native/src/layout.rs @@ -1,57 +1,50 @@ -use crate::Rectangle; - mod limits; +mod node; + +pub mod flex; pub use limits::Limits; +pub use node::Node; -/// The computed bounds of a [`Node`] and its children. -/// -/// This type is provided by the GUI runtime to [`Widget::on_event`] and -/// [`Widget::draw`], describing the layout of the [`Node`] produced by -/// [`Widget::node`]. -/// -/// [`Node`]: struct.Node.html -/// [`Widget::on_event`]: widget/trait.Widget.html#method.on_event -/// [`Widget::draw`]: widget/trait.Widget.html#tymethod.draw -/// [`Widget::node`]: widget/trait.Widget.html#tymethod.node -#[derive(Debug, Clone)] -pub struct Layout { - bounds: Rectangle, - children: Vec<Layout>, +use crate::{Point, Rectangle, Vector}; + +#[derive(Debug, Clone, Copy)] +pub struct Layout<'a> { + position: Point, + node: &'a Node, } -impl Layout { - pub fn new(bounds: Rectangle) -> Self { - Layout { - bounds, - children: Vec::new(), - } +impl<'a> Layout<'a> { + pub(crate) fn new(node: &'a Node) -> Self { + Self::with_offset(Vector::new(0.0, 0.0), node) } - pub fn push(&mut self, mut child: Layout) { - child.bounds.x += self.bounds.x; - child.bounds.y += self.bounds.y; + pub(crate) fn with_offset(offset: Vector, node: &'a Node) -> Self { + let bounds = node.bounds(); - self.children.push(child); + Self { + position: Point::new(bounds.x, bounds.y) + offset, + node, + } } - /// Gets the bounds of the [`Layout`]. - /// - /// The returned [`Rectangle`] describes the position and size of a - /// [`Node`]. - /// - /// [`Layout`]: struct.Layout.html - /// [`Rectangle`]: struct.Rectangle.html - /// [`Node`]: struct.Node.html pub fn bounds(&self) -> Rectangle { - self.bounds + 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`]. - /// - /// [`Layout`]: struct.Layout.html - /// [`Node`]: struct.Node.html - pub fn children(&self) -> impl Iterator<Item = &Layout> { - self.children.iter() + pub fn children(&'a 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, + ) + }) } } |