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    /// Offset from 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    /// Paint far above everything else, for overlays such as popups and tooltips.
22    Overlay,
23    /// Paint on an overlay layer offset by the given multiplier, to stack overlays among themselves.
24    RelativeOverlay(u8),
25}
26
27impl Default for Layer {
28    fn default() -> Self {
29        Layer::Relative(0)
30    }
31}
32
33impl From<i16> for Layer {
34    fn from(value: i16) -> Self {
35        Layer::Relative(value)
36    }
37}
38
39#[derive(Default, Clone, Debug, PartialEq)]
40pub struct Layers(FxHashMap<i16, FxHashSet<NodeId>>);
41
42impl Layers {
43    /// Insert the given [NodeId] in the given layer. Will create an entry for the layer if missing.
44    pub fn insert_node_in_layer(&mut self, node_id: NodeId, layer_n: i16) {
45        let layer = self.0.entry(layer_n).or_default();
46        layer.insert(node_id);
47    }
48
49    /// Remove the [NodeId] from the given layer. Will remove the entry of the layer if it becomes empty.
50    pub fn remove_node_from_layer(&mut self, node_id: &NodeId, layer_n: i16) {
51        let layer = self.0.get_mut(&layer_n);
52        if let Some(layer) = layer {
53            layer.remove(node_id);
54
55            if layer.is_empty() {
56                self.0.remove(&layer_n);
57            }
58        }
59    }
60}
61
62impl Deref for Layers {
63    type Target = FxHashMap<i16, FxHashSet<NodeId>>;
64
65    fn deref(&self) -> &Self::Target {
66        &self.0
67    }
68}
69
70impl DerefMut for Layers {
71    fn deref_mut(&mut self) -> &mut Self::Target {
72        &mut self.0
73    }
74}