WebBrowser/PageScreenDialog.py

branch
QtWebEngine
changeset 4780
1d203a177b16
parent 4631
5c1a96925da4
child 4857
8dba5fb92f12
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/WebBrowser/PageScreenDialog.py	Sat Feb 27 18:19:09 2016 +0100
@@ -0,0 +1,135 @@
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2012 - 2016 Detlev Offenbach <detlev@die-offenbachs.de>
+#
+
+"""
+Module implementing a dialog to save a screenshot of a web page.
+"""
+
+from __future__ import unicode_literals
+
+from PyQt5.QtCore import pyqtSlot, Qt, QFile, QFileInfo, QSize
+from PyQt5.QtGui import QImage, QPainter, QPixmap
+from PyQt5.QtWidgets import QDialog, QDialogButtonBox, QAbstractButton
+
+from E5Gui import E5FileDialog, E5MessageBox
+
+from .Ui_PageScreenDialog import Ui_PageScreenDialog
+
+
+class PageScreenDialog(QDialog, Ui_PageScreenDialog):
+    """
+    Class documentation goes here.
+    """
+    def __init__(self, view, visibleOnly=False, parent=None):
+        """
+        Constructor
+        
+        @param view reference to the web view containing the page to be saved
+            (WebBrowserView)
+        @param visibleOnly flag indicating to just save the visible part
+            of the page (boolean)
+        @param parent reference to the parent widget (QWidget)
+        """
+        super(PageScreenDialog, self).__init__(parent)
+        self.setupUi(self)
+        self.setWindowFlags(Qt.Window)
+        
+        self.__view = view
+        self.__createPixmap(visibleOnly)
+        self.pageScreenLabel.setPixmap(self.__pagePixmap)
+    
+    def __createPixmap(self, visibleOnly):
+        """
+        Private slot to create a pixmap of the associated view's page.
+        
+        @param visibleOnly flag indicating to just save the visible part
+            of the page (boolean)
+        """
+        res = self.__view.page().execJavaScript(
+            "(function() {"
+            "var res = {"
+            "    width: 0,"
+            "    height: 0,"
+            "};"
+            "res.width = document.body.scrollWidth;"
+            "res.height = document.body.scrollHeight;"
+            "return res;"
+            "})()"
+        )
+        if visibleOnly:
+            image = QImage(QSize(res["width"], self.__view.height()),
+                           QImage.Format_ARGB32)
+            painter = QPainter(image)
+            self.__view.render(painter)
+            painter.end()
+        else:
+            # TODO: once QWebEngineView supports this
+            image = QImage(QSize(res["width"], self.__view.height()),
+                           QImage.Format_ARGB32)
+            painter = QPainter(image)
+            self.__view.render(painter)
+            painter.end()
+        
+        self.__pagePixmap = QPixmap.fromImage(image)
+    
+    def __savePageScreen(self):
+        """
+        Private slot to save the page screen.
+        
+        @return flag indicating success (boolean)
+        """
+        fileName = E5FileDialog.getSaveFileName(
+            self,
+            self.tr("Save Page Screen"),
+            self.tr("screen.png"),
+            self.tr("Portable Network Graphics File (*.png)"),
+            E5FileDialog.Options(E5FileDialog.DontConfirmOverwrite))
+        if not fileName:
+            return False
+        
+        if QFileInfo(fileName).exists():
+            res = E5MessageBox.yesNo(
+                self,
+                self.tr("Save Page Screen"),
+                self.tr("<p>The file <b>{0}</b> already exists."
+                        " Overwrite it?</p>").format(fileName),
+                icon=E5MessageBox.Warning)
+            if not res:
+                return False
+        
+        file = QFile(fileName)
+        if not file.open(QFile.WriteOnly):
+            E5MessageBox.warning(
+                self,
+                self.tr("Save Page Screen"),
+                self.tr("Cannot write file '{0}:\n{1}.")
+                .format(fileName, file.errorString()))
+            return False
+        
+        res = self.__pagePixmap.save(file)
+        file.close()
+        
+        if not res:
+            E5MessageBox.warning(
+                self,
+                self.tr("Save Page Screen"),
+                self.tr("Cannot write file '{0}:\n{1}.")
+                .format(fileName, file.errorString()))
+            return False
+        
+        return True
+    
+    @pyqtSlot(QAbstractButton)
+    def on_buttonBox_clicked(self, button):
+        """
+        Private slot to handle clicks of the dialog buttons.
+        
+        @param button button that was clicked (QAbstractButton)
+        """
+        if button == self.buttonBox.button(QDialogButtonBox.Cancel):
+            self.reject()
+        elif button == self.buttonBox.button(QDialogButtonBox.Save):
+            if self.__savePageScreen():
+                self.accept()

eric ide

mercurial