96 lines
2.2 KiB
Python
96 lines
2.2 KiB
Python
from dataclasses import dataclass, field
|
|
from typing import Any, Union
|
|
|
|
from typing_extensions import Self
|
|
|
|
from ...dataclasses import KWONLY_SLOTS
|
|
from .leaflet_layer import Layer
|
|
|
|
|
|
@dataclass(**KWONLY_SLOTS)
|
|
class GenericLayer(Layer):
|
|
name: str
|
|
args: list[Any] = field(default_factory=list)
|
|
|
|
def to_dict(self) -> dict:
|
|
return {
|
|
'type': self.name,
|
|
'args': self.args,
|
|
}
|
|
|
|
|
|
@dataclass(**KWONLY_SLOTS)
|
|
class TileLayer(Layer):
|
|
url_template: str
|
|
options: dict = field(default_factory=dict)
|
|
|
|
def to_dict(self) -> dict:
|
|
return {
|
|
'type': 'tileLayer',
|
|
'args': [self.url_template, self.options],
|
|
}
|
|
|
|
|
|
@dataclass(**KWONLY_SLOTS)
|
|
class WmsLayer(Layer):
|
|
url_template: str
|
|
options: dict = field(default_factory=dict)
|
|
|
|
def to_dict(self) -> dict:
|
|
return {
|
|
'type': 'tileLayer.wms',
|
|
'args': [self.url_template, self.options],
|
|
}
|
|
|
|
|
|
@dataclass(**KWONLY_SLOTS)
|
|
class ImageOverlay(Layer):
|
|
url: str
|
|
bounds: list[list[float]]
|
|
options: dict = field(default_factory=dict)
|
|
|
|
def to_dict(self) -> dict:
|
|
return {
|
|
'type': 'imageOverlay',
|
|
'args': [self.url, self.bounds, self.options],
|
|
}
|
|
|
|
|
|
@dataclass(**KWONLY_SLOTS)
|
|
class VideoOverlay(Layer):
|
|
url: Union[str, list[str]]
|
|
bounds: list[list[float]]
|
|
options: dict = field(default_factory=dict)
|
|
|
|
def to_dict(self) -> dict:
|
|
return {
|
|
'type': 'videoOverlay',
|
|
'args': [self.url, self.bounds, self.options],
|
|
}
|
|
|
|
|
|
@dataclass(**KWONLY_SLOTS)
|
|
class Marker(Layer):
|
|
latlng: tuple[float, float]
|
|
options: dict = field(default_factory=dict)
|
|
|
|
def to_dict(self) -> dict:
|
|
return {
|
|
'type': 'marker',
|
|
'args': [{'lat': self.latlng[0], 'lng': self.latlng[1]}, self.options],
|
|
}
|
|
|
|
def draggable(self, value: bool = True) -> Self:
|
|
"""Make the marker draggable."""
|
|
self.options['draggable'] = value
|
|
return self
|
|
|
|
def move(self, lat: float, lng: float) -> None:
|
|
"""Move the marker to a new position.
|
|
|
|
:param lat: latitude
|
|
:param lng: longitude
|
|
"""
|
|
self.latlng = (lat, lng)
|
|
self.run_method('setLatLng', (lat, lng))
|