summaryrefslogtreecommitdiffstats
path: root/native/src/layout.rs
diff options
context:
space:
mode:
authorLibravatar Héctor Ramón Jiménez <hector0193@gmail.com>2019-11-10 06:05:20 +0100
committerLibravatar Héctor Ramón Jiménez <hector0193@gmail.com>2019-11-11 03:08:00 +0100
commit0240c3981b716c82ecb3364945815335b420a63e (patch)
tree441eebaa9441649a4e878bde71cdec20d4a67391 /native/src/layout.rs
parent2303111e09d806ef2a652bddc2b73be6dccf6ae2 (diff)
downloadiced-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.rs75
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,
+ )
+ })
}
}