aboutsummaryrefslogtreecommitdiffstats
path: root/sb_builder/hints_tab.py
diff options
context:
space:
mode:
Diffstat (limited to 'sb_builder/hints_tab.py')
-rw-r--r--sb_builder/hints_tab.py81
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