Draft custom layout engine based on druid
This commit is contained in:
parent
2303111e09
commit
0240c3981b
38 changed files with 974 additions and 249 deletions
|
|
@ -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(crate) fn with_offset(offset: Vector, node: &'a Node) -> Self {
|
||||
let bounds = node.bounds();
|
||||
|
||||
Self {
|
||||
position: Point::new(bounds.x, bounds.y) + offset,
|
||||
node,
|
||||
}
|
||||
}
|
||||
|
||||
pub fn push(&mut self, mut child: Layout) {
|
||||
child.bounds.x += self.bounds.x;
|
||||
child.bounds.y += self.bounds.y;
|
||||
|
||||
self.children.push(child);
|
||||
}
|
||||
|
||||
/// 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,
|
||||
)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue