freya_core/
tree_layout_adapter.rs1use std::rc::Rc;
2
3use rustc_hash::FxHashMap;
4use torin::{
5 prelude::{
6 Direction,
7 TreeAdapter,
8 },
9 scaled::Scaled,
10 size::Size,
11};
12
13use crate::{
14 element::ElementExt,
15 node_id::NodeId,
16};
17
18pub struct TreeAdapterFreya<'a> {
19 pub elements: &'a FxHashMap<NodeId, Rc<dyn ElementExt>>,
20 pub parents: &'a FxHashMap<NodeId, NodeId>,
21 pub children: &'a FxHashMap<NodeId, Vec<NodeId>>,
22 pub heights: &'a FxHashMap<NodeId, u16>,
23 pub scale_factor: f64,
24}
25
26impl TreeAdapter<NodeId> for TreeAdapterFreya<'_> {
27 fn root_id(&self) -> NodeId {
28 NodeId::ROOT
29 }
30
31 fn get_node(&self, node_id: &NodeId) -> Option<torin::prelude::Node> {
32 if *node_id == NodeId::ROOT {
33 return Some(torin::node::Node::from_size_and_direction(
34 Size::Fill,
35 Size::Fill,
36 Direction::Vertical,
37 ));
38 }
39 self.elements.get(node_id).map(|node| {
40 let mut layout_node = node.layout().layout.clone();
41 layout_node.scale(self.scale_factor as f32);
42 layout_node
43 })
44 }
45
46 fn height(&self, node_id: &NodeId) -> Option<u16> {
47 self.heights.get(node_id).cloned()
48 }
49
50 fn parent_of(&self, node_id: &NodeId) -> Option<NodeId> {
51 self.parents.get(node_id).cloned()
52 }
53
54 fn children_of(&mut self, node_id: &NodeId) -> Vec<NodeId> {
55 self.children.get(node_id).cloned().unwrap_or_default()
56 }
57}