summaryrefslogtreecommitdiffstats
path: root/src/layout.rs
diff options
context:
space:
mode:
authorLibravatar Héctor Ramón Jiménez <hector0193@gmail.com>2019-07-20 19:12:31 +0200
committerLibravatar Héctor Ramón Jiménez <hector0193@gmail.com>2019-07-20 19:12:31 +0200
commit2b7ad3d50eae48b1963aa8e866e184c41133ca3d (patch)
treeae5b0c851aebb2dd8c01c08620d1cea7aa9d2466 /src/layout.rs
parenteefdcbe06cce97b452ee71ccb6fcd1a423d29075 (diff)
downloadiced-2b7ad3d50eae48b1963aa8e866e184c41133ca3d.tar.gz
iced-2b7ad3d50eae48b1963aa8e866e184c41133ca3d.tar.bz2
iced-2b7ad3d50eae48b1963aa8e866e184c41133ca3d.zip
Decouple `iced` from `coffee`
Diffstat (limited to 'src/layout.rs')
-rw-r--r--src/layout.rs55
1 files changed, 55 insertions, 0 deletions
diff --git a/src/layout.rs b/src/layout.rs
new file mode 100644
index 00000000..011f859a
--- /dev/null
+++ b/src/layout.rs
@@ -0,0 +1,55 @@
+use stretch::result;
+
+use crate::{Point, Rectangle, Vector};
+
+/// 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 produced [`Node`] by
+/// [`Widget::node`].
+///
+/// [`Node`]: struct.Node.html
+/// [`Widget::on_event`]: trait.Widget.html#method.on_event
+/// [`Widget::draw`]: trait.Widget.html#tymethod.draw
+/// [`Widget::node`]: trait.Widget.html#tymethod.node
+#[derive(Debug)]
+pub struct Layout<'a> {
+ layout: &'a result::Layout,
+ position: Point,
+}
+
+impl<'a> Layout<'a> {
+ pub(crate) fn new(layout: &'a result::Layout, parent_position: Point) -> Self {
+ let position = parent_position + Vector::new(layout.location.x, layout.location.y);
+
+ Layout { layout, position }
+ }
+
+ /// Gets the bounds of the [`Layout`].
+ ///
+ /// The returned [`Rectangle`] describes the position and size of a
+ /// [`Node`].
+ ///
+ /// [`Layout`]: struct.Layout.html
+ /// [`Rectangle`]: ../../graphics/struct.Rectangle.html
+ /// [`Node`]: struct.Node.html
+ pub fn bounds(&self) -> Rectangle<f32> {
+ Rectangle {
+ x: self.position.x,
+ y: self.position.y,
+ width: self.layout.size.width,
+ height: self.layout.size.height,
+ }
+ }
+
+ /// Returns an iterator over the [`Layout`] of the children of a [`Node`].
+ ///
+ /// [`Layout`]: struct.Layout.html
+ /// [`Node`]: struct.Node.html
+ pub fn children(&'a self) -> impl Iterator<Item = Layout<'a>> {
+ self.layout
+ .children
+ .iter()
+ .map(move |layout| Layout::new(layout, self.position))
+ }
+}