From 68d5093002364ce4d9120263cfa029afa773eb25 Mon Sep 17 00:00:00 2001 From: wyzula-jan Date: Fri, 16 Oct 2026 14:17:05 +0000 Subject: [PATCH] fix(device_manager): compare SortTableItem by text when it has no sort data --- .../components/device_table/device_table.py | 6 +++--- .../test_device_manager_components.py | 19 +++++++++++++++++++ 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/bec_widgets/widgets/control/device_manager/components/device_table/device_table.py b/bec_widgets/widgets/control/device_manager/components/device_table/device_table.py index 9cf4ac56..65852f8c 100644 --- a/bec_widgets/widgets/control/device_manager/components/device_table/device_table.py +++ b/bec_widgets/widgets/control/device_manager/components/device_table/device_table.py @@ -148,7 +148,7 @@ class SortTableItem(QtWidgets.QTableWidgetItem): """ Table item that sorts by the value stored under the UserRole data role. - Items without UserRole data fall back to the QTableWidgetItem comparison. + If either item has no UserRole data, the items are compared by their text. Args: *args: Positional arguments forwarded to QTableWidgetItem. @@ -178,7 +178,7 @@ class SortTableItem(QtWidgets.QTableWidgetItem): values = self._sort_values(other) if values is not None: return values[0] < values[1] - return super().__lt__(other) + return self.text() < other.text() def __gt__(self, other: QtWidgets.QTableWidgetItem) -> bool: """Override greater-than operator for sorting.""" @@ -187,7 +187,7 @@ class SortTableItem(QtWidgets.QTableWidgetItem): values = self._sort_values(other) if values is not None: return values[0] > values[1] - return super().__gt__(other) + return self.text() > other.text() class DeviceTable(BECWidget, QtWidgets.QWidget): diff --git a/tests/unit_tests/test_device_manager_components.py b/tests/unit_tests/test_device_manager_components.py index f7ddd3ac..b0d06e54 100644 --- a/tests/unit_tests/test_device_manager_components.py +++ b/tests/unit_tests/test_device_manager_components.py @@ -315,6 +315,25 @@ class TestSortTableItem: assert high > low assert not high < low + def test_falls_back_to_text_without_data(self): + """Items without UserRole data are compared by their text.""" + a, b = self._item(text="a"), self._item(text="b") + assert a < b and b > a + assert not b < a and not a > b + assert self._item(1, text="b") > QtWidgets.QTableWidgetItem("a") + assert self._item(1, text="b") < self._item(text="c") + + def test_table_sorts_items_without_data(self, qtbot): + """A table of items without UserRole data sorts by text in both directions.""" + table = QtWidgets.QTableWidget(3, 1) + qtbot.addWidget(table) + for row, text in enumerate(["b", "c", "a"]): + table.setItem(row, 0, SortTableItem(text)) + table.sortItems(0, QtCore.Qt.SortOrder.AscendingOrder) + assert [table.item(row, 0).text() for row in range(3)] == ["a", "b", "c"] + table.sortItems(0, QtCore.Qt.SortOrder.DescendingOrder) + assert [table.item(row, 0).text() for row in range(3)] == ["c", "b", "a"] + def test_sort_key(self): """A sort key maps the UserRole data before comparing."""