Skip to content

Commit

Permalink
feat: use registry for defining viewer choices (#1)
Browse files Browse the repository at this point in the history
* use registry for defining viewer choices

* ci: fix image button label in tests

---------

Co-authored-by: Iisakki Rotko <[email protected]>
  • Loading branch information
kecnry and iisakkirotko authored Nov 12, 2024
1 parent c7c34ab commit 2892a39
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 18 deletions.
34 changes: 21 additions & 13 deletions glue_solara/app.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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",
Expand Down Expand Up @@ -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,
Expand All @@ -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
Expand Down Expand Up @@ -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():
(
Expand Down Expand Up @@ -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,
Expand Down
10 changes: 5 additions & 5 deletions tests/integration/basics_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -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")
Expand All @@ -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()
Expand All @@ -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)
Expand All @@ -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)
Expand All @@ -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(
Expand Down

0 comments on commit 2892a39

Please sign in to comment.