diff options
Diffstat (limited to 'sb_builder/mainwindow.py')
| -rw-r--r-- | sb_builder/mainwindow.py | 45 |
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): |
