eric6/Helpviewer/PageScreenDialog.py

changeset 6942
2602857055c5
parent 6645
ad476851d7e0
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
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, visibleOnly=False, parent=None):
26 """
27 Constructor
28
29 @param view reference to the web view containing the page to be saved
30 (HelpBrowser)
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 page = self.__view.page()
51 origSize = page.viewportSize()
52 if not visibleOnly:
53 page.setViewportSize(page.mainFrame().contentsSize())
54
55 image = QImage(page.viewportSize(), QImage.Format_ARGB32)
56 painter = QPainter(image)
57 page.mainFrame().render(painter)
58 painter.end()
59
60 self.__pagePixmap = QPixmap.fromImage(image)
61
62 page.setViewportSize(origSize)
63
64 def __savePageScreen(self):
65 """
66 Private slot to save the page screen.
67
68 @return flag indicating success (boolean)
69 """
70 fileName = E5FileDialog.getSaveFileName(
71 self,
72 self.tr("Save Page Screen"),
73 self.tr("screen.png"),
74 self.tr("Portable Network Graphics File (*.png)"),
75 E5FileDialog.Options(E5FileDialog.DontConfirmOverwrite))
76 if not fileName:
77 return False
78
79 if QFileInfo(fileName).exists():
80 res = E5MessageBox.yesNo(
81 self,
82 self.tr("Save Page Screen"),
83 self.tr("<p>The file <b>{0}</b> already exists."
84 " Overwrite it?</p>").format(fileName),
85 icon=E5MessageBox.Warning)
86 if not res:
87 return False
88
89 file = QFile(fileName)
90 if not file.open(QFile.WriteOnly):
91 E5MessageBox.warning(
92 self,
93 self.tr("Save Page Screen"),
94 self.tr("Cannot write file '{0}:\n{1}.")
95 .format(fileName, file.errorString()))
96 return False
97
98 res = self.__pagePixmap.save(file)
99 file.close()
100
101 if not res:
102 E5MessageBox.warning(
103 self,
104 self.tr("Save Page Screen"),
105 self.tr("Cannot write file '{0}:\n{1}.")
106 .format(fileName, file.errorString()))
107 return False
108
109 return True
110
111 @pyqtSlot(QAbstractButton)
112 def on_buttonBox_clicked(self, button):
113 """
114 Private slot to handle clicks of the dialog buttons.
115
116 @param button button that was clicked (QAbstractButton)
117 """
118 if button == self.buttonBox.button(QDialogButtonBox.Cancel):
119 self.reject()
120 elif button == self.buttonBox.button(QDialogButtonBox.Save):
121 if self.__savePageScreen():
122 self.accept()

eric ide

mercurial