aboutsummaryrefslogtreecommitdiffstats
path: root/sb_builder/mainwindow.py
diff options
context:
space:
mode:
Diffstat (limited to 'sb_builder/mainwindow.py')
-rw-r--r--sb_builder/mainwindow.py45
1 files changed, 41 insertions, 4 deletions
diff --git a/sb_builder/mainwindow.py b/sb_builder/mainwindow.py
index 247b0cf..0331eb9 100644
--- a/sb_builder/mainwindow.py
+++ b/sb_builder/mainwindow.py
@@ -27,6 +27,7 @@ from PyQt6.QtWidgets import (QLabel, QMainWindow, QMessageBox, QPushButton, QSty
from . import VERSION, config
from .dashboard import Dashboard
from .fmt import job_title
+from .hints_tab import HINT_JOBS, HintResultDialog, HintsTab
from .jobs import JobsTab
from .packages import PackagesTab
from .results import ResultsTab
@@ -37,6 +38,7 @@ NOTIFY_PATH = "/org/freedesktop/Notifications"
# ribbon entries: label, freedesktop icon name, Qt fallback icon
RIBBON = (("Dashboard", "go-home", QStyle.StandardPixmap.SP_DirHomeIcon),
("Packages", "package-x-generic", QStyle.StandardPixmap.SP_FileDialogDetailedView),
+ ("Hints", "document-edit", QStyle.StandardPixmap.SP_FileDialogContentsView),
("Results", "view-list-text", QStyle.StandardPixmap.SP_MessageBoxWarning),
("Jobs", "system-run", QStyle.StandardPixmap.SP_MediaPlay))
# tabs as a distinct, centered row; colors from the palette so the theme applies
@@ -87,6 +89,8 @@ class MainWindow(QMainWindow):
self.jobs_tab = None
self.packages_tab = None
self.results_tab = None
+ self.hints_tab = None
+ self.hint_dialogs = [] # open HintResultDialogs, kept alive while shown
self.seen = None # job id -> status at the last poll; None before the first
self.online = None # None until the first answer
self.overlays = []
@@ -119,7 +123,8 @@ class MainWindow(QMainWindow):
self.ribbon.setIconSize(QSize(32, 32))
self.addToolBar(Qt.ToolBarArea.TopToolBarArea, self.ribbon)
slots = {"Dashboard": lambda: self.tabs.setCurrentWidget(self.dashboard),
- "Packages": self.open_packages, "Results": lambda: self.open_results(),
+ "Packages": self.open_packages, "Hints": lambda: self.open_hints(),
+ "Results": lambda: self.open_results(),
"Jobs": self.open_jobs}
for label, name, fallback in RIBBON:
icon = QIcon.fromTheme(name, self.style().standardIcon(fallback))
@@ -281,9 +286,27 @@ class MainWindow(QMainWindow):
if event and prev.get(j["id"], "running") != j["status"]:
self.notify(event, job_title(j), j["id"])
if j["kind"] in ("slackrepo", "publish"): # build state changed
- for tab in (self.packages_tab, self.results_tab):
- if tab:
- tab.reload()
+ self._reload(self.packages_tab, self.results_tab)
+ if j["kind"] in HINT_JOBS and j["status"] in ("ok", "failed"):
+ self._reload(self.packages_tab, self.hints_tab)
+ self.remote.call(lambda d, err: d and self.show_hint_result(d), "job-result", j["id"])
+
+ @staticmethod
+ def _reload(*tabs):
+ for tab in tabs:
+ if tab:
+ tab.reload()
+
+ def show_hint_result(self, result):
+ if not result["ok"] and not result["failed"]:
+ return # nothing changed, nothing failed: no news
+ d = HintResultDialog(self.remote, result, self)
+ d.build_requested.connect(
+ lambda pkgs: self.open_jobs().start("slackrepo", "update", "--preview", *pkgs))
+ d.changed.connect(lambda: self._reload(self.packages_tab, self.hints_tab))
+ d.finished.connect(lambda _r: self.hint_dialogs.remove(d))
+ self.hint_dialogs.append(d)
+ d.show()
# ── tabs ────────────────────────────────────────────────────────────────
@@ -304,11 +327,23 @@ class MainWindow(QMainWindow):
if self.packages_tab is None:
self.packages_tab = PackagesTab(self.remote)
self.packages_tab.start_requested.connect(lambda args: self.open_jobs().start(*args))
+ self.packages_tab.hints_requested.connect(self.open_hints)
self.tabs.addTab(self.packages_tab, "Packages")
self.packages_tab.reload()
self.tabs.setCurrentWidget(self.packages_tab)
return self.packages_tab
+ def open_hints(self, name=None):
+ if self.hints_tab is None:
+ self.hints_tab = HintsTab(self.remote, self.cfg)
+ self.hints_tab.start_requested.connect(lambda args: self.open_jobs().start(*args))
+ self.tabs.addTab(self.hints_tab, "Hints")
+ self.hints_tab.reload()
+ if name:
+ self.hints_tab.select(name)
+ self.tabs.setCurrentWidget(self.hints_tab)
+ return self.hints_tab
+
def open_results(self, result=None):
if self.results_tab is None:
self.results_tab = ResultsTab(self.remote)
@@ -338,6 +373,8 @@ class MainWindow(QMainWindow):
self.packages_tab = None
if w is self.results_tab:
self.results_tab = None
+ if w is self.hints_tab:
+ self.hints_tab = None
w.deleteLater()
def reload_config(self):