freya_core/
tree_layout_adapter.rs

1use 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}