//! Datastructures used to represent layouts in the compiler use crate::expression_tree::{Expression, Path}; use crate::object_tree::ElementRc; use crate::passes::ExpressionFieldsVisitor; #[derive(Default, Debug)] pub struct LayoutConstraints { pub grids: Vec, pub paths: Vec, } impl ExpressionFieldsVisitor for LayoutConstraints { fn visit_expressions(&mut self, mut visitor: impl FnMut(&mut Expression)) { self.grids.iter_mut().for_each(|l| l.visit_expressions(&mut visitor)); self.paths.iter_mut().for_each(|l| l.visit_expressions(&mut visitor)); } } /// An element in a GridLayout #[derive(Debug)] pub struct GridLayoutElement { pub col: u16, pub row: u16, pub colspan: u16, pub rowspan: u16, pub item: ElementRc, } /// Internal representation of a grid layout #[derive(Debug)] pub struct GridLayout { /// All the elements will be layout within that element. /// /// FIXME: This should not be implemented like that instead there should be pub within: ElementRc, pub elems: Vec, pub x_reference: Box, pub y_reference: Box, } impl ExpressionFieldsVisitor for GridLayout { fn visit_expressions(&mut self, mut visitor: impl FnMut(&mut Expression)) { visitor(&mut self.x_reference); visitor(&mut self.y_reference); } } /// Internal representation of a path layout #[derive(Debug)] pub struct PathLayout { pub path: Path, pub elements: Vec, pub x_reference: Box, pub y_reference: Box, pub width_reference: Box, pub height_reference: Box, pub offset_reference: Box, } impl ExpressionFieldsVisitor for PathLayout { fn visit_expressions(&mut self, mut visitor: impl FnMut(&mut Expression)) { visitor(&mut self.x_reference); visitor(&mut self.y_reference); visitor(&mut self.width_reference); visitor(&mut self.height_reference); visitor(&mut self.offset_reference); } }