From 2f4c185da0ca7c8c6958368958a4c98f2c77ba5b Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Mon, 6 Feb 2017 09:51:11 +0100 Subject: [PATCH] Implement printing with QtWebEngine --- CHANGELOG.asciidoc | 1 + qutebrowser/browser/browsertab.py | 12 +++++++++++- qutebrowser/browser/commands.py | 18 +++++++++++++++--- qutebrowser/browser/webengine/webenginetab.py | 14 ++++++++++---- qutebrowser/browser/webkit/webkittab.py | 8 +++++++- 5 files changed, 44 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc index 0eca7584a..6916eb630 100644 --- a/CHANGELOG.asciidoc +++ b/CHANGELOG.asciidoc @@ -23,6 +23,7 @@ Added - Userscripts now have a new `$QUTE_COMMANDLINE_TEXT` environment variable, containing the current commandline contents. - New `ripbang` userscript to create a searchengine from a duckduckgo bang - link:https://github.com/annulen/webkit/wiki[QtWebKit Reloaded] (also called QtWebKit-NG) is now supported. +- Printing support for QtWebEngine with Qt >= 5.8 Changed ~~~~~~~ diff --git a/qutebrowser/browser/browsertab.py b/qutebrowser/browser/browsertab.py index febb6dc4f..b60267829 100644 --- a/qutebrowser/browser/browsertab.py +++ b/qutebrowser/browser/browsertab.py @@ -107,10 +107,20 @@ class AbstractPrinting: def check_printer_support(self): raise NotImplementedError + def check_preview_support(self): + raise NotImplementedError + def to_pdf(self, filename): raise NotImplementedError - def to_printer(self, printer): + def to_printer(self, printer, callback=None): + """Print the tab. + + Args: + printer: The QPrinter to print to. + callback: Called with a boolean + (True if printing succeeded, False otherwise) + """ raise NotImplementedError diff --git a/qutebrowser/browser/commands.py b/qutebrowser/browser/commands.py index 95dd0e4f2..c32b58d05 100644 --- a/qutebrowser/browser/commands.py +++ b/qutebrowser/browser/commands.py @@ -370,16 +370,23 @@ class CommandDispatcher: tab.printing.check_pdf_support() else: tab.printing.check_printer_support() + if preview: + tab.printing.check_preview_support() except browsertab.WebTabError as e: raise cmdexc.CommandError(e) if preview: + def print_callback(ok): + if not ok: + message.error("Printing failed!") + diag = QPrintPreviewDialog() diag.setAttribute(Qt.WA_DeleteOnClose) diag.setWindowFlags(diag.windowFlags() | Qt.WindowMaximizeButtonHint | Qt.WindowMinimizeButtonHint) - diag.paintRequested.connect(tab.printing.to_printer) + diag.paintRequested.connect(functools.partial( + tab.printing.to_printer, callback=print_callback)) diag.exec_() elif pdf: pdf = os.path.expanduser(pdf) @@ -389,9 +396,14 @@ class CommandDispatcher: tab.printing.to_pdf(pdf) log.misc.debug("Print to file: {}".format(pdf)) else: + def print_callback(ok): + if not ok: + message.error("Printing failed!") + diag.deleteLater() + diag = QPrintDialog() - diag.setAttribute(Qt.WA_DeleteOnClose) - diag.open(lambda: tab.printing.to_printer(diag.printer())) + diag.open(lambda: + tab.printing.to_printer(diag.printer(), print_callback)) @cmdutils.register(instance='command-dispatcher', scope='window') def tab_clone(self, bg=False, window=False): diff --git a/qutebrowser/browser/webengine/webenginetab.py b/qutebrowser/browser/webengine/webenginetab.py index f78cce557..4d5e405f4 100644 --- a/qutebrowser/browser/webengine/webenginetab.py +++ b/qutebrowser/browser/webengine/webenginetab.py @@ -89,15 +89,21 @@ class WebEnginePrinting(browsertab.AbstractPrinting): "Printing to PDF is unsupported with QtWebEngine on Qt < 5.7") def check_printer_support(self): + if not hasattr(self._widget.page(), 'print'): + raise browsertab.WebTabError( + "Printing is unsupported with QtWebEngine on Qt < 5.8") + + def check_preview_support(self): raise browsertab.WebTabError( - "Printing is unsupported with QtWebEngine") + "Print previews are unsupported with QtWebEngine") def to_pdf(self, filename): self._widget.page().printToPdf(filename) - def to_printer(self, printer): - # Should never be called - assert False + def to_printer(self, printer, callback=None): + if callback is None: + callback = lambda _ok: None + self._widget.page().print(printer, callback) class WebEngineSearch(browsertab.AbstractSearch): diff --git a/qutebrowser/browser/webkit/webkittab.py b/qutebrowser/browser/webkit/webkittab.py index 6c12d875c..806b6147f 100644 --- a/qutebrowser/browser/webkit/webkittab.py +++ b/qutebrowser/browser/webkit/webkittab.py @@ -68,13 +68,19 @@ class WebKitPrinting(browsertab.AbstractPrinting): def check_printer_support(self): self._do_check() + def check_preview_support(self): + self._do_check() + def to_pdf(self, filename): printer = QPrinter() printer.setOutputFileName(filename) self.to_printer(printer) - def to_printer(self, printer): + def to_printer(self, printer, callback): self._widget.print(printer) + # Can't find out whether there was an error... + if callback is not None: + callback(True) class WebKitSearch(browsertab.AbstractSearch):