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::{
13 CallbackFrameProvider, DynamicImageOverlayLayer, FrameData, FrameProvider, FrameProviderFactory,
14};
15pub use hillshade_layer::{HillshadeLayer, HillshadeParams};
16pub use image_overlay_layer::{ImageOverlayData, ImageOverlayLayer};
17pub use model_layer::ModelLayer;
18pub use tile_layer::TileLayer;
19pub use vector_layer::{
20 CircleInstanceData, FeatureProvenance, LineCap, LineJoin, PatternImage, VectorLayer,
21 VectorMeshData, VectorRenderMode, VectorStyle,
22};
23
24pub struct LayerStack {
26 layers: Vec<Box<dyn crate::layer::Layer>>,
27}
28
29impl LayerStack {
30 pub fn new() -> Self {
32 Self { layers: Vec::new() }
33 }
34
35 pub fn from_vec(layers: Vec<Box<dyn crate::layer::Layer>>) -> Self {
37 Self { layers }
38 }
39
40 pub fn push(&mut self, layer: Box<dyn crate::layer::Layer>) {
42 self.layers.push(layer);
43 }
44
45 pub fn insert(&mut self, index: usize, layer: Box<dyn crate::layer::Layer>) {
47 let idx = index.min(self.layers.len());
48 self.layers.insert(idx, layer);
49 }
50
51 pub fn remove(&mut self, index: usize) -> Option<Box<dyn crate::layer::Layer>> {
53 if index < self.layers.len() {
54 Some(self.layers.remove(index))
55 } else {
56 None
57 }
58 }
59
60 pub fn remove_by_name(&mut self, name: &str) -> Option<Box<dyn crate::layer::Layer>> {
62 if let Some(idx) = self.layers.iter().position(|l| l.name() == name) {
63 Some(self.layers.remove(idx))
64 } else {
65 None
66 }
67 }
68
69 pub fn move_up(&mut self, index: usize) -> bool {
73 if index + 1 < self.layers.len() {
74 self.layers.swap(index, index + 1);
75 true
76 } else {
77 false
78 }
79 }
80
81 pub fn move_down(&mut self, index: usize) -> bool {
85 if index > 0 && index < self.layers.len() {
86 self.layers.swap(index, index - 1);
87 true
88 } else {
89 false
90 }
91 }
92
93 pub fn index_of(&self, name: &str) -> Option<usize> {
95 self.layers.iter().position(|l| l.name() == name)
96 }
97
98 pub fn get(&self, index: usize) -> Option<&dyn crate::layer::Layer> {
100 self.layers.get(index).map(|l| l.as_ref())
101 }
102
103 pub fn get_mut(&mut self, index: usize) -> Option<&mut Box<dyn crate::layer::Layer>> {
105 self.layers.get_mut(index)
106 }
107
108 pub fn len(&self) -> usize {
110 self.layers.len()
111 }
112
113 pub fn is_empty(&self) -> bool {
115 self.layers.is_empty()
116 }
117
118 pub fn iter(&self) -> impl Iterator<Item = &dyn crate::layer::Layer> + '_ {
120 self.layers.iter().map(|l| l.as_ref())
121 }
122
123 pub fn iter_mut(&mut self) -> std::slice::IterMut<'_, Box<dyn crate::layer::Layer>> {
125 self.layers.iter_mut()
126 }
127}
128
129impl Default for LayerStack {
130 fn default() -> Self {
131 Self::new()
132 }
133}