Skip to content

Commit 6e2d8ea

Browse files
authored
Merge pull request #5 from cpparts/CST-256-remove_overlay_cobalt
add: remove overlay
2 parents 71b68e0 + 618bfc3 commit 6e2d8ea

4 files changed

Lines changed: 129 additions & 2 deletions

File tree

js/models/event_handler.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -310,6 +310,8 @@ export default class EventHandler {
310310
add_MOC_from_URL: this.messageHandler.handleAddMOCFromURL,
311311
add_MOC_from_dict: this.messageHandler.handleAddMOCFromDict,
312312
add_overlay: this.messageHandler.handleAddOverlay,
313+
remove_overlay: this.messageHandler.handleRemoveOverlay,
314+
get_overlays: this.messageHandler.handleGetOverlays,
313315
change_colormap: this.messageHandler.handleChangeColormap,
314316
get_JPG_thumbnail: this.messageHandler.handleGetJPGThumbnail,
315317
trigger_selection: this.messageHandler.handleTriggerSelection,

js/models/message_handler.js

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,31 @@ export default class MessageHandler {
144144
}
145145
}
146146

147+
handleRemoveOverlay = (msg) => {
148+
const overlay_names = msg["overlay_names"];
149+
for (const overlay_name of overlay_names) {
150+
console.info(`Sending removeOverlay for ${overlay_name}`);
151+
this.aladin.removeOverlay(overlay_name);
152+
}
153+
this.handleGetOverlays();
154+
};
155+
156+
handleGetOverlays = () => {
157+
const overlay_names = [];
158+
const overlays = this.aladin.getOverlays();
159+
for (const overlay of overlays) {
160+
const overlay_name = overlay["name"];
161+
overlay_names.push(overlay_name);
162+
}
163+
console.info(`Current overlays are ${overlay_names}`);
164+
this.model.send({
165+
event_type: "current_overlays",
166+
content: {
167+
overlays: overlay_names,
168+
},
169+
});
170+
};
171+
147172
handleChangeColormap(msg) {
148173
this.aladin.getBaseImageLayer().setColormap(msg["colormap"]);
149174
}

src/ipyaladin/widget.py

Lines changed: 54 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,11 @@ class Aladin(anywidget.AnyWidget):
178178
).tag(sync=True)
179179
_wcs = traitlets.Dict().tag(sync=True)
180180
_fov_xy = traitlets.Dict().tag(sync=True)
181+
# Overlays
182+
_overlays = traitlets.List(
183+
[],
184+
help="A list of overlays on the widget.",
185+
).tag(sync=True)
181186

182187
# content of the last click
183188
clicked_object = traitlets.Dict().tag(sync=True)
@@ -259,6 +264,9 @@ def _handle_custom_message(self, _: any, message: dict, buffers: any) -> None:
259264
self.listener_callback["select"](message["content"])
260265
elif event_type == "save_view_as_image":
261266
self._save_file(message["path"], buffers[0])
267+
elif event_type == "current_overlays":
268+
self._overlays = message["content"]["overlays"]
269+
self.listener_callback["current_overlays"](message["content"])
262270

263271
@property
264272
def selected_objects(self) -> List[Table]:
@@ -276,6 +284,17 @@ def selected_objects(self) -> List[Table]:
276284
catalogs.append(Table(objects_data))
277285
return catalogs
278286

287+
@property
288+
def overlays(self) -> List:
289+
"""The list of overlays on the widget.
290+
291+
Returns
292+
-------
293+
list
294+
A list of strings representing the widget overlays.
295+
"""
296+
return self._overlays
297+
279298
@property
280299
def height(self) -> int:
281300
"""The height of the widget.
@@ -992,6 +1011,35 @@ def add_graphic_overlay_from_stcs(
9921011
}
9931012
)
9941013

1014+
@widget_should_be_loaded
1015+
def remove_overlay(self, overlay_name: Union[Iterable[str], str]) -> None:
1016+
"""Remove an overlay layer defined by a string.
1017+
1018+
Parameters
1019+
----------
1020+
overlay_name : str, Iterable[str]
1021+
The string or an iterable of strings.
1022+
"""
1023+
overlay_names = (
1024+
[overlay_name] if isinstance(overlay_name, str) else overlay_name
1025+
)
1026+
1027+
self.send(
1028+
{
1029+
"event_name": "remove_overlay",
1030+
"overlay_names": overlay_names,
1031+
}
1032+
)
1033+
1034+
@widget_should_be_loaded
1035+
def get_overlays(self) -> List:
1036+
"""Update the current overlays defined by their names."""
1037+
self.send(
1038+
{
1039+
"event_name": "get_overlays",
1040+
}
1041+
)
1042+
9951043
@widget_should_be_loaded
9961044
def set_color_map(self, color_map_name: str) -> None:
9971045
"""Change the color map of the Aladin Lite widget.
@@ -1043,7 +1091,8 @@ def set_listener(self, listener_type: str, callback: Callable) -> None:
10431091
Parameters
10441092
----------
10451093
listener_type : str
1046-
Can either be 'object_hovered', 'object_clicked', 'click' or 'select'
1094+
Can either be 'object_hovered', 'object_clicked', 'click', 'select',
1095+
or 'current_overlays'
10471096
callback : Callable
10481097
A python function to be called when the event corresponding to the
10491098
listener_type is detected
@@ -1057,10 +1106,13 @@ def set_listener(self, listener_type: str, callback: Callable) -> None:
10571106
self.listener_callback["click"] = callback
10581107
elif listener_type == "select":
10591108
self.listener_callback["select"] = callback
1109+
elif listener_type == "current_overlays":
1110+
self.listener_callback["current_overlays"] = callback
10601111
else:
10611112
raise ValueError(
10621113
"listener_type must be 'object_hovered', "
1063-
"'object_clicked', 'click' or 'select'"
1114+
"'object_clicked', 'click', 'select', "
1115+
"or 'current_overlays'"
10641116
)
10651117

10661118
@widget_should_be_loaded

src/tests/test_aladin.py

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -322,3 +322,51 @@ def test_add_table(monkeypatch: Callable) -> None:
322322
"conversion_maj_axis": 1,
323323
}
324324
assert table_sent_message["options"]["ellipse_error"] == ellipse_options
325+
326+
327+
test_overlay_names = [
328+
"overlay",
329+
["overlay", "overlay_1", "2MASS"],
330+
"catalog",
331+
["overlay_1", "2MASS"],
332+
]
333+
334+
335+
@pytest.mark.parametrize("overlay_names", test_overlay_names)
336+
def test_remove_overlay(
337+
monkeypatch: Callable,
338+
overlay_names: Union[Iterable[str], str],
339+
) -> None:
340+
"""Test proper messages sent for removing overlays using their name string(s).
341+
342+
Parameters
343+
----------
344+
overlay_names : Union[Iterable[str], str]
345+
The name strings of overlays.
346+
"""
347+
mock_send = Mock()
348+
monkeypatch.setattr(Aladin, "send", mock_send)
349+
aladin.remove_overlay(overlay_names)
350+
351+
event_name = mock_send.call_args[0][0]["event_name"]
352+
assert isinstance(event_name, str)
353+
assert event_name == "remove_overlay"
354+
355+
name_info = mock_send.call_args[0][0]["overlay_names"]
356+
assert isinstance(name_info, list)
357+
assert name_info[0] in overlay_names
358+
359+
if isinstance(overlay_names, list):
360+
assert name_info == overlay_names
361+
362+
363+
def test_get_overlays(
364+
monkeypatch: Callable,
365+
) -> None:
366+
"""Test proper message sent for getting current overlays."""
367+
mock_send = Mock()
368+
monkeypatch.setattr(Aladin, "send", mock_send)
369+
aladin.get_overlays()
370+
event_name = mock_send.call_args[0][0]["event_name"]
371+
assert isinstance(event_name, str)
372+
assert event_name == "get_overlays"

0 commit comments

Comments
 (0)