Prepare for v0.10.0 release (#940)
1use rand::distr::uniform::SampleRange;
2use rand::Rng;
3use rand_chacha::ChaCha8Rng;
4use taffy::style::Style as TaffyStyle;
5use taffy::tree::NodeId as TaffyNodeId;
6use taffy::TaffyTree;
7
8use super::{BuildTree, BuildTreeExt, GenStyle};
9
10pub struct TaffyTreeBuilder<R: Rng, G: GenStyle<TaffyStyle>> {
11 rng: R,
12 style_generator: G,
13 tree: TaffyTree,
14 root: TaffyNodeId,
15}
16
17// Implement the BuildTree trait
18impl<R: Rng, G: GenStyle<TaffyStyle>> BuildTree<R, G> for TaffyTreeBuilder<R, G> {
19 const NAME: &'static str = "Taffy";
20 type Tree = TaffyTree;
21 type Node = TaffyNodeId;
22
23 fn with_rng(mut rng: R, mut style_generator: G) -> Self {
24 let mut tree = TaffyTree::new();
25 let root = tree.new_leaf(style_generator.create_root_style(&mut rng)).unwrap();
26 TaffyTreeBuilder { rng, style_generator, tree, root }
27 }
28
29 fn compute_layout_inner(&mut self, available_width: Option<f32>, available_height: Option<f32>) {
30 let available_space = taffy::geometry::Size { width: available_width.into(), height: available_height.into() };
31 self.tree.compute_layout(self.root, available_space).unwrap();
32 }
33
34 fn random_usize(&mut self, range: impl SampleRange<usize>) -> usize {
35 self.rng.random_range(range)
36 }
37
38 fn create_leaf_node(&mut self) -> Self::Node {
39 let style = self.style_generator.create_leaf_style(&mut self.rng);
40 self.tree.new_leaf(style).unwrap()
41 }
42
43 fn create_container_node(&mut self, children: &[Self::Node]) -> Self::Node {
44 let style = self.style_generator.create_container_style(&mut self.rng);
45 self.tree.new_with_children(style, children).unwrap()
46 }
47
48 fn total_node_count(&mut self) -> usize {
49 self.tree.total_node_count()
50 }
51
52 fn set_root_children(&mut self, children: &[Self::Node]) {
53 self.tree.set_children(self.root, children).unwrap();
54 }
55
56 fn into_tree_and_root(self) -> (Self::Tree, Self::Node) {
57 (self.tree, self.root)
58 }
59}
60
61impl<G: GenStyle<TaffyStyle>> BuildTreeExt<G> for TaffyTreeBuilder<ChaCha8Rng, G> {}