Skip to content

Commit

Permalink
bugfixes in multiple viewer widget to improve synchronization
Browse files Browse the repository at this point in the history
  • Loading branch information
AnniekStok committed Feb 20, 2025
1 parent 4a5a7bb commit 7ae1442
Showing 1 changed file with 84 additions and 6 deletions.
90 changes: 84 additions & 6 deletions src/napari_segmentation_correction/multiple_view_widget.py
Original file line number Diff line number Diff line change
Expand Up @@ -149,15 +149,23 @@ def _update_ndim(self, event):
if self.layer in self.viewer.layers:
self.viewer.layers.remove(self.layer)
self.layer = Vectors(name=".cross", ndim=event.value)
self.layer.edge_width = 1
self.layer.vector_style = "line"
self.layer.edge_width = 2
self.update_cross()

def _update_cross_visibility(self, state):
if state:
if self.layer is None:
self.layer = Vectors(name=".cross", ndim=self.viewer.dims.ndim)
self.layer.vector_style = "line"
self.layer.edge_width = 2
self.viewer.layers.append(self.layer)
else:
self.viewer.layers.remove(self.layer)
self.update_cross()
if not np.any(self.layer.edge_color):
self.layer.edge_color = "red"
self.layer.vector_style = "line"

def update_cross(self):
if self.layer not in self.viewer.layers:
Expand Down Expand Up @@ -213,12 +221,12 @@ def __init__(self, viewer: napari.Viewer):
self.viewer_model2.events.status.connect(self._status_update)

# add any existing layers to viewer
for layer in self.viewer.layers:
for i, layer in enumerate(self.viewer.layers):
self.viewer_model1.layers.insert(
0, copy_layer(layer, "model1")
i, copy_layer(layer, "model1")
)
self.viewer_model2.layers.insert(
0, copy_layer(layer, "model2")
i, copy_layer(layer, "model2")
)
for name in get_property_names(layer):
getattr(layer.events, name).connect(
Expand All @@ -239,22 +247,53 @@ def __init__(self, viewer: napari.Viewer):
self.viewer_model1.layers[layer.name].events.data.connect(
self._sync_data
)

self.viewer_model1.layers[layer.name].events.mode.connect(
self._sync_mode
)
self.viewer_model2.layers[layer.name].events.data.connect(
self._sync_data
)
self.viewer_model2.layers[layer.name].events.mode.connect(
self._sync_mode
)

if isinstance(self.viewer_model1.layers[layer.name], Labels):

if isinstance(layer, LabelOptions):
self.viewer_model1.layers[layer.name].events.selected_label.connect(
self._sync_selected_label
)
self.viewer_model1.layers[layer.name].mouse_drag_callbacks.append(
self._sync_click
)

if isinstance(self.viewer_model2.layers[layer.name], Labels):

self.viewer_model2.layers[layer.name].events.selected_label.connect(
self._sync_selected_label
)
self.viewer_model2.layers[layer.name].mouse_drag_callbacks.append(
self._sync_click
)

layer.events.name.connect(self._sync_name)

self._order_update()

# connect to events
self.viewer.layers.events.inserted.connect(self._layer_added)
self.viewer.layers.events.removed.connect(self._layer_removed)
self.viewer.layers.events.moved.connect(self._layer_moved)
self.viewer.layers.selection.events.active.connect(
self._layer_selection_changed
)
self.viewer.dims.events.current_step.connect(self._point_update)
self.viewer_model1.dims.events.current_step.connect(self._point_update)
self.viewer_model2.dims.events.current_step.connect(self._point_update)
self.viewer.dims.events.order.connect(self._order_update)
self.viewer.events.reset_view.connect(self._reset_view)
self.viewer_model1.events.status.connect(self._status_update)
self.viewer_model2.events.status.connect(self._status_update)


def _status_update(self, event):
self.viewer.status = event.value
Expand Down Expand Up @@ -356,10 +395,49 @@ def _layer_added(self, event):
self._sync_data
)

if isinstance(self.viewer_model1.layers[event.value.name], Labels):
self.viewer_model1.layers[
event.value.name
].events.selected_label.connect(self._sync_selected_label)

if isinstance(self.viewer_model2.layers[event.value.name], Labels):
self.viewer_model2.layers[
event.value.name
].events.selected_label.connect(self._sync_selected_label)


event.value.events.name.connect(self._sync_name)

self._order_update()

def _sync_selected_label(self, event):
"""Sync the selected label between Label instances"""

for model in [self.viewer, self.viewer_model1, self.viewer_model2]:
if event.source.name in model.layers:
layer = model.layers[event.source.name]
if layer is event.source:
return
try:
self._block = True
layer.selected_label = event.source.selected_label
finally:
self._block = False

def _sync_mode(self, event):
"""Sync the tool mode between source viewer and other viewer models"""

for model in [self.viewer, self.viewer_model1, self.viewer_model2]:
if event.source.name in model.layers:
layer = model.layers[event.source.name]
if layer is event.source:
continue
try:
self._block = True
layer.mode = event.source.mode
finally:
self._block = False

def _sync_click(self, layer, event):
"""Forward the click event to the LabelOptions layer"""

Expand Down

0 comments on commit 7ae1442

Please sign in to comment.