1#[cfg(not(feature = "std"))]
2use alloc::{vec, vec::Vec};
3
4use std::cell::RefCell;
5use std::rc::Rc;
6use std::rc::Weak;
7
8use crate::algo;
9use crate::geometry::Size;
10use crate::number::Number;
11use crate::result::{Cache, Layout, Result};
12use crate::style::*;
13
14type MeasureFunc = Box<Fn(Size<Number>) -> Result<Size<f32>>>;
15
16pub(crate) struct InternalNode {
17 pub(crate) style: Style,
18 pub(crate) parents: Vec<Weak<RefCell<InternalNode>>>,
19 pub(crate) children: Vec<Rc<RefCell<InternalNode>>>,
20 pub(crate) measure: Option<MeasureFunc>,
21 pub(crate) layout_cache: RefCell<Option<Cache>>,
22}
23
24pub struct Node(Rc<RefCell<InternalNode>>);
25
26impl Node {
27 pub fn new(style: Style, children: Vec<&Node>) -> Node {
28 let mut parent = Node(Rc::new(RefCell::new(InternalNode {
29 style,
30 parents: vec![],
31 children: vec![],
32 measure: None,
33 layout_cache: RefCell::new(None),
34 })));
35
36 for child in children {
37 parent.add_child(child);
38 }
39
40 parent
41 }
42
43 pub fn add_child(&mut self, child: &Node) {
44 child.0.borrow_mut().parents.push(Rc::downgrade(&self.0));
45 self.0.borrow_mut().children.push(Rc::clone(&child.0));
46 }
47
48 // pub fn children(&self) -> Vec<Node> {}
49
50 // pub fn mark_dirty(&mut self) {}
51
52 // pub fn set_style(&mut self, Style) {}
53
54 // pub fn set_children(&mut self, Vec<Node>) {}
55
56 // pub fn add_child(&mut self, Node) {}
57
58 // pub fn remove_child(&mut self, Node) -> Node {}
59
60 // pub fn replace_child(&mut self, Node, u32) -> Node {}
61
62 pub fn compute_layout(&self, size: Size<Number>) -> Result<Layout> {
63 algo::compute(&self.0.borrow(), size)
64 }
65}