From 40065697fa86353cf6a64a95382fd3ed9575a717 Mon Sep 17 00:00:00 2001 From: Alessio Buccino Date: Fri, 4 Sep 2026 12:51:33 +0200 Subject: [PATCH] fix: move to next unit after manual label --- spikeinterface_gui/unitlistview.py | 38 ++++++++++++++---------------- spikeinterface_gui/utils_panel.py | 33 ++++++++++++++++++-------- 2 files changed, 41 insertions(+), 30 deletions(-) diff --git a/spikeinterface_gui/unitlistview.py b/spikeinterface_gui/unitlistview.py index d95e32a..ee337f8 100644 --- a/spikeinterface_gui/unitlistview.py +++ b/spikeinterface_gui/unitlistview.py @@ -734,6 +734,8 @@ def _panel_on_edit(self, event): new_label = None self.controller.set_label_to_unit(unit_id, column, new_label) self.notify_manual_curation_updated() + # like in Qt, move to the next unit and make it visible alone + self.table.select_next_row(only=True, from_row=row) self.notifier.notify_active_view_updated() def _panel_update_labels(self): @@ -801,6 +803,18 @@ def _panel_remove_from_merge(self): self.notify_manual_curation_updated() self.refresh() + def _panel_set_default_label(self, label): + selected_unit_ids = self._panel_get_selected_unit_ids() + if len(selected_unit_ids) == 0: + return + for unit_id in selected_unit_ids: + self.controller.set_label_to_unit(unit_id, "quality", label) + self.table.value.loc[selected_unit_ids, "quality"] = label if label is not None else "" + self.notify_manual_curation_updated() + self.refresh() + # like in Qt, move to the next unit and make it visible alone + self.table.select_next_row(only=True) + def _panel_handle_shortcut(self, event): if self.is_view_active(): selected_unit_ids = self._panel_get_selected_unit_ids() @@ -820,29 +834,13 @@ def _panel_handle_shortcut(self, event): self.notify_unit_and_channel_visibility_changed() self.refresh() elif event.data == "clear": - for unit_id in selected_unit_ids: - self.controller.set_label_to_unit(unit_id, "quality", None) - self.table.value.loc[selected_unit_ids, "quality"] = "" - self.notify_manual_curation_updated() - self.refresh() + self._panel_set_default_label(None) elif event.data == "good": - for unit_id in selected_unit_ids: - self.controller.set_label_to_unit(unit_id, "quality", "good") - self.table.value.loc[selected_unit_ids, "quality"] = "good" - self.notify_manual_curation_updated() - self.refresh() + self._panel_set_default_label("good") elif event.data == "mua": - for unit_id in selected_unit_ids: - self.controller.set_label_to_unit(unit_id, "quality", "MUA") - self.table.value.loc[selected_unit_ids, "quality"] = "MUA" - self.notify_manual_curation_updated() - self.refresh() + self._panel_set_default_label("MUA") elif event.data == "noise": - for unit_id in selected_unit_ids: - self.controller.set_label_to_unit(unit_id, "quality", "noise") - self.table.value.loc[selected_unit_ids, "quality"] = "noise" - self.notify_manual_curation_updated() - self.refresh() + self._panel_set_default_label("noise") UnitListView._gui_help_txt = """ diff --git a/spikeinterface_gui/utils_panel.py b/spikeinterface_gui/utils_panel.py index 2f79476..6122897 100644 --- a/spikeinterface_gui/utils_panel.py +++ b/spikeinterface_gui/utils_panel.py @@ -556,6 +556,27 @@ def _get_previous_row(self): previous_row = max(0, previous_row) return previous_row + def select_next_row(self, only=False, from_row=None): + """ + Move the selection to the next row. + + Parameters + ---------- + only: bool + If True, the "only" callback is triggered (make the new row the only visible one). + from_row: int | None + The row to move from. By default the current selection is used. + """ + if from_row is None: + next_row = self._get_next_row() + else: + next_row = min(from_row + 1, len(self.value) - 1) + self.selection = [next_row] + if only and self._on_only_function is not None: + self._on_only_function() + self._last_selected_row = next_row + return next_row + def _handle_shortcut(self, event): if self._conditional_shortcut(): if event.data == "first": @@ -567,21 +588,13 @@ def _handle_shortcut(self, event): self.selection = [last_row] self._last_selected_row = last_row elif event.data == "next": - next_row = self._get_next_row() - self.selection = [next_row] - self._last_selected_row = next_row + self.select_next_row() elif event.data == "previous": previous_row = self._get_previous_row() self.selection = [previous_row] self._last_selected_row = previous_row elif event.data == "next_only": - next_row = self._get_next_row() - # this should go in self._on_only_function() - self.selection = [next_row] - # self.notify_unit_visibility_changed() - if self._on_only_function is not None: - self._on_only_function() - self._last_selected_row = next_row + self.select_next_row(only=True) elif event.data == "previous_only": previous_row = self._get_previous_row() self.selection = [previous_row]