summaryrefslogtreecommitdiffstats
path: root/core/src/layout.rs
diff options
context:
space:
mode:
authorLibravatar Bingus <shankern@protonmail.com>2023-07-12 12:23:18 -0700
committerLibravatar Bingus <shankern@protonmail.com>2023-07-12 12:23:18 -0700
commit633f405f3f78bc7f82d2b2061491b0e011137451 (patch)
tree5ebfc1f45d216a5c14a90492563599e6969eab4d /core/src/layout.rs
parent41836dd80d0534608e7aedfbf2319c540a23de1a (diff)
parent21bd51426d900e271206f314e0c915dd41065521 (diff)
downloadiced-633f405f3f78bc7f82d2b2061491b0e011137451.tar.gz
iced-633f405f3f78bc7f82d2b2061491b0e011137451.tar.bz2
iced-633f405f3f78bc7f82d2b2061491b0e011137451.zip
Merge remote-tracking branch 'origin/master' into feat/multi-window-support
# Conflicts: # Cargo.toml # core/src/window/icon.rs # core/src/window/id.rs # core/src/window/position.rs # core/src/window/settings.rs # examples/integration/src/main.rs # examples/integration_opengl/src/main.rs # glutin/src/application.rs # native/src/subscription.rs # native/src/window.rs # runtime/src/window/action.rs # src/lib.rs # src/window.rs # winit/Cargo.toml # winit/src/application.rs # winit/src/icon.rs # winit/src/settings.rs # winit/src/window.rs
Diffstat (limited to 'core/src/layout.rs')
-rw-r--r--core/src/layout.rs65
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,
+ )
+ })
+ }
+}