Skip to main content

freya_core/
layers.rs

1use std::ops::{
2    Deref,
3    DerefMut,
4};
5
6use rustc_hash::{
7    FxHashMap,
8    FxHashSet,
9};
10
11use crate::node_id::NodeId;
12
13/// The painting layer of an element, controlling what it draws on top of.
14///
15/// Converts from an `i16`, which becomes a [`Layer::Relative`] offset.
16#[derive(Clone, Copy, Debug, PartialEq)]
17pub enum Layer {
18    /// Relative layer to the parent's layer. `0` (the default) keeps the normal stacking order.
19    /// Negative values move behind siblings and positive values in front.
20    Relative(i16),
21    /// Adds a big layer jump relative to the parents layer.
22    /// You may stack multiple overlays on top of each other.
23    Overlay,
24    /// Paint on a specific, numbered overlay level, regardless of the parent's layer.
25    /// There are up to 16 levels you can use, anything above will be capped at 16.
26    OverlayLevel(u8),
27}
28
29impl Default for Layer {
30    fn default() -> Self {
31        Layer::Relative(0)
32    }
33}
34
35impl From<i16> for Layer {
36    fn from(value: i16) -> Self {
37        Layer::Relative(value)
38    }
39}
40
41#[derive(Default, Clone, Debug, PartialEq)]
42pub struct Layers(FxHashMap<i16, FxHashSet<NodeId>>);
43
44impl Layers {
45    /// Insert the given [NodeId] in the given layer. Will create an entry for the layer if missing.
46    pub fn insert_node_in_layer(&mut self, node_id: NodeId, layer_n: i16) {
47        let layer = self.0.entry(layer_n).or_default();
48        layer.insert(node_id);
49    }
50
51    /// Remove the [NodeId] from the given layer. Will remove the entry of the layer if it becomes empty.
52    pub fn remove_node_from_layer(&mut self, node_id: &NodeId, layer_n: i16) {
53        let layer = self.0.get_mut(&layer_n);
54        if let Some(layer) = layer {
55            layer.remove(node_id);
56
57            if layer.is_empty() {
58                self.0.remove(&layer_n);
59            }
60        }
61    }
62}
63
64impl Deref for Layers {
65    type Target = FxHashMap<i16, FxHashSet<NodeId>>;
66
67    fn deref(&self) -> &Self::Target {
68        &self.0
69    }
70}
71
72impl DerefMut for Layers {
73    fn deref_mut(&mut self) -> &mut Self::Target {
74        &mut self.0
75    }
76}