Skip to content

Commit afb031f

Browse files
committed
ensure that click events on transparent labels do not lead to node selection
1 parent 2001ea4 commit afb031f

File tree

3 files changed

+46
-14
lines changed

3 files changed

+46
-14
lines changed

src/motile_tracker/data_views/views/layers/track_labels.py

Lines changed: 29 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -136,18 +136,37 @@ def assign_new_label(self, event):
136136

137137
new_label(self)
138138

139-
def process_click(self, event: Event, label: int):
140-
"""Process the click event to update the selected nodes"""
139+
def process_click(
140+
self, event: Event, label: int, layer: ContourLabels | None = None
141+
):
142+
"""Process the click event to update the selected nodes.
141143
142-
if (
143-
label is not None and label != 0 and self.colormap.map(label)[-1] != 0
144-
): # check opacity (=visibility) in the colormap
145-
append = "Shift" in event.modifiers
146-
jump = "Control" in event.modifiers
147-
if jump:
148-
self.tracks_viewer.center_on_node(label)
144+
Args:
145+
event (Event): The click event.
146+
label (int): The label value at the clicked position.
147+
layer (ContourLabels | None): The (ortho view) layer from which the click originated.
148+
If provided, it is used to check label visibility in that layer's colormap.
149+
"""
150+
151+
if label is not None and label != 0:
152+
# check visibility in the respective colormap. If a label is not visible, it
153+
# is not allowed to be selected from this view
154+
if layer is not None:
155+
is_visible = layer.colormap.color_dict.get(label)[3] > 0
156+
else:
157+
is_visible = self.colormap.color_dict.get(label)[3] > 0
158+
if is_visible:
159+
append = "Shift" in event.modifiers
160+
jump = "Control" in event.modifiers
161+
if jump:
162+
self.tracks_viewer.center_on_node(label)
163+
else:
164+
self.tracks_viewer.selected_nodes.add(label, append)
149165
else:
150-
self.tracks_viewer.selected_nodes.add(label, append)
166+
warnings.warn(
167+
f"Node {label} is not visible in this view and cannot be selected.",
168+
stacklevel=2,
169+
)
151170

152171
def _get_colormap(self) -> DirectLabelColormap:
153172
"""Get a DirectLabelColormap that maps node ids to their track ids, and then

src/motile_tracker/data_views/views/layers/track_points.py

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -122,8 +122,20 @@ def add(self, coords: list[float]):
122122
with self.events.current_size.blocker():
123123
super().add(coords)
124124

125-
def process_click(self, event: Event, point_index: int | None):
126-
"""Select the clicked point(s)"""
125+
def process_click(
126+
self,
127+
event: Event,
128+
point_index: int | None,
129+
_layer: napari.layers.Points | None = None,
130+
):
131+
"""Select the clicked point(s)
132+
133+
Args:
134+
event (Event): The mouse event
135+
point_index (int | None): The index of the clicked point, or None if no point
136+
was clicked
137+
_layer (napari.layers.Points | None): Optional, unused. The (ortho view) layer on which the click occurred, which is forwarded by default.
138+
"""
127139

128140
if point_index is None:
129141
self.tracks_viewer.selected_nodes.reset()

src/motile_tracker/data_views/views/ortho_views.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import copy
12
import inspect
23

34
import napari_orthogonal_views.ortho_view_widget as ov_widget
@@ -235,7 +236,7 @@ def sync_colormap(orig_layer: TrackLabels, copied_layer: Labels, event: Event):
235236
ContourLabels instance. Check the slice ndisplay and contour settings to adjust
236237
background opacity accordingly."""
237238

238-
copied_layer.colormap = orig_layer.colormap
239+
copied_layer.colormap = copy.deepcopy(orig_layer.colormap)
239240
if copied_layer._slice.slice_input.ndisplay == 3 and orig_layer.contour > 0:
240241
copied_layer.set_opacity(orig_layer.background, 0)
241242
else:
@@ -274,7 +275,7 @@ def click(
274275
was_click = yield from detect_click(event)
275276
if was_click:
276277
value = get_click_value(layer, event)
277-
orig_layer.process_click(event, value)
278+
orig_layer.process_click(event, value, layer)
278279

279280
# Wrap and attach click callback
280281
def click_wrapper(layer, event):

0 commit comments

Comments
 (0)