summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlorian Bruhin <me@the-compiler.org>2022-05-10 17:20:47 +0200
committerFlorian Bruhin <me@the-compiler.org>2022-06-22 17:41:11 +0200
commit0db2bc20f634938203f40ff64cfc4fce2542172f (patch)
treedfc9ab2ac7aa06e9aea205852cd49ec014782864
parent99b937b4eb515d87eaa817c1421b8d0e42837f4e (diff)
downloadqutebrowser-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.py45
-rw-r--r--qutebrowser/browser/webengine/webenginetab.py22
-rw-r--r--qutebrowser/browser/webkit/webkittab.py11
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)