diff options
author | Florian Bruhin <me@the-compiler.org> | 2022-05-10 17:20:47 +0200 |
---|---|---|
committer | Florian Bruhin <me@the-compiler.org> | 2022-06-22 17:41:11 +0200 |
commit | 0db2bc20f634938203f40ff64cfc4fce2542172f (patch) | |
tree | dfc9ab2ac7aa06e9aea205852cd49ec014782864 | |
parent | 99b937b4eb515d87eaa817c1421b8d0e42837f4e (diff) | |
download | qutebrowser-0db2bc20f634938203f40ff64cfc4fce2542172f.tar.gz qutebrowser-0db2bc20f634938203f40ff64cfc4fce2542172f.zip |
Refactor and fix printing
QWebEnginePage::print() changed to QWebEngineView with Qt 6, and emits a new
printFinished() signal instead of taking a callback. Adjust our API accordingly.
There also is a pdfPrintingFinished signal which we now use to get a bit more
feedback to the user.
TODO: Changelog entry for PDF feedback?
-rw-r--r-- | qutebrowser/browser/browsertab.py | 45 | ||||
-rw-r--r-- | qutebrowser/browser/webengine/webenginetab.py | 22 | ||||
-rw-r--r-- | qutebrowser/browser/webkit/webkittab.py | 11 |
3 files changed, 51 insertions, 27 deletions
diff --git a/qutebrowser/browser/browsertab.py b/qutebrowser/browser/browsertab.py index b6fae4521..800fabf6d 100644 --- a/qutebrowser/browser/browsertab.py +++ b/qutebrowser/browser/browsertab.py @@ -225,13 +225,33 @@ class AbstractAction: self._tab.dump_async(show_source_cb) -class AbstractPrinting: +class AbstractPrinting(QObject): """Attribute ``printing`` of AbstractTab for printing the page.""" - def __init__(self, tab: 'AbstractTab') -> None: + printing_finished = pyqtSignal(bool) + pdf_printing_finished = pyqtSignal(str, bool) # filename, ok + + def __init__(self, tab: 'AbstractTab', parent: QWidget = None) -> None: + super().__init__(parent) self._widget = cast(_WidgetType, None) self._tab = tab + self.printing_finished.connect(self._on_printing_finished) + self.pdf_printing_finished.connect(self._on_pdf_printing_finished) + + @pyqtSlot(bool) + def _on_printing_finished(self, ok): + # Only reporting error here, as the user has feedback from the dialog + # (and probably their printer) already. + if not ok: + message.error("Printing failed!") + + @pyqtSlot(str, bool) + def _on_pdf_printing_finished(self, path, ok): + if ok: + message.info(f"Printed to {path}") + else: + message.error(f"Printing to {path} failed!") def check_pdf_support(self) -> None: """Check whether writing to PDFs is supported. @@ -249,41 +269,28 @@ class AbstractPrinting: """ raise NotImplementedError - def to_pdf(self, filename: str) -> bool: + def to_pdf(self, filename: str) -> None: """Print the tab to a PDF with the given filename.""" raise NotImplementedError - def to_printer(self, printer: QPrinter, - callback: Callable[[bool], None] = None) -> None: + def to_printer(self, printer: QPrinter): """Print the tab. Args: printer: The QPrinter to print to. - callback: Called with a boolean - (True if printing succeeded, False otherwise) """ raise NotImplementedError def show_dialog(self) -> None: """Print with a QPrintDialog.""" - def print_callback(ok: bool) -> None: - """Called when printing finished.""" - if not ok: - message.error("Printing failed!") - diag.deleteLater() - - def do_print() -> None: - """Called when the dialog was closed.""" - self.to_printer(diag.printer(), print_callback) - diag = QPrintDialog(self._tab) if utils.is_mac: # For some reason we get a segfault when using open() on macOS ret = diag.exec() if ret == QDialog.DialogCode.Accepted: - do_print() + self.to_printer(diag.printer()) else: - diag.open(do_print) + diag.open(lambda: self.to_printer(diag.printer())) @dataclasses.dataclass diff --git a/qutebrowser/browser/webengine/webenginetab.py b/qutebrowser/browser/webengine/webenginetab.py index 2974e486f..8416b4ff7 100644 --- a/qutebrowser/browser/webengine/webenginetab.py +++ b/qutebrowser/browser/webengine/webenginetab.py @@ -82,6 +82,16 @@ class WebEnginePrinting(browsertab.AbstractPrinting): _widget: webview.WebEngineView + def connect_signals(self): + page = self._widget.page() + page.pdfPrintingFinished.connect(self.pdf_printing_finished) + try: + # Qt 6 + self._widget.printFinished.connect(self.printing_finished) + except AttributeError: + # Qt 5: Uses callbacks instead + pass + def check_pdf_support(self): pass @@ -92,8 +102,13 @@ class WebEnginePrinting(browsertab.AbstractPrinting): def to_pdf(self, filename): self._widget.page().printToPdf(filename) - def to_printer(self, printer, callback=lambda ok: None): - self._widget.page().print(printer, callback) + def to_printer(self, printer): + try: + # Qt 5 + self._widget.page().print(printer, self.printing_finished.emit) + except AttributeError: + # Qt 6 + self._widget.print(printer) @dataclasses.dataclass @@ -1278,7 +1293,7 @@ class WebEngineTab(browsertab.AbstractTab): tab=self, parent=self) self.zoom = WebEngineZoom(tab=self, parent=self) self.search = WebEngineSearch(tab=self, parent=self) - self.printing = WebEnginePrinting(tab=self) + self.printing = WebEnginePrinting(tab=self, parent=self) self.elements = WebEngineElements(tab=self) self.action = WebEngineAction(tab=self) self.audio = WebEngineAudio(tab=self, parent=self) @@ -1670,5 +1685,6 @@ class WebEngineTab(browsertab.AbstractTab): # pylint: disable=protected-access self.audio._connect_signals() self.search.connect_signals() + self.printing.connect_signals() self._permissions.connect_signals() self._scripts.connect_signals() diff --git a/qutebrowser/browser/webkit/webkittab.py b/qutebrowser/browser/webkit/webkittab.py index 737fdc5b8..03e421ceb 100644 --- a/qutebrowser/browser/webkit/webkittab.py +++ b/qutebrowser/browser/webkit/webkittab.py @@ -92,13 +92,14 @@ class WebKitPrinting(browsertab.AbstractPrinting): def to_pdf(self, filename): printer = QPrinter() printer.setOutputFileName(filename) - self.to_printer(printer) + self._widget.print(printer) + # Can't find out whether there was an error... + self.pdf_printing_finished.emit(filename, True) - def to_printer(self, printer, callback=None): + def to_printer(self, printer): self._widget.print(printer) # Can't find out whether there was an error... - if callback is not None: - callback(True) + self.printing_finished.emit(True) class WebKitSearch(browsertab.AbstractSearch): @@ -881,7 +882,7 @@ class WebKitTab(browsertab.AbstractTab): tab=self, parent=self) self.zoom = WebKitZoom(tab=self, parent=self) self.search = WebKitSearch(tab=self, parent=self) - self.printing = WebKitPrinting(tab=self) + self.printing = WebKitPrinting(tab=self, parent=self) self.elements = WebKitElements(tab=self) self.action = WebKitAction(tab=self) self.audio = WebKitAudio(tab=self, parent=self) |