rustial_engine/layers/
mod.rs1mod 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
19pub struct LayerStack {
21 layers: Vec<Box<dyn crate::layer::Layer>>,
22}
23
24impl LayerStack {
25 pub fn new() -> Self {
27 Self { layers: Vec::new() }
28 }
29
30 pub fn from_vec(layers: Vec<Box<dyn crate::layer::Layer>>) -> Self {
32 Self { layers }
33 }
34
35 pub fn push(&mut self, layer: Box<dyn crate::layer::Layer>) {
37 self.layers.push(layer);
38 }
39
40 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 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 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 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 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 pub fn index_of(&self, name: &str) -> Option<usize> {
90 self.layers.iter().position(|l| l.name() == name)
91 }
92
93 pub fn get(&self, index: usize) -> Option<&dyn crate::layer::Layer> {
95 self.layers.get(index).map(|l| l.as_ref())
96 }
97
98 pub fn get_mut(&mut self, index: usize) -> Option<&mut Box<dyn crate::layer::Layer>> {
100 self.layers.get_mut(index)
101 }
102
103 pub fn len(&self) -> usize {
105 self.layers.len()
106 }
107
108 pub fn is_empty(&self) -> bool {
110 self.layers.is_empty()
111 }
112
113 pub fn iter(&self) -> impl Iterator<Item = &dyn crate::layer::Layer> + '_ {
115 self.layers.iter().map(|l| l.as_ref())
116 }
117
118 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}