Skip to main content

rustial_engine/layers/
mod.rs

1//! Layer system for the map engine.
2
3mod background_layer;
4mod dynamic_image_overlay_layer;
5mod hillshade_layer;
6mod image_overlay_layer;
7mod model_layer;
8mod tile_layer;
9mod vector_layer;
10
11pub use background_layer::BackgroundLayer;
12pub use dynamic_image_overlay_layer::{CallbackFrameProvider, DynamicImageOverlayLayer, FrameData, FrameProvider, FrameProviderFactory};
13pub use hillshade_layer::{HillshadeLayer, HillshadeParams};
14pub use image_overlay_layer::{ImageOverlayData, ImageOverlayLayer};
15pub use model_layer::ModelLayer;
16pub use tile_layer::TileLayer;
17pub use vector_layer::{CircleInstanceData, FeatureProvenance, LineCap, LineJoin, PatternImage, VectorLayer, VectorMeshData, VectorRenderMode, VectorStyle};
18
19/// An ordered stack of map layers, rendered bottom-to-top.
20pub struct LayerStack {
21    layers: Vec<Box<dyn crate::layer::Layer>>,
22}
23
24impl LayerStack {
25    /// Create an empty layer stack.
26    pub fn new() -> Self {
27        Self { layers: Vec::new() }
28    }
29
30    /// Create a layer stack from an existing vector of layers.
31    pub fn from_vec(layers: Vec<Box<dyn crate::layer::Layer>>) -> Self {
32        Self { layers }
33    }
34
35    /// Add a layer on top of the stack.
36    pub fn push(&mut self, layer: Box<dyn crate::layer::Layer>) {
37        self.layers.push(layer);
38    }
39
40    /// Insert a layer at a specific index (0 = bottom).
41    pub fn insert(&mut self, index: usize, layer: Box<dyn crate::layer::Layer>) {
42        let idx = index.min(self.layers.len());
43        self.layers.insert(idx, layer);
44    }
45
46    /// Remove a layer by index. Returns it if valid.
47    pub fn remove(&mut self, index: usize) -> Option<Box<dyn crate::layer::Layer>> {
48        if index < self.layers.len() {
49            Some(self.layers.remove(index))
50        } else {
51            None
52        }
53    }
54
55    /// Remove a layer by name. Returns it if found.
56    pub fn remove_by_name(&mut self, name: &str) -> Option<Box<dyn crate::layer::Layer>> {
57        if let Some(idx) = self.layers.iter().position(|l| l.name() == name) {
58            Some(self.layers.remove(idx))
59        } else {
60            None
61        }
62    }
63
64    /// Move a layer up (toward the top of the stack / rendered last).
65    ///
66    /// Returns `true` if the layer was moved.
67    pub fn move_up(&mut self, index: usize) -> bool {
68        if index + 1 < self.layers.len() {
69            self.layers.swap(index, index + 1);
70            true
71        } else {
72            false
73        }
74    }
75
76    /// Move a layer down (toward the bottom of the stack / rendered first).
77    ///
78    /// Returns `true` if the layer was moved.
79    pub fn move_down(&mut self, index: usize) -> bool {
80        if index > 0 && index < self.layers.len() {
81            self.layers.swap(index, index - 1);
82            true
83        } else {
84            false
85        }
86    }
87
88    /// Find a layer by name and return its index.
89    pub fn index_of(&self, name: &str) -> Option<usize> {
90        self.layers.iter().position(|l| l.name() == name)
91    }
92
93    /// Get a layer by index.
94    pub fn get(&self, index: usize) -> Option<&dyn crate::layer::Layer> {
95        self.layers.get(index).map(|l| l.as_ref())
96    }
97
98    /// Get a layer mutably by index.
99    pub fn get_mut(&mut self, index: usize) -> Option<&mut Box<dyn crate::layer::Layer>> {
100        self.layers.get_mut(index)
101    }
102
103    /// Number of layers.
104    pub fn len(&self) -> usize {
105        self.layers.len()
106    }
107
108    /// Whether there are no layers.
109    pub fn is_empty(&self) -> bool {
110        self.layers.is_empty()
111    }
112
113    /// Iterate layers bottom-to-top.
114    pub fn iter(&self) -> impl Iterator<Item = &dyn crate::layer::Layer> + '_ {
115        self.layers.iter().map(|l| l.as_ref())
116    }
117
118    /// Iterate layers mutably.
119    pub fn iter_mut(&mut self) -> std::slice::IterMut<'_, Box<dyn crate::layer::Layer>> {
120        self.layers.iter_mut()
121    }
122}
123
124impl Default for LayerStack {
125    fn default() -> Self {
126        Self::new()
127    }
128}