eric7/WebBrowser/PageScreenDialog.py

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

eric ide

mercurial