diff options
Diffstat (limited to 'sb_builder/hints_tab.py')
| -rw-r--r-- | sb_builder/hints_tab.py | 81 |
1 files changed, 44 insertions, 37 deletions
diff --git a/sb_builder/hints_tab.py b/sb_builder/hints_tab.py index b78ec69..feba94d 100644 --- a/sb_builder/hints_tab.py +++ b/sb_builder/hints_tab.py @@ -21,13 +21,14 @@ import os from PyQt6.QtCore import Qt, pyqtSignal from PyQt6.QtGui import QColor, QFontDatabase, QKeySequence, QShortcut, QSyntaxHighlighter -from PyQt6.QtWidgets import (QCheckBox, QDialog, QHBoxLayout, QLabel, QLineEdit, QListWidget, +from PyQt6.QtWidgets import (QDialog, QHBoxLayout, QLabel, QLineEdit, QListWidget, QListWidgetItem, QMessageBox, QPlainTextEdit, QPushButton, QSplitter, QTableWidget, QTableWidgetItem, QVBoxLayout, QWidget) from . import upstream from .dashboard import STATUS from .packages import chip, load_rows +from .ui import SP, action, enable STATES = ("outdated", "current", "no stanza", "not checked", "nvchecker error") STATE_COLOR = {"outdated": STATUS["aborted"], "current": STATUS["ok"], @@ -59,9 +60,8 @@ class HintsTab(QWidget): self.chips[name].toggled.connect(self.refilter) chips.addWidget(self.chips[name]) chips.addStretch() - self.refresh_btn = QPushButton("Refresh") - self.refresh_btn.clicked.connect(self.reload) - chips.addWidget(self.refresh_btn) + self.status = QLabel() + chips.addWidget(self.status) self.table = QTableWidget(0, len(COLUMNS)) self.table.setHorizontalHeaderLabels(COLUMNS) @@ -74,37 +74,36 @@ class HintsTab(QWidget): self.table.setColumnWidth(col, width) self.table.cellClicked.connect(self._toggle) - self.status = QLabel() - self.check_btn = QPushButton("Check upstream") - self.check_btn.clicked.connect(self.check) - self.update_btn = QPushButton("Update selected") - self.update_btn.clicked.connect(self.update_selected) - self.no_dl = QCheckBox("no download") - self.no_dl.setToolTip('Write DOWNLOAD="no": slackrepo uses the source already in its cache') - bar = QHBoxLayout() - bar.addWidget(self.status) - self.keys = [] - for label, on, key in (("Select visible", True, "Ctrl+A"), ("Clear", False, "Ctrl+Shift+A")): - b = QPushButton(label, toolTip=key) - b.clicked.connect(lambda _c, on=on: self.check_rows(on)) - bar.addWidget(b) - # in the search field Ctrl+A still selects its text: QLineEdit overrides it - self.keys.append(QShortcut(QKeySequence(key), self, lambda on=on: self.check_rows(on), - context=Qt.ShortcutContext.WidgetWithChildrenShortcut)) - bar.addStretch() - for w in (self.check_btn, self.update_btn, self.no_dl): - bar.addWidget(w) - delete = QPushButton("Delete hint") - delete.clicked.connect(self.delete) - bar.addWidget(delete) + self.act_check = action(self, "Check upstream", "system-search", + SP.SP_FileDialogContentsView, self.check) + self.act_update = action(self, "Update selected", "document-save", SP.SP_DialogSaveButton, + self.update_selected) + self.act_delete = action(self, "Delete hint", "edit-delete", SP.SP_TrashIcon, self.delete) + self.actions = [self.act_check, self.act_update, self.act_delete] + self.no_dl = action(self, "No download", "network-offline", SP.SP_DriveNetIcon, checkable=True) + self.no_dl.setToolTip('Update selected writes DOWNLOAD="no": slackrepo uses the source ' + "already in its cache") + self.view_actions = [ + action(self, "Select visible", "edit-select-all", SP.SP_DialogYesButton, + lambda: self.check_rows(True), shortcut="Ctrl+A"), + action(self, "Clear", "edit-clear", SP.SP_DialogResetButton, + lambda: self.check_rows(False), shortcut="Ctrl+Shift+A"), + self.no_dl, + action(self, "Refresh", "view-refresh", SP.SP_BrowserReload, self.reload)] + # in the search field Ctrl+A still selects its text: QLineEdit overrides it + self.keys = [QShortcut(QKeySequence(key), self, lambda on=on: self.check_rows(on), + context=Qt.ShortcutContext.WidgetWithChildrenShortcut) + for key, on in (("Ctrl+A", True), ("Ctrl+Shift+A", False))] + self.loaded = False layout = QVBoxLayout(self) layout.addWidget(self.query) layout.addLayout(chips) - layout.addWidget(self.table) - layout.addLayout(bar) + layout.addWidget(self.table, 1) + self.refilter() def reload(self): + self.loaded = True self.status.setText("loading…") self.remote.call(self._loaded, "inventory") @@ -152,8 +151,12 @@ class HintsTab(QWidget): hide = (on and state not in on) or text not in name.lower() self.table.setRowHidden(i, bool(hide)) shown += not hide - n = len(self.checked()) - self.status.setText(f"{shown} shown · {n} selected" + (f" · {self.failure}" if self.failure else "")) + ticked = set(self.checked()) + self.status.setText(f"{shown} shown · {len(ticked)} selected" + + (f" · {self.failure}" if self.failure else "")) + enable(self.act_update, None if self.pairs() else "tick outdated packages after Check upstream") + enable(self.act_delete, None if any(r["hint_path"] for r in self.rows if r["name"] in ticked) + else "none of the ticked packages has a hint") def _toggle(self, row, _col): """A click anywhere on a row, its box included, ticks or unticks it.""" @@ -187,20 +190,24 @@ class HintsTab(QWidget): return def check(self): - self.check_btn.setEnabled(False) + enable(self.act_check, "checking…") self.status.setText("checking upstream…") self.checker.run(os.path.expanduser(self.cfg["hints"]["nvchecker_keyfile"]), self.stanzas) def _checked(self, versions, errors, failure): - self.check_btn.setEnabled(True) + enable(self.act_check, None) self.versions, self.errors, self.failure = versions, errors, failure self._fill(check_outdated=True) - def update_selected(self): + def pairs(self): + """pkg=version of the ticked packages Check upstream found a version for.""" versions = self.versions or {} - pairs = [f"{n}={versions[n]}" for n in self.checked() if n in versions] - if pairs: - self.start_requested.emit(["hint-update", *pairs] + (["--no-dl"] if self.no_dl.isChecked() else [])) + return [f"{n}={versions[n]}" for n in self.checked() if n in versions] + + def update_selected(self): + if self.pairs(): + self.start_requested.emit(["hint-update", *self.pairs()] + + (["--no-dl"] if self.no_dl.isChecked() else [])) def confirm(self, title, text): return QMessageBox.question(self, title, text) == QMessageBox.StandardButton.Yes |
