diff --git a/glue_solara/app.py b/glue_solara/app.py index 59f0041..5894f7a 100644 --- a/glue_solara/app.py +++ b/glue_solara/app.py @@ -6,11 +6,15 @@ import glue.core.message as msg import glue_jupyter as gj import glue_jupyter.app +import glue_jupyter.bqplot.histogram +import glue_jupyter.bqplot.image +import glue_jupyter.bqplot.scatter import glue_jupyter.registries import solara import solara.lab from glue.viewers.common.viewer import Viewer from glue_jupyter.data import require_data +from glue_jupyter.registries import viewer_registry from solara import Reactive from .hooks import ClosedMessage, use_glue_watch, use_glue_watch_close, use_layers_watch @@ -43,6 +47,10 @@ "magenta", ] +VIEWER_TYPES = list(map(lambda k: k.title(), viewer_registry.members.keys())) + +VIEWER_METHODS = {"Histogram": "histogram1d", "Scatter": "scatter2d", "Image": "imshow"} + TITLE_TRANSLATIONS = { "BqplotScatterView": "2d Scatter", "BqplotHistogramView": "1d Histogram", @@ -90,17 +98,19 @@ def GlueApp(app: gj.JupyterApplication): mdi_header_size_index = solara.use_reactive(2) def add_data_viewer(type: str, data: glue.core.Data): - if type == "Histogram": - app.histogram1d(data=data, show=False) - elif type == "Scatter": - app.scatter2d(data=data, show=False) - elif type == "2D Image": + if type in VIEWER_METHODS: try: - app.imshow(data=data, show=False) + getattr(app, VIEWER_METHODS[type])(data=data, show=False) except ValueError as error: error_message.set(str(error)) show_error.set(True) return + else: + # manual approach... + viewer_cls = viewer_registry.members[type.lower()]["cls"] + viewer_state_obj = viewer_cls._state_cls() + # NOTE: some viewers should set x_att or have other checks which this skips + app.new_data_viewer(viewer_cls, data=data, state=viewer_state_obj, show=False) new_viewer_index = len(app.viewers) - 1 grid_layout.value = [ *grid_layout.value, @@ -123,7 +133,7 @@ def add_data_viewer(type: str, data: glue.core.Data): def request_viewer_for(data: glue.core.Data): if data.ndim > 1: - default_type = "2D Image" + default_type = "Image" else: default_type = "Scatter" requested_viewer_typename.value = default_type @@ -154,9 +164,7 @@ def add_to_current_viewer(data: glue.core.Data): cancel="Cancel", on_ok=add_requested_data_viewer, ): - solara.Select( - "Data", value=requested_viewer_typename, values=["Histogram", "Scatter", "2D Image"] - ) + solara.Select("Data", value=requested_viewer_typename, values=VIEWER_TYPES) with solara.AppBarTitle(): ( @@ -268,15 +276,15 @@ def add_to_current_viewer(data: glue.core.Data): "justify-content": "center", } ): - solara.Text("What do you want to visualize", style={"font-size": "2em"}) + solara.Text("What do you want to visualize?", style={"font-size": "2em"}) with solara.Column(style={"background-color": "transparent"}): - for viewer_type in ["Histogram", "Scatter", "2D Image"]: + for viewer_type in VIEWER_TYPES: def add(viewer_type=viewer_type): add_data_viewer(viewer_type, data_collection[0]) solara.Button( - f"A {viewer_type}", + f"{'An' if viewer_type[0] in ('AEOIU') else 'A'} {viewer_type}", on_click=add, block=True, color=main_color, diff --git a/tests/integration/basics_test.py b/tests/integration/basics_test.py index bae49cd..cafa156 100644 --- a/tests/integration/basics_test.py +++ b/tests/integration/basics_test.py @@ -12,7 +12,7 @@ def test_add_data_current_viewer( add_data.click() expect(page_session.locator("button")).to_have_count(4) page_session.locator("button", has_text="add w5 data").click() - page_session.locator("button", has_text="a 2d image").click() + page_session.locator("button", has_text="an image").click() page_session.locator("div.bqplot.figure").wait_for() add_to_figure = page_session.locator( "button.v-btn--icon:not(.v-btn--disabled)", has=page_session.locator("i.mdi-tab-plus") @@ -31,7 +31,7 @@ def test_tabbed_viewers(page_session: playwright.sync_api.Page, solara_server, s add_data.wait_for() add_data.click() page_session.locator("button", has_text="add w5 data").click() - page_session.locator("button", has_text="a 2d image").click() + page_session.locator("button", has_text="an image").click() page_session.locator("div.bqplot.figure").wait_for() add_figure = page_session.locator("button", has=page_session.locator("i.mdi-tab")).nth(1) expect(add_figure).to_be_attached() @@ -47,7 +47,7 @@ def test_tabbed_viewer_close(page_session: playwright.sync_api.Page, solara_serv add_data.wait_for() add_data.click() page_session.locator("button", has_text="add w5 data").click() - page_session.locator("button", has_text="a 2d image").click() + page_session.locator("button", has_text="an image").click() page_session.locator("div.bqplot.figure").wait_for() close_viewer = page_session.locator("button", has=page_session.locator("i.mdi-close")) expect(close_viewer).to_have_count(1) @@ -64,7 +64,7 @@ def test_mdi_viewers(page_session: playwright.sync_api.Page, solara_server, sola add_data.click() page_session.locator("button", has_text="add w5 data").click() page_session.get_by_role("button", name="mdi").click() - page_session.locator("button", has_text="a 2d image").click() + page_session.locator("button", has_text="an image").click() page_session.locator("div.glue-solara__window").wait_for() expect(page_session.locator("div.glue-solara__window")).to_have_count(1) add_figure = page_session.locator("button", has=page_session.locator("i.mdi-tab")).nth(1) @@ -82,7 +82,7 @@ def test_mdi_viewers_close(page_session: playwright.sync_api.Page, solara_server add_data.click() page_session.locator("button", has_text="add w5 data").click() page_session.get_by_role("button", name="mdi").click() - page_session.locator("button", has_text="a 2d image").click() + page_session.locator("button", has_text="an image").click() page_session.locator("div.glue-solara__window").wait_for() expect(page_session.locator("div.glue-solara__window")).to_have_count(1) close_button = page_session.locator(