From 49b5ae3d4c534cf68b713271dd27d41a09929f0c Mon Sep 17 00:00:00 2001 From: Alessio Buccino Date: Wed, 25 Feb 2026 15:34:40 +0100 Subject: [PATCH 1/3] Fix order of units in mergeview --- spikeinterface_gui/mergeview.py | 4 ++-- spikeinterface_gui/utils_qt.py | 12 ++++++++++++ 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/spikeinterface_gui/mergeview.py b/spikeinterface_gui/mergeview.py index 18fc7b13..4b687f01 100644 --- a/spikeinterface_gui/mergeview.py +++ b/spikeinterface_gui/mergeview.py @@ -270,7 +270,7 @@ def _qt_make_layout(self): def _qt_refresh(self): from .myqt import QT - from .utils_qt import CustomItem + from .utils_qt import CustomItem, CustomItemMergeUnitID self.table.clear() self.table.setSortingEnabled(False) @@ -298,7 +298,7 @@ def _qt_refresh(self): pix = QT.QPixmap(16, 16) pix.fill(color) icon = QT.QIcon(pix) - item = QT.QTableWidgetItem(name) + item = CustomItemMergeUnitID(name) item.setData(QT.Qt.ItemDataRole.UserRole, unit_id) item.setFlags(QT.Qt.ItemIsEnabled | QT.Qt.ItemIsSelectable) self.table.setItem(r, c, item) diff --git a/spikeinterface_gui/utils_qt.py b/spikeinterface_gui/utils_qt.py index 4f18dd3f..c0fdb06f 100644 --- a/spikeinterface_gui/utils_qt.py +++ b/spikeinterface_gui/utils_qt.py @@ -474,6 +474,18 @@ def __lt__(self, other): other_ind = self.unit_ids.index(other.text()) return ind < other_ind +class CustomItemMergeUnitID(QT.QTableWidgetItem): + # special case for merge view unit_id columns: sort numerically by the unit_id stored in UserRole + def __lt__(self, other): + self_data = self.data(QT.Qt.ItemDataRole.UserRole) + other_data = other.data(QT.Qt.ItemDataRole.UserRole) + if self_data is not None and other_data is not None: + try: + return float(self_data) < float(other_data) + except (TypeError, ValueError): + pass + return self.text() < other.text() + class OrderableCheckItem(QT.QTableWidgetItem): # special case for checkbox def is_checked(self): From 06ace68a7cd7dd97441cccee079711278349a9b4 Mon Sep 17 00:00:00 2001 From: Alessio Buccino Date: Fri, 13 Mar 2026 16:24:44 +0100 Subject: [PATCH 2/3] Use CustomUnitIDColum --- spikeinterface_gui/mergeview.py | 4 ++-- spikeinterface_gui/utils_qt.py | 11 ----------- 2 files changed, 2 insertions(+), 13 deletions(-) diff --git a/spikeinterface_gui/mergeview.py b/spikeinterface_gui/mergeview.py index 4b687f01..f560d217 100644 --- a/spikeinterface_gui/mergeview.py +++ b/spikeinterface_gui/mergeview.py @@ -270,7 +270,7 @@ def _qt_make_layout(self): def _qt_refresh(self): from .myqt import QT - from .utils_qt import CustomItem, CustomItemMergeUnitID + from .utils_qt import CustomItem, CustomItemUnitID self.table.clear() self.table.setSortingEnabled(False) @@ -298,7 +298,7 @@ def _qt_refresh(self): pix = QT.QPixmap(16, 16) pix.fill(color) icon = QT.QIcon(pix) - item = CustomItemMergeUnitID(name) + item = CustomItemUnitID(name) item.setData(QT.Qt.ItemDataRole.UserRole, unit_id) item.setFlags(QT.Qt.ItemIsEnabled | QT.Qt.ItemIsSelectable) self.table.setItem(r, c, item) diff --git a/spikeinterface_gui/utils_qt.py b/spikeinterface_gui/utils_qt.py index c0fdb06f..e8e256ad 100644 --- a/spikeinterface_gui/utils_qt.py +++ b/spikeinterface_gui/utils_qt.py @@ -474,17 +474,6 @@ def __lt__(self, other): other_ind = self.unit_ids.index(other.text()) return ind < other_ind -class CustomItemMergeUnitID(QT.QTableWidgetItem): - # special case for merge view unit_id columns: sort numerically by the unit_id stored in UserRole - def __lt__(self, other): - self_data = self.data(QT.Qt.ItemDataRole.UserRole) - other_data = other.data(QT.Qt.ItemDataRole.UserRole) - if self_data is not None and other_data is not None: - try: - return float(self_data) < float(other_data) - except (TypeError, ValueError): - pass - return self.text() < other.text() class OrderableCheckItem(QT.QTableWidgetItem): # special case for checkbox From a7048b9705d61cc3f543e50822fca58a21f36449 Mon Sep 17 00:00:00 2001 From: Alessio Buccino Date: Fri, 13 Mar 2026 16:37:00 +0100 Subject: [PATCH 3/3] Simpler fix: use existing CustomUnitIdItem --- spikeinterface_gui/mergeview.py | 3 ++- spikeinterface_gui/utils_qt.py | 7 +++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/spikeinterface_gui/mergeview.py b/spikeinterface_gui/mergeview.py index 8b70831f..66712ea1 100644 --- a/spikeinterface_gui/mergeview.py +++ b/spikeinterface_gui/mergeview.py @@ -287,6 +287,7 @@ def _qt_refresh(self): self.table.setColumnCount(len(labels)) self.table.setHorizontalHeaderLabels(labels) self.table.setRowCount(len(rows)) + unit_ids = self.controller.unit_ids for r, row in enumerate(rows): for c, label in enumerate(labels): @@ -298,7 +299,7 @@ def _qt_refresh(self): pix = QT.QPixmap(16, 16) pix.fill(color) icon = QT.QIcon(pix) - item = CustomItemUnitID(name) + item = CustomItemUnitID(unit_ids, name) item.setData(QT.Qt.ItemDataRole.UserRole, unit_id) item.setFlags(QT.Qt.ItemIsEnabled | QT.Qt.ItemIsSelectable) self.table.setItem(r, c, item) diff --git a/spikeinterface_gui/utils_qt.py b/spikeinterface_gui/utils_qt.py index e8e256ad..123508f6 100644 --- a/spikeinterface_gui/utils_qt.py +++ b/spikeinterface_gui/utils_qt.py @@ -470,8 +470,11 @@ def __init__(self, unit_ids, *args, **kwargs): self.unit_ids = [f"{u}" for u in unit_ids] def __lt__(self, other): - ind = self.unit_ids.index(self.text()) - other_ind = self.unit_ids.index(other.text()) + # since mergeview has "{unit_id} (n={n_spikes})" as name, we split and keep the first part + unit_id = self.text().split(' ')[0] + other_unit_id = other.text().split(' ')[0] + ind = self.unit_ids.index(unit_id) + other_ind = self.unit_ids.index(other_unit_id) return ind < other_ind