Refactor print handling and fix window.print
On Qt 5.7.1, window.print() caused a CommandError which wasn't handled as the command was called from accept_navigation_request. Instead, we now show the dialog in AbstractPrinting and use that directly.
This commit is contained in:
parent
d1a25b6c3f
commit
9298f3d055
@ -25,7 +25,8 @@ import itertools
|
|||||||
import attr
|
import attr
|
||||||
from PyQt5.QtCore import pyqtSignal, pyqtSlot, QUrl, QObject, QSizeF, Qt
|
from PyQt5.QtCore import pyqtSignal, pyqtSlot, QUrl, QObject, QSizeF, Qt
|
||||||
from PyQt5.QtGui import QIcon
|
from PyQt5.QtGui import QIcon
|
||||||
from PyQt5.QtWidgets import QWidget, QApplication
|
from PyQt5.QtWidgets import QWidget, QApplication, QDialog
|
||||||
|
from PyQt5.QtPrintSupport import QPrintDialog
|
||||||
|
|
||||||
import pygments
|
import pygments
|
||||||
import pygments.lexers
|
import pygments.lexers
|
||||||
@ -187,8 +188,9 @@ class AbstractPrinting:
|
|||||||
|
|
||||||
"""Attribute of AbstractTab for printing the page."""
|
"""Attribute of AbstractTab for printing the page."""
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self, tab):
|
||||||
self._widget = None
|
self._widget = None
|
||||||
|
self._tab = tab
|
||||||
|
|
||||||
def check_pdf_support(self):
|
def check_pdf_support(self):
|
||||||
raise NotImplementedError
|
raise NotImplementedError
|
||||||
@ -212,6 +214,29 @@ class AbstractPrinting:
|
|||||||
"""
|
"""
|
||||||
raise NotImplementedError
|
raise NotImplementedError
|
||||||
|
|
||||||
|
def show_dialog(self):
|
||||||
|
"""Print with a QPrintDialog."""
|
||||||
|
self.check_printer_support()
|
||||||
|
|
||||||
|
def print_callback(ok):
|
||||||
|
"""Called when printing finished."""
|
||||||
|
if not ok:
|
||||||
|
message.error("Printing failed!")
|
||||||
|
diag.deleteLater()
|
||||||
|
|
||||||
|
def do_print():
|
||||||
|
"""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.Accepted:
|
||||||
|
do_print()
|
||||||
|
else:
|
||||||
|
diag.open(do_print)
|
||||||
|
|
||||||
|
|
||||||
class AbstractSearch(QObject):
|
class AbstractSearch(QObject):
|
||||||
|
|
||||||
|
@ -25,9 +25,9 @@ import shlex
|
|||||||
import functools
|
import functools
|
||||||
import typing
|
import typing
|
||||||
|
|
||||||
from PyQt5.QtWidgets import QApplication, QTabBar, QDialog
|
from PyQt5.QtWidgets import QApplication, QTabBar
|
||||||
from PyQt5.QtCore import pyqtSlot, Qt, QUrl, QEvent, QUrlQuery
|
from PyQt5.QtCore import pyqtSlot, Qt, QUrl, QEvent, QUrlQuery
|
||||||
from PyQt5.QtPrintSupport import QPrintDialog, QPrintPreviewDialog
|
from PyQt5.QtPrintSupport import QPrintPreviewDialog
|
||||||
|
|
||||||
from qutebrowser.commands import userscripts, cmdexc, cmdutils, runners
|
from qutebrowser.commands import userscripts, cmdexc, cmdutils, runners
|
||||||
from qutebrowser.config import config, configdata
|
from qutebrowser.config import config, configdata
|
||||||
@ -415,27 +415,6 @@ class CommandDispatcher:
|
|||||||
tab.printing.to_pdf(filename)
|
tab.printing.to_pdf(filename)
|
||||||
log.misc.debug("Print to file: {}".format(filename))
|
log.misc.debug("Print to file: {}".format(filename))
|
||||||
|
|
||||||
def _print(self, tab):
|
|
||||||
"""Print with a QPrintDialog."""
|
|
||||||
def print_callback(ok):
|
|
||||||
"""Called when printing finished."""
|
|
||||||
if not ok:
|
|
||||||
message.error("Printing failed!")
|
|
||||||
diag.deleteLater()
|
|
||||||
|
|
||||||
def do_print():
|
|
||||||
"""Called when the dialog was closed."""
|
|
||||||
tab.printing.to_printer(diag.printer(), print_callback)
|
|
||||||
|
|
||||||
diag = QPrintDialog(tab)
|
|
||||||
if utils.is_mac:
|
|
||||||
# For some reason we get a segfault when using open() on macOS
|
|
||||||
ret = diag.exec_()
|
|
||||||
if ret == QDialog.Accepted:
|
|
||||||
do_print()
|
|
||||||
else:
|
|
||||||
diag.open(do_print)
|
|
||||||
|
|
||||||
@cmdutils.register(instance='command-dispatcher', name='print',
|
@cmdutils.register(instance='command-dispatcher', name='print',
|
||||||
scope='window')
|
scope='window')
|
||||||
@cmdutils.argument('count', count=True)
|
@cmdutils.argument('count', count=True)
|
||||||
@ -453,22 +432,15 @@ class CommandDispatcher:
|
|||||||
return
|
return
|
||||||
|
|
||||||
try:
|
try:
|
||||||
if pdf:
|
|
||||||
tab.printing.check_pdf_support()
|
|
||||||
else:
|
|
||||||
tab.printing.check_printer_support()
|
|
||||||
if preview:
|
if preview:
|
||||||
tab.printing.check_preview_support()
|
self._print_preview(tab)
|
||||||
|
elif pdf:
|
||||||
|
self._print_pdf(tab, pdf)
|
||||||
|
else:
|
||||||
|
tab.printing.show_dialog()
|
||||||
except browsertab.WebTabError as e:
|
except browsertab.WebTabError as e:
|
||||||
raise cmdexc.CommandError(e)
|
raise cmdexc.CommandError(e)
|
||||||
|
|
||||||
if preview:
|
|
||||||
self._print_preview(tab)
|
|
||||||
elif pdf:
|
|
||||||
self._print_pdf(tab, pdf)
|
|
||||||
else:
|
|
||||||
self._print(tab)
|
|
||||||
|
|
||||||
@cmdutils.register(instance='command-dispatcher', scope='window')
|
@cmdutils.register(instance='command-dispatcher', scope='window')
|
||||||
def tab_clone(self, bg=False, window=False):
|
def tab_clone(self, bg=False, window=False):
|
||||||
"""Duplicate the current tab.
|
"""Duplicate the current tab.
|
||||||
|
@ -976,7 +976,7 @@ class WebEngineTab(browsertab.AbstractTab):
|
|||||||
tab=self, parent=self)
|
tab=self, parent=self)
|
||||||
self.zoom = WebEngineZoom(tab=self, parent=self)
|
self.zoom = WebEngineZoom(tab=self, parent=self)
|
||||||
self.search = WebEngineSearch(parent=self)
|
self.search = WebEngineSearch(parent=self)
|
||||||
self.printing = WebEnginePrinting()
|
self.printing = WebEnginePrinting(tab=self)
|
||||||
self.elements = WebEngineElements(tab=self)
|
self.elements = WebEngineElements(tab=self)
|
||||||
self.action = WebEngineAction(tab=self)
|
self.action = WebEngineAction(tab=self)
|
||||||
self.audio = WebEngineAudio(parent=self)
|
self.audio = WebEngineAudio(parent=self)
|
||||||
@ -1315,10 +1315,10 @@ class WebEngineTab(browsertab.AbstractTab):
|
|||||||
super()._on_navigation_request(navigation)
|
super()._on_navigation_request(navigation)
|
||||||
|
|
||||||
if navigation.url == QUrl('qute://print'):
|
if navigation.url == QUrl('qute://print'):
|
||||||
command_dispatcher = objreg.get('command-dispatcher',
|
try:
|
||||||
scope='window',
|
self.printing.show_dialog()
|
||||||
window=self.win_id)
|
except browsertab.WebTabError as e:
|
||||||
command_dispatcher.printpage()
|
message.error(str(e))
|
||||||
navigation.accepted = False
|
navigation.accepted = False
|
||||||
|
|
||||||
if not navigation.accepted or not navigation.is_main_frame:
|
if not navigation.accepted or not navigation.is_main_frame:
|
||||||
|
@ -658,7 +658,7 @@ class WebKitTab(browsertab.AbstractTab):
|
|||||||
tab=self, parent=self)
|
tab=self, parent=self)
|
||||||
self.zoom = WebKitZoom(tab=self, parent=self)
|
self.zoom = WebKitZoom(tab=self, parent=self)
|
||||||
self.search = WebKitSearch(parent=self)
|
self.search = WebKitSearch(parent=self)
|
||||||
self.printing = WebKitPrinting()
|
self.printing = WebKitPrinting(tab=self)
|
||||||
self.elements = WebKitElements(tab=self)
|
self.elements = WebKitElements(tab=self)
|
||||||
self.action = WebKitAction(tab=self)
|
self.action = WebKitAction(tab=self)
|
||||||
self.audio = WebKitAudio(parent=self)
|
self.audio = WebKitAudio(parent=self)
|
||||||
|
Loading…
Reference in New Issue
Block a user