WebBrowser/PageScreenDialog.py

branch
QtWebEngine
changeset 4780
1d203a177b16
parent 4631
5c1a96925da4
child 4857
8dba5fb92f12
equal deleted inserted replaced
4779:173e0d2ab1f9 4780:1d203a177b16
1 # -*- coding: utf-8 -*-
2
3 # Copyright (c) 2012 - 2016 Detlev Offenbach <detlev@die-offenbachs.de>
4 #
5
6 """
7 Module implementing a dialog to save a screenshot of a web page.
8 """
9
10 from __future__ import unicode_literals
11
12 from PyQt5.QtCore import pyqtSlot, Qt, QFile, QFileInfo, QSize
13 from PyQt5.QtGui import QImage, QPainter, QPixmap
14 from PyQt5.QtWidgets import QDialog, QDialogButtonBox, QAbstractButton
15
16 from E5Gui import E5FileDialog, E5MessageBox
17
18 from .Ui_PageScreenDialog import Ui_PageScreenDialog
19
20
21 class PageScreenDialog(QDialog, Ui_PageScreenDialog):
22 """
23 Class documentation goes here.
24 """
25 def __init__(self, view, visibleOnly=False, parent=None):
26 """
27 Constructor
28
29 @param view reference to the web view containing the page to be saved
30 (WebBrowserView)
31 @param visibleOnly flag indicating to just save the visible part
32 of the page (boolean)
33 @param parent reference to the parent widget (QWidget)
34 """
35 super(PageScreenDialog, self).__init__(parent)
36 self.setupUi(self)
37 self.setWindowFlags(Qt.Window)
38
39 self.__view = view
40 self.__createPixmap(visibleOnly)
41 self.pageScreenLabel.setPixmap(self.__pagePixmap)
42
43 def __createPixmap(self, visibleOnly):
44 """
45 Private slot to create a pixmap of the associated view's page.
46
47 @param visibleOnly flag indicating to just save the visible part
48 of the page (boolean)
49 """
50 res = self.__view.page().execJavaScript(
51 "(function() {"
52 "var res = {"
53 " width: 0,"
54 " height: 0,"
55 "};"
56 "res.width = document.body.scrollWidth;"
57 "res.height = document.body.scrollHeight;"
58 "return res;"
59 "})()"
60 )
61 if visibleOnly:
62 image = QImage(QSize(res["width"], self.__view.height()),
63 QImage.Format_ARGB32)
64 painter = QPainter(image)
65 self.__view.render(painter)
66 painter.end()
67 else:
68 # TODO: once QWebEngineView supports this
69 image = QImage(QSize(res["width"], self.__view.height()),
70 QImage.Format_ARGB32)
71 painter = QPainter(image)
72 self.__view.render(painter)
73 painter.end()
74
75 self.__pagePixmap = QPixmap.fromImage(image)
76
77 def __savePageScreen(self):
78 """
79 Private slot to save the page screen.
80
81 @return flag indicating success (boolean)
82 """
83 fileName = E5FileDialog.getSaveFileName(
84 self,
85 self.tr("Save Page Screen"),
86 self.tr("screen.png"),
87 self.tr("Portable Network Graphics File (*.png)"),
88 E5FileDialog.Options(E5FileDialog.DontConfirmOverwrite))
89 if not fileName:
90 return False
91
92 if QFileInfo(fileName).exists():
93 res = E5MessageBox.yesNo(
94 self,
95 self.tr("Save Page Screen"),
96 self.tr("<p>The file <b>{0}</b> already exists."
97 " Overwrite it?</p>").format(fileName),
98 icon=E5MessageBox.Warning)
99 if not res:
100 return False
101
102 file = QFile(fileName)
103 if not file.open(QFile.WriteOnly):
104 E5MessageBox.warning(
105 self,
106 self.tr("Save Page Screen"),
107 self.tr("Cannot write file '{0}:\n{1}.")
108 .format(fileName, file.errorString()))
109 return False
110
111 res = self.__pagePixmap.save(file)
112 file.close()
113
114 if not res:
115 E5MessageBox.warning(
116 self,
117 self.tr("Save Page Screen"),
118 self.tr("Cannot write file '{0}:\n{1}.")
119 .format(fileName, file.errorString()))
120 return False
121
122 return True
123
124 @pyqtSlot(QAbstractButton)
125 def on_buttonBox_clicked(self, button):
126 """
127 Private slot to handle clicks of the dialog buttons.
128
129 @param button button that was clicked (QAbstractButton)
130 """
131 if button == self.buttonBox.button(QDialogButtonBox.Cancel):
132 self.reject()
133 elif button == self.buttonBox.button(QDialogButtonBox.Save):
134 if self.__savePageScreen():
135 self.accept()

eric ide

mercurial