Skip to main content

leptos_leaflet/components/
mod.rs

1mod bounds;
2mod circle;
3mod context;
4mod control;
5mod events;
6mod image_overlay;
7mod map_container;
8mod marker;
9mod pane;
10
11mod path_options;
12mod polygon;
13mod polyline;
14mod popup;
15mod position;
16mod quad_tile_layer;
17mod tile_layer;
18mod tile_layer_wms;
19mod tooltip;
20mod video_overlay;
21mod zoom;
22
23pub use bounds::Bounds;
24pub use circle::Circle;
25pub use context::*;
26pub use control::Control;
27pub use events::{
28    DragEvents, LayerEvents, MapEvents, MouseEvents, MoveEvents, PopupEvents, TooltipEvents,
29};
30pub use image_overlay::ImageOverlay;
31pub use leaflet::{CircleOptions, PathOptions, PolylineOptions};
32pub use map_container::{LeafletMap, MapContainer};
33pub use marker::Marker;
34pub use pane::{
35    provide_pane_context, provide_pane_context_with_renderer, use_pane_context, Pane, PaneContext,
36    PaneRendererScope, PaneStrategy,
37};
38
39pub use path_options::*;
40pub use polygon::Polygon;
41pub use polyline::Polyline;
42pub use popup::Popup;
43pub use position::*;
44pub use quad_tile_layer::QuadTileLayer;
45pub use tile_layer::TileLayer;
46pub use tile_layer_wms::{TileLayerWms, TileLayerWmsEvents};
47pub use tooltip::Tooltip;
48pub use video_overlay::VideoOverlay;
49pub use zoom::Zoom;
50
51#[macro_export]
52macro_rules! effect_update_on_change {
53    ($class:ty, $option_class:ty, $name:ident) => {
54        create_effect(move |_| {
55            use leaflet;
56            let overlay_context =
57                leptos::use_context::<LeafletOverlayContainerContext>().expect("overlay context");
58            if let (Some(layer), Some(setting)) = (overlay_context.container::<$class>(), $name) {
59                let mut options = <$option_class>::new();
60                options.$name(setting.get());
61                layer.setStyle(&options);
62            }
63        });
64    };
65}
66
67#[macro_export]
68macro_rules! effect_update_on_change_ref {
69    ($class:ty, $option_class:ty, $name:ident, $value:expr) => {
70        $crate::paste! {
71            create_effect(move |_| {
72                use leaflet;
73                let overlay_context =
74                    leptos::use_context::<LeafletOverlayContainerContext>().expect("overlay context");
75                if let (Some(layer), Some(setting)) = (overlay_context.container::<$class>(), &$value) {
76                    let mut options = <$option_class>::new();
77                    options.[<set_ $name>](&setting.get());
78                    layer.set_style(&options);
79                }
80            });
81        }
82    };
83}
84
85#[macro_export]
86macro_rules! setup_layer_option {
87    ($name:ident, $options:ident) => {
88        $crate::paste! {
89            if let Some($name) = $name {
90                $options.[<set_ $name>]($name.get_untracked());
91            }
92        }
93    };
94}
95
96#[macro_export]
97macro_rules! setup_layer_option_ref {
98    ($name:ident, $options:ident) => {
99        $crate::paste! {
100            if let Some($name) = &$name {
101                $options.[<set_ $name>](&$name.get_untracked());
102            }
103        }
104    };
105}
106
107#[macro_export]
108macro_rules! setup_layer_option_str {
109    ($name:ident, $options:ident) => {
110        $crate::paste! {
111            if let Some($name) = &$name {
112                $options.[<set_ $name>](&format!("{}", &$name.get_untracked()));
113            }
114        }
115    };
116}
117
118#[macro_export]
119macro_rules! setup_layer_leaflet_option {
120    ($name:ident, $options:ident) => {
121        $crate::paste! {
122            if let Some($name) = $name.get_untracked() {
123                $options.[<set_ $name>]($name);
124            }
125        }
126    };
127}
128
129#[macro_export]
130macro_rules! setup_layer_leaflet_option_ref {
131    ($name:ident, $options:ident) => {
132        $crate::paste! {
133            if let Some($name) = $name.get_untracked() {
134                $options.[<set_ $name>]($name.to_string());
135            }
136        }
137    };
138}
139
140#[macro_export]
141macro_rules! setup_layer_leaflet_string {
142    ($name:ident, $options:ident) => {
143        $crate::paste! {
144            if !$name.get_untracked().is_empty() {
145                $options.[<set_ $name>]($name.get_untracked().to_string());
146            }
147        }
148    };
149}
150
151pub trait StringEmptyOption<T> {
152    fn to_option(&self) -> Option<&T>;
153    fn to_option_owned(self) -> Option<T>;
154}
155
156impl StringEmptyOption<String> for String {
157    fn to_option(&self) -> Option<&String> {
158        if self.is_empty() {
159            None
160        } else {
161            Some(self)
162        }
163    }
164
165    fn to_option_owned(self) -> Option<String> {
166        if self.is_empty() {
167            None
168        } else {
169            Some(self)
170        }
171    }
172}