eric6/WebBrowser/PageScreenDialog.py

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

eric ide

mercurial