diff options
| author | Danilo M. <danix@danix.xyz> | 2026-10-20 11:37:25 +0200 |
|---|---|---|
| committer | Danilo M. <danix@danix.xyz> | 2026-10-20 11:37:25 +0200 |
| commit | 867e21f99361c0c566b268006b558ab08256824b (patch) | |
| tree | fa6a0c9a0ab8a8519d5b702a86d70bff727653b3 | |
| parent | d756256c775c754aed07f8c518b2b8f589ea2948 (diff) | |
| download | sb-builder-867e21f99361c0c566b268006b558ab08256824b.tar.gz sb-builder-867e21f99361c0c566b268006b558ab08256824b.zip | |
Hints tab: a click anywhere on a row ticks or unticks it
The box is no longer user-checkable on its own, so a click on it is not
counted twice; one cellClicked handler toggles every row click.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
| -rw-r--r-- | sb_builder/hints_tab.py | 10 | ||||
| -rw-r--r-- | tests/test_gui.py | 7 |
2 files changed, 15 insertions, 2 deletions
diff --git a/sb_builder/hints_tab.py b/sb_builder/hints_tab.py index 2956abc..bf2011a 100644 --- a/sb_builder/hints_tab.py +++ b/sb_builder/hints_tab.py @@ -71,6 +71,7 @@ class HintsTab(QWidget): self.table.horizontalHeader().setStretchLastSection(True) for col, width in enumerate((28, 220, 110, 110, 110)): self.table.setColumnWidth(col, width) + self.table.cellClicked.connect(self._toggle) self.status = QLabel() self.check_btn = QPushButton("Check upstream") @@ -122,7 +123,7 @@ class HintsTab(QWidget): for i, r in enumerate(self.rows): r["state"] = upstream.state(r, self.names, self.versions, self.errors) box = QTableWidgetItem() - box.setFlags(Qt.ItemFlag.ItemIsEnabled | Qt.ItemFlag.ItemIsUserCheckable) + box.setFlags(Qt.ItemFlag.ItemIsEnabled) # not user-checkable: _toggle owns every click on = r["state"] == "outdated" if check_outdated else r["name"] in checked box.setCheckState(Qt.CheckState.Checked if on else Qt.CheckState.Unchecked) box.setData(Qt.ItemDataRole.UserRole, r["name"]) @@ -153,6 +154,13 @@ class HintsTab(QWidget): n = len(self.checked()) self.status.setText(f"{shown} shown · {n} selected" + (f" · {self.failure}" if self.failure else "")) + def _toggle(self, row, _col): + """A click anywhere on a row, its box included, ticks or unticks it.""" + box = self.table.item(row, 0) + box.setCheckState(Qt.CheckState.Unchecked if box.checkState() == Qt.CheckState.Checked + else Qt.CheckState.Checked) + self.refilter() + def check_rows(self, on): """Tick every visible row (on), or untick every row.""" state = Qt.CheckState.Checked if on else Qt.CheckState.Unchecked diff --git a/tests/test_gui.py b/tests/test_gui.py index 8a5b6e3..8353441 100644 --- a/tests/test_gui.py +++ b/tests/test_gui.py @@ -491,7 +491,12 @@ class SmokeTest(unittest.TestCase): self.assertEqual(len(tab.checked()), 3) tab.check_rows(False) tab.select("nuclei") - tab.table.item(tab.table.currentRow(), 0).setCheckState(Qt.CheckState.Checked) + tab.table.cellClicked.emit(tab.table.currentRow(), 2) # a click on the row's values + self.assertEqual(tab.checked(), ["nuclei"]) + tab.table.cellClicked.emit(tab.table.currentRow(), 1) + self.assertEqual(tab.checked(), []) + tab.table.cellClicked.emit(tab.table.currentRow(), 0) # the box column too + self.assertEqual(tab.checked(), ["nuclei"]) tab.no_dl.setChecked(True) tab.update_selected() self.assertIn(("job-start", "hint-update", "nuclei=3.12.0", "--no-dl"), remote.calls) |
