leptos_leaflet/components/
mod.rs

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