From 48cbd81a2c674b7d65a82f986ed7ad12e2f6869f Mon Sep 17 00:00:00 2001 From: "Danilo M." Date: Tue, 20 Oct 2026 11:39:21 +0200 Subject: Packages tab: a click anywhere on a row ticks or unticks it Same as the Hints tab: the box is no longer user-checkable on its own and one clicked handler toggles the row, so no click counts twice. Co-Authored-By: Claude Opus 5.5 --- sb_builder/packages.py | 12 ++++++++++-- tests/test_gui.py | 4 ++++ 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/sb_builder/packages.py b/sb_builder/packages.py index 3ccbf40..72b5f93 100644 --- a/sb_builder/packages.py +++ b/sb_builder/packages.py @@ -117,8 +117,8 @@ class Model(QAbstractTableModel): return None def flags(self, index): - f = Qt.ItemFlag.ItemIsEnabled | Qt.ItemFlag.ItemIsSelectable - return f | Qt.ItemFlag.ItemIsUserCheckable if index.column() == 0 else f + # not user-checkable: PackagesTab._toggle owns every click, the box's included + return Qt.ItemFlag.ItemIsEnabled | Qt.ItemFlag.ItemIsSelectable def data(self, index, role=Qt.ItemDataRole.DisplayRole): row, col = self.rows[index.row()], index.column() @@ -243,6 +243,7 @@ class PackagesTab(QWidget): for col, width in enumerate((28, 220, 110, 120, 120, 80)): self.table.setColumnWidth(col, width) self.table.selectionModel().currentRowChanged.connect(self.show_detail) + self.table.clicked.connect(self._toggle) self.detail = QLabel(textFormat=Qt.TextFormat.RichText, wordWrap=True, alignment=Qt.AlignmentFlag.AlignTop) self.detail.setTextInteractionFlags(Qt.TextInteractionFlag.TextSelectableByMouse) @@ -317,6 +318,13 @@ class PackagesTab(QWidget): def update_count(self): self.count.setText(f"{self.proxy.rowCount():,} shown ยท {len(self.model.checked)} selected") + def _toggle(self, index): + """A click anywhere on a row ticks or unticks it.""" + box = index.siblingAtColumn(0) + on = box.data(Qt.ItemDataRole.CheckStateRole) == Qt.CheckState.Checked + self.proxy.setData(box, Qt.CheckState.Unchecked if on else Qt.CheckState.Checked, + Qt.ItemDataRole.CheckStateRole) + def select_visible(self): for i in range(self.proxy.rowCount()): self.model.checked.add(self.proxy.index(i, 0).data(Qt.ItemDataRole.UserRole)["name"]) diff --git a/tests/test_gui.py b/tests/test_gui.py index 8353441..b326ee1 100644 --- a/tests/test_gui.py +++ b/tests/test_gui.py @@ -399,6 +399,10 @@ class SmokeTest(unittest.TestCase): tab.start_requested.connect(started.append) tab.act("update") self.assertEqual(started, []) # nothing checked, no current row + tab.table.clicked.emit(tab.proxy.index(3, 2)) # a click on a row's values ticks it + self.assertEqual(tab.model.checked, {"curl"}) + tab.table.clicked.emit(tab.proxy.index(3, 0)) + self.assertEqual(tab.model.checked, set()) tab.table.setCurrentIndex(tab.proxy.index(1, 1)) self.assertIn("x", tab.detail.text()) tab.act("update") -- cgit v1.2.3