Skip to content

Commit f695179

Browse files
committed
Cleanup
1 parent 05c8d79 commit f695179

File tree

4 files changed

+138
-71
lines changed

4 files changed

+138
-71
lines changed

lonboard/_map.py

Lines changed: 31 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,9 @@
2121
ScaleControl,
2222
)
2323
from lonboard.layer import BaseLayer
24-
from lonboard.models import BaseViewState, MapViewState
24+
from lonboard.models import BaseViewState, GlobeViewState, MapViewState
2525
from lonboard.traits import HeightTrait, VariableLengthTuple, ViewStateTrait
26-
from lonboard.view import BaseView
26+
from lonboard.view import BaseView, GlobeView, MapView
2727

2828
if TYPE_CHECKING:
2929
import sys
@@ -521,24 +521,33 @@ def set_view_state( # noqa: PLR0913
521521
return
522522

523523
current_view_state = self.view_state
524-
if isinstance(current_view_state, MapViewState):
525-
changes = {}
526-
if longitude is not None:
527-
changes["longitude"] = longitude
528-
if latitude is not None:
529-
changes["latitude"] = latitude
530-
if zoom is not None:
531-
changes["zoom"] = zoom
532-
if pitch is not None:
533-
changes["pitch"] = pitch
534-
if bearing is not None:
535-
changes["bearing"] = bearing
536524

525+
changes = {}
526+
if longitude is not None:
527+
changes["longitude"] = longitude
528+
if latitude is not None:
529+
changes["latitude"] = latitude
530+
if zoom is not None:
531+
changes["zoom"] = zoom
532+
533+
# Only params allowed by globe view state
534+
if isinstance(current_view_state, GlobeViewState):
537535
self.view_state = replace(current_view_state, **changes)
538-
else:
539-
raise TypeError(
540-
"Can only set MapViewState or GlobeViewState parameters individually via set_view_state.\nFor other view state types, pass a complete view_state object.",
541-
)
536+
return
537+
538+
# Add more params allowed by map view state
539+
if pitch is not None:
540+
changes["pitch"] = pitch
541+
if bearing is not None:
542+
changes["bearing"] = bearing
543+
544+
if isinstance(current_view_state, MapViewState):
545+
self.view_state = replace(current_view_state, **changes)
546+
return
547+
548+
raise TypeError(
549+
"Can only set MapViewState or GlobeViewState parameters individually via set_view_state.\nFor other view state types, pass a complete view_state object.",
550+
)
542551

543552
def fly_to( # noqa: PLR0913
544553
self,
@@ -664,4 +673,7 @@ def as_html(self) -> HTML:
664673

665674
@traitlets.default("view_state")
666675
def _default_initial_view_state(self) -> dict[str, Any]:
667-
return compute_view(self.layers) # type: ignore
676+
if isinstance(self.views, (MapView, GlobeView)):
677+
return compute_view(self.layers) # type: ignore
678+
679+
return {}

lonboard/traits/_map.py

Lines changed: 7 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
import traitlets
77

88
from lonboard._environment import DEFAULT_HEIGHT
9-
from lonboard.models import BaseViewState, _serialize_view_state
9+
from lonboard.models import BaseViewState, MapViewState, _serialize_view_state
1010
from lonboard.traits._base import FixedErrorTraitType
1111

1212
if TYPE_CHECKING:
@@ -83,56 +83,12 @@ def __init__(
8383

8484
def validate(self, obj: Map, value: Any) -> None | BaseViewState:
8585
view = obj.views
86-
if view is None:
86+
if value is None:
8787
return None
88-
else: # noqa: RET505 (typing issue)
89-
validator = view._view_state_type # noqa: SLF001
90-
return validator(value) # type: ignore
91-
# view
9288

93-
# reveal_type(view)
94-
# view
95-
96-
# if isinstance(view, MapView) or view is None:
97-
# if value is None:
98-
# return MapViewState()
99-
100-
# if isinstance(value, MapViewState):
101-
# return value
102-
103-
# if isinstance(value, dict):
104-
# return MapViewState(**value)
105-
106-
# elif isinstance(view, GlobeView):
107-
# if isinstance(value, GlobeViewState):
108-
# return value
109-
110-
# if isinstance(value, dict):
111-
# return GlobeViewState(**value)
112-
113-
# elif isinstance(view, FirstPersonView):
114-
# if isinstance(value, FirstPersonViewState):
115-
# return value
116-
117-
# if isinstance(value, dict):
118-
# return FirstPersonViewState(**value)
119-
120-
# elif isinstance(view, OrbitView):
121-
# if isinstance(value, OrbitViewState):
122-
# return value
123-
124-
# if isinstance(value, dict):
125-
# return OrbitViewState(**value)
126-
127-
# elif isinstance(view, OrthographicView):
128-
# if isinstance(value, OrthographicViewState):
129-
# return value
130-
131-
# if isinstance(value, dict):
132-
# return OrthographicViewState(**value)
133-
134-
# if value is None:
135-
# return None
89+
if isinstance(value, BaseViewState):
90+
return value
13691

137-
# self.error(obj, value)
138-
# assert False
92+
# Otherwise dict input
93+
validator = view._view_state_type if view is not None else MapViewState # noqa: SLF001
94+
return validator(**value) # type: ignore

lonboard/types/map.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
if TYPE_CHECKING:
1212
from lonboard.basemap import MaplibreBasemap
13+
from lonboard.models import BaseViewState
1314
from lonboard.view import BaseView
1415

1516

@@ -24,4 +25,4 @@ class MapKwargs(TypedDict, total=False):
2425
show_side_panel: bool
2526
use_device_pixels: int | float | bool
2627
views: BaseView | list[BaseView] | tuple[BaseView, ...]
27-
view_state: dict[str, Any]
28+
view_state: BaseViewState | dict[str, Any]

tests/test_map.py

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,13 @@
33

44
from lonboard import Map, ScatterplotLayer, SolidPolygonLayer
55
from lonboard.basemap import MaplibreBasemap
6+
from lonboard.models import (
7+
FirstPersonViewState,
8+
GlobeViewState,
9+
MapViewState,
10+
OrthographicViewState,
11+
)
12+
from lonboard.view import FirstPersonView, GlobeView, OrthographicView
613

714

815
def test_map_fails_with_unexpected_argument():
@@ -49,3 +56,94 @@ def test_map_default_basemap():
4956

5057
assert m.basemap.mode == MaplibreBasemap().mode, "Should match default parameters"
5158
assert m.basemap.style == MaplibreBasemap().style, "Should match default parameters"
59+
60+
61+
def test_view_state_empty_input():
62+
m = Map([], view_state={})
63+
assert m.view_state is None
64+
65+
66+
def test_view_state_partial_dict():
67+
view_state = {
68+
"longitude": -122.45,
69+
"latitude": 37.8,
70+
}
71+
m = Map([], view_state=view_state)
72+
assert m.view_state == MapViewState(**view_state)
73+
74+
75+
def test_view_state_globe_view_dict():
76+
view_state = {
77+
"longitude": -122.45,
78+
"latitude": 37.8,
79+
"zoom": 2.0,
80+
}
81+
m = Map([], views=GlobeView(), view_state=view_state)
82+
assert m.view_state == GlobeViewState(**view_state)
83+
84+
85+
def test_view_state_globe_view_instance():
86+
view_state = GlobeViewState(longitude=-122.45, latitude=37.8, zoom=2.0)
87+
m = Map([], views=GlobeView(), view_state=view_state)
88+
assert m.view_state == view_state
89+
90+
91+
def test_view_state_first_person_dict():
92+
view_state = {
93+
"longitude": -122.45,
94+
"latitude": 37.8,
95+
"position": [0, 0, 10],
96+
}
97+
m = Map([], views=FirstPersonView(), view_state=view_state)
98+
assert m.view_state == FirstPersonViewState(**view_state)
99+
100+
101+
def test_view_state_orthographic_view_empty():
102+
view_state = {}
103+
m = Map([], views=OrthographicView(), view_state=view_state)
104+
assert m.view_state == OrthographicViewState(**view_state)
105+
106+
107+
def test_set_view_state_map_view_kwargs():
108+
m = Map([])
109+
set_state = {"longitude": -100, "latitude": 40, "zoom": 5}
110+
m.set_view_state(**set_state)
111+
assert m.view_state == MapViewState(**set_state)
112+
113+
114+
def test_set_view_state_map_view_instance():
115+
m = Map([])
116+
set_state = MapViewState(longitude=-100, latitude=40, zoom=5)
117+
m.set_view_state(set_state)
118+
assert m.view_state == set_state
119+
120+
121+
def test_set_view_state_partial_update():
122+
m = Map([], view_state={"longitude": -100, "latitude": 40, "zoom": 5})
123+
m.set_view_state(latitude=45)
124+
assert m.view_state == MapViewState(longitude=-100, latitude=45, zoom=5)
125+
126+
127+
def test_globe_view_state_partial_update():
128+
m = Map(
129+
[],
130+
views=GlobeView(),
131+
view_state={"longitude": -100, "latitude": 40, "zoom": 5},
132+
)
133+
m.set_view_state(latitude=45)
134+
assert m.view_state == GlobeViewState(longitude=-100, latitude=45, zoom=5)
135+
136+
137+
def test_set_view_state_orbit():
138+
m = Map(
139+
[],
140+
views=FirstPersonView(),
141+
view_state={"longitude": -100, "latitude": 40},
142+
)
143+
new_view_state = FirstPersonViewState(
144+
longitude=-120,
145+
latitude=50,
146+
position=(0, 0, 10),
147+
)
148+
m.set_view_state(new_view_state)
149+
assert m.view_state == new_view_state

0 commit comments

Comments
 (0)