45 lines
1.6 KiB
Python
45 lines
1.6 KiB
Python
from __future__ import annotations
|
|
|
|
import uuid
|
|
from abc import abstractmethod
|
|
from dataclasses import dataclass, field
|
|
from typing import TYPE_CHECKING, Any, ClassVar
|
|
|
|
from ...awaitable_response import AwaitableResponse
|
|
from ...dataclasses import KWONLY_SLOTS
|
|
|
|
if TYPE_CHECKING:
|
|
from .leaflet import Leaflet
|
|
|
|
|
|
@dataclass(**KWONLY_SLOTS)
|
|
class Layer:
|
|
current_leaflet: ClassVar[Leaflet | None] = None
|
|
leaflet: Leaflet = field(init=False)
|
|
id: str = field(init=False)
|
|
|
|
def __post_init__(self) -> None:
|
|
self.id = str(uuid.uuid4())
|
|
assert self.current_leaflet is not None
|
|
self.leaflet = self.current_leaflet
|
|
self.leaflet.layers.append(self)
|
|
self.leaflet.run_method('add_layer', self.to_dict(), self.id)
|
|
|
|
@abstractmethod
|
|
def to_dict(self) -> dict:
|
|
"""Return a dictionary representation of the layer."""
|
|
|
|
def run_method(self, name: str, *args: Any, timeout: float = 1) -> AwaitableResponse:
|
|
"""Run a method of the Leaflet layer.
|
|
|
|
If the function is awaited, the result of the method call is returned.
|
|
Otherwise, the method is executed without waiting for a response.
|
|
|
|
:param name: name of the method (a prefix ":" indicates that the arguments are JavaScript expressions)
|
|
:param args: arguments to pass to the method
|
|
:param timeout: timeout in seconds (default: 1 second)
|
|
|
|
:return: AwaitableResponse that can be awaited to get the result of the method call
|
|
"""
|
|
return self.leaflet.run_method('run_layer_method', self.id, name, *args, timeout=timeout)
|