Skip to content

Commit 3417d59

Browse files
authored
Merge pull request #339 from BiAPoL/support-timelapse
add callback to changed frame
2 parents b9fb712 + 3720dd0 commit 3417d59

File tree

2 files changed

+54
-0
lines changed

2 files changed

+54
-0
lines changed

src/napari_clusters_plotter/_new_plotter_widget.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,9 @@ def _setup_callbacks(self):
130130
self._on_update_layer_selection
131131
)
132132

133+
# connect frame change to alpha update
134+
self.viewer.dims.events.current_step.connect(self._on_frame_changed)
135+
133136
# reset the coloring of the selected layer
134137
self.control_widget.reset_button.clicked.connect(self._reset)
135138

@@ -198,6 +201,24 @@ def _replot(self):
198201
# "MANUAL_CLUSTER_ID"
199202
# ].to_numpy()
200203

204+
def _on_frame_changed(self, event: napari.utils.events.Event):
205+
"""
206+
Called when the frame changes. Updates the alpha values of the points.
207+
"""
208+
209+
if "frame" in self._get_features().columns:
210+
current_step = self.viewer.dims.current_step[0]
211+
alpha = np.asarray(
212+
self._get_features()["frame"] == current_step, dtype=float
213+
)
214+
size = np.ones(len(alpha)) * 50
215+
216+
index_out_of_frame = alpha == 0
217+
alpha[index_out_of_frame] = 0.25
218+
size[index_out_of_frame] = 35
219+
self.plotting_widget.active_artist.alpha = alpha
220+
self.plotting_widget.active_artist.size = size
221+
201222
def _checkbox_status_changed(self):
202223
self._replot()
203224

src/napari_clusters_plotter/_tests/test_plotter.py

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -295,3 +295,36 @@ def test_categorical_handling(make_napari_viewer, create_sample_layers):
295295
) # should only be MANUAL_CLUSTER_ID and layer name
296296
assert categorical_columns[0] == "MANUAL_CLUSTER_ID"
297297
assert categorical_columns[1] == "layer"
298+
299+
300+
@pytest.mark.parametrize(
301+
"create_sample_layers",
302+
[
303+
create_multi_point_layer,
304+
create_multi_vectors_layer,
305+
create_multi_surface_layer,
306+
create_multi_shapes_layers,
307+
],
308+
)
309+
def test_temporal_highlighting(make_napari_viewer, create_sample_layers):
310+
from napari_clusters_plotter import PlotterWidget
311+
312+
viewer = make_napari_viewer()
313+
layer, layer2 = create_sample_layers()
314+
315+
# add layers to viewer
316+
viewer.add_layer(layer)
317+
viewer.add_layer(layer2)
318+
plotter_widget = PlotterWidget(viewer)
319+
viewer.window.add_dock_widget(plotter_widget, area="right")
320+
321+
plotter_widget._selectors["x"].setCurrentText("feature3")
322+
323+
# move time slider
324+
current_step = viewer.dims.current_step[0]
325+
viewer.dims.set_current_step(0, current_step + 1)
326+
327+
# check that the dots in the plotter widget update alpha and size
328+
# to highlight out-of and in-frame data points
329+
assert plotter_widget.plotting_widget.active_artist.alpha.min() == 0.25
330+
assert plotter_widget.plotting_widget.active_artist.size.min() == 35

0 commit comments

Comments
 (0)