src/eric7/WebBrowser/PageScreenDialog.py

branch
eric7
changeset 9209
b99e7fd55fd3
parent 9162
8b75b1668583
child 9221
bf71ee032bb4
equal deleted inserted replaced
9208:3fc8dfeb6ebe 9209:b99e7fd55fd3
1 # -*- coding: utf-8 -*-
2
3 # Copyright (c) 2012 - 2022 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 import pathlib
11
12 from PyQt6.QtCore import pyqtSlot, Qt, QSize
13 from PyQt6.QtGui import QImage, QPainter, QPixmap
14 from PyQt6.QtWidgets import QDialog, QDialogButtonBox, QAbstractButton
15
16 from EricWidgets import EricFileDialog, EricMessageBox
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().__init__(parent)
34 self.setupUi(self)
35 self.setWindowFlags(Qt.WindowType.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.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 = EricFileDialog.getSaveFileName(
72 self,
73 self.tr("Save Page Screen"),
74 self.tr("screen.png"),
75 self.tr("Portable Network Graphics File (*.png)"),
76 EricFileDialog.DontConfirmOverwrite)
77 if not fileName:
78 return False
79
80 if pathlib.Path(fileName).exists():
81 res = EricMessageBox.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=EricMessageBox.Warning)
87 if not res:
88 return False
89
90 res = self.__pagePixmap.save(fileName)
91 if not res:
92 EricMessageBox.warning(
93 self,
94 self.tr("Save Page Screen"),
95 self.tr("Cannot write file '{0}'.").format(fileName))
96 return False
97
98 return True
99
100 @pyqtSlot(QAbstractButton)
101 def on_buttonBox_clicked(self, button):
102 """
103 Private slot to handle clicks of the dialog buttons.
104
105 @param button button that was clicked (QAbstractButton)
106 """
107 if button == self.buttonBox.button(
108 QDialogButtonBox.StandardButton.Cancel
109 ):
110 self.reject()
111 elif (
112 button == self.buttonBox.button(
113 QDialogButtonBox.StandardButton.Save) and
114 self.__savePageScreen()
115 ):
116 self.accept()

eric ide

mercurial