Skip to content

Commit 885b5fa

Browse files
LucaMarconatoCzaki
andauthored
test to reproduce #302 (#303)
* test to reproduce #302 * fix single scale images --------- Co-authored-by: Grzegorz Bokota <bokota+github@gmail.com>
1 parent 14a93d7 commit 885b5fa

2 files changed

Lines changed: 49 additions & 7 deletions

File tree

src/napari_spatialdata/_view.py

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -307,12 +307,16 @@ def _channel_changed(self, event: Event) -> None:
307307

308308
current_point = list(event.value)
309309
displayed = self._viewer.dims.displayed
310-
for i, (lo_size, hi_size, cord) in enumerate(zip(layer.data[-1].shape, layer.data[0].shape, current_point)):
311-
if i in displayed:
312-
current_point[i] = slice(None)
313-
else:
314-
current_point[i] = int(cord * lo_size / hi_size)
315-
310+
if layer.multiscale:
311+
for i, (lo_size, hi_size, cord) in enumerate(zip(layer.data[-1].shape, layer.data[0].shape, current_point)):
312+
if i in displayed:
313+
current_point[i] = slice(None)
314+
else:
315+
current_point[i] = int(cord * lo_size / hi_size)
316+
else:
317+
for i in range(len(current_point)):
318+
if i in displayed:
319+
current_point[i] = slice(None)
316320
# TODO remove once contrast limits in napari are fixed
317321
if isinstance(layer.data, MultiScaleData):
318322
# just compute lowest resolution

tests/test_view.py

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,19 @@
11
from typing import Any
22

3+
import numpy as np
34
import pytest
45
from napari.utils.events import EventedList
56
from napari_spatialdata._sdata_widgets import SdataWidget
67
from napari_spatialdata._view import QtAdataViewWidget
78
from napari_spatialdata.utils._test_utils import click_list_widget_item, get_center_pos_listitem
89
from spatialdata.datasets import blobs
10+
from spatialdata.transformations import Affine, set_transformation
911

1012

1113
@pytest.mark.parametrize("widget", [QtAdataViewWidget])
1214
@pytest.mark.parametrize("n_channels", [3, 5])
13-
def test_channel_slider_images(qtbot, make_napari_viewer: any, widget: Any, n_channels: int):
15+
def test_channel_slider_images_bug_282(qtbot, make_napari_viewer: any, widget: Any, n_channels: int):
16+
# https://github.com/scverse/napari-spatialdata/issues/282
1417
channels = [f"channel_{i}" for i in range(n_channels)]
1518
sdata_blobs = blobs(c_coords=channels)
1619
viewer = make_napari_viewer()
@@ -63,3 +66,38 @@ def test_plot_dataframe_annotation_on_points(qtbot, make_napari_viewer: any, wid
6366
)
6467
widget.dataframe_columns_widget._onAction([column])
6568
viewer.close()
69+
70+
71+
@pytest.mark.parametrize("multiscale", [True, False])
72+
@pytest.mark.parametrize("widget", [QtAdataViewWidget])
73+
def test_channel_slider_images_bug_302(qtbot, make_napari_viewer: any, widget: Any, multiscale: bool):
74+
# https://github.com/scverse/napari-spatialdata/issues/302
75+
channels = [f"channel_{i}" for i in range(3)]
76+
sdata_blobs = blobs(c_coords=channels)
77+
78+
# set a transformation to the single-scale and multi-scale images
79+
element_name = "blobs_image" if not multiscale else "blobs_multiscale_image"
80+
affine = Affine(np.array([[10, 20, 30], [40, 50, 60], [0, 0, 1]]), input_axes=("x", "y"), output_axes=("x", "y"))
81+
set_transformation(sdata_blobs[element_name], transformation=affine, to_coordinate_system="global")
82+
83+
viewer = make_napari_viewer()
84+
sdata_widget = SdataWidget(viewer, EventedList([sdata_blobs]))
85+
86+
viewer.window.add_dock_widget(sdata_widget, name="SpatialData")
87+
sdata_widget.viewer_model.add_sdata_image(sdata_blobs, element_name, "global", False)
88+
89+
# this connects the slider to the viewer (done in __init__)
90+
_ = widget(viewer)
91+
92+
# check if the slider is present
93+
start, stop, step = viewer.dims.range[0]
94+
assert start == 0
95+
assert step == 1
96+
97+
# simulate position change of the slider
98+
viewer.dims.set_current_step(0, 0)
99+
qtbot.wait(50) # wait for a short time to simulate user interaction
100+
viewer.dims.set_current_step(0, 1)
101+
qtbot.wait(50) # wait for a short time to simulate user interaction
102+
103+
viewer.close()

0 commit comments

Comments
 (0)