Skip to content

Commit e8c6991

Browse files
authored
Merge pull request #262 from funkelab/55-add-user-defined-groups-for-viewing
55 add user defined groups for viewing
2 parents 0b4d1ad + c88025c commit e8c6991

File tree

9 files changed

+755
-117
lines changed

9 files changed

+755
-117
lines changed

src/motile_tracker/application_menus/menu_widget.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ def __init__(self, viewer: napari.Viewer):
2222
self.tabwidget.addTab(motile_widget, "Track with Motile")
2323
self.tabwidget.addTab(tracks_viewer.tracks_list, "Tracks List")
2424
self.tabwidget.addTab(editing_widget, "Edit Tracks")
25+
self.tabwidget.addTab(tracks_viewer.collection_widget, "Groups")
2526

2627
layout = QVBoxLayout()
2728
layout.addWidget(self.tabwidget)

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

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -232,7 +232,7 @@ def _update_data(self, event: Event):
232232

233233
elif event.action == "removed":
234234
self.tracks_viewer.tracks_controller.delete_nodes(
235-
self.tracks_viewer.selected_nodes._list
235+
self.tracks_viewer.selected_nodes.as_list
236236
)
237237

238238
elif event.action == "changed":
@@ -273,18 +273,24 @@ def get_symbols(self, tracks: Tracks, symbolmap: dict[NodeType, str]) -> list[st
273273
symbols = [symbolmap[statemap[degree]] for _, degree in tracks.graph.out_degree]
274274
return symbols
275275

276-
def update_point_outline(self, visible: list[int] | str) -> None:
276+
def update_point_outline(self, visible_nodes: list[int] | str) -> None:
277277
"""Update the outline color of the selected points and visibility according to
278278
display mode
279279
280280
Args:
281-
visible (list[int] | str): A list of track ids, or "all"
281+
visible_nodes (list[int] | str): A list of node ids, or "all"
282282
"""
283-
# filter out the non-selected tracks if in lineage mode
284-
if visible == "all":
283+
284+
if isinstance(visible_nodes, str):
285285
self.shown[:] = True
286286
else:
287-
indices = np.where(np.isin(self.properties["track_id"], visible))[
287+
# For lineage or group mode, visible_nodes is a list of node IDs
288+
# In group mode, also include selected nodes so they remain visible
289+
if self.tracks_viewer.mode == "group":
290+
visible_nodes = (
291+
list(visible_nodes) + self.tracks_viewer.selected_nodes.as_list
292+
)
293+
indices = np.where(np.isin(self.properties["node_id"], visible_nodes))[
288294
0
289295
].tolist()
290296
self.shown[:] = False

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

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -123,12 +123,19 @@ def _refresh(self) -> None:
123123
if self.points_layer is not None:
124124
self.points_layer._refresh()
125125

126-
def update_visible(self, visible_tracks: list[int], visible_nodes: list[int]):
126+
def update_visible(self, visible_nodes: list[int] | str):
127127
if self.seg_layer is not None:
128128
self.seg_layer.update_label_colormap(visible_nodes)
129129
if self.points_layer is not None:
130-
self.points_layer.update_point_outline(visible_tracks)
130+
self.points_layer.update_point_outline(visible_nodes)
131131
if self.tracks_layer is not None:
132+
# Convert node IDs to track IDs for the tracks layer
133+
if isinstance(visible_nodes, str):
134+
visible_tracks = visible_nodes # "all"
135+
else:
136+
visible_tracks = list(
137+
{self.tracks.get_track_id(node) for node in visible_nodes}
138+
)
132139
self.tracks_layer.update_track_visibility(visible_tracks)
133140

134141
def center_view(self, node):

0 commit comments

Comments
 (0)