Continued porting the web browser. QtWebEngine

Sat, 27 Feb 2016 18:19:09 +0100

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Sat, 27 Feb 2016 18:19:09 +0100
branch
QtWebEngine
changeset 4780
1d203a177b16
parent 4779
173e0d2ab1f9
child 4781
15d416f1eca5

Continued porting the web browser.

- ported the save page scree stuff (full page doesn't work yet because of QtWebEngine)

WebBrowser/PageScreenDialog.py file | annotate | diff | comparison | revisions
WebBrowser/PageScreenDialog.ui file | annotate | diff | comparison | revisions
WebBrowser/WebBrowserView.py file | annotate | diff | comparison | revisions
WebBrowser/WebBrowserWindow.py file | annotate | diff | comparison | revisions
eric6.e4p file | annotate | diff | comparison | revisions
--- /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()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/WebBrowser/PageScreenDialog.ui	Sat Feb 27 18:19:09 2016 +0100
@@ -0,0 +1,76 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>PageScreenDialog</class>
+ <widget class="QDialog" name="PageScreenDialog">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>500</width>
+    <height>450</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Page Screen</string>
+  </property>
+  <property name="sizeGripEnabled">
+   <bool>true</bool>
+  </property>
+  <layout class="QVBoxLayout" name="verticalLayout">
+   <item>
+    <widget class="QScrollArea" name="scrollArea">
+     <property name="frameShape">
+      <enum>QFrame::NoFrame</enum>
+     </property>
+     <property name="frameShadow">
+      <enum>QFrame::Plain</enum>
+     </property>
+     <property name="lineWidth">
+      <number>0</number>
+     </property>
+     <property name="widgetResizable">
+      <bool>true</bool>
+     </property>
+     <widget class="QWidget" name="scrollAreaWidgetContents">
+      <property name="geometry">
+       <rect>
+        <x>0</x>
+        <y>0</y>
+        <width>482</width>
+        <height>403</height>
+       </rect>
+      </property>
+      <layout class="QHBoxLayout" name="horizontalLayout">
+       <property name="margin">
+        <number>0</number>
+       </property>
+       <item>
+        <widget class="QLabel" name="pageScreenLabel">
+         <property name="alignment">
+          <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
+         </property>
+        </widget>
+       </item>
+      </layout>
+     </widget>
+    </widget>
+   </item>
+   <item>
+    <widget class="QDialogButtonBox" name="buttonBox">
+     <property name="orientation">
+      <enum>Qt::Horizontal</enum>
+     </property>
+     <property name="standardButtons">
+      <set>QDialogButtonBox::Cancel|QDialogButtonBox::Save</set>
+     </property>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <tabstops>
+  <tabstop>scrollArea</tabstop>
+  <tabstop>buttonBox</tabstop>
+ </tabstops>
+ <resources/>
+ <connections/>
+</ui>
--- a/WebBrowser/WebBrowserView.py	Sat Feb 27 13:10:03 2016 +0100
+++ b/WebBrowser/WebBrowserView.py	Sat Feb 27 18:19:09 2016 +0100
@@ -2108,3 +2108,11 @@
 ##        return True
 ##    
 ##    return False
+    
+    ######################
+    
+    def renderWidgetPixmap(self):
+        return self.__rwhvqt.grabFramebuffer()
+    
+    def repaintRenderWidget(self):
+        self.__rwhvqt.repaint()
--- a/WebBrowser/WebBrowserWindow.py	Sat Feb 27 13:10:03 2016 +0100
+++ b/WebBrowser/WebBrowserWindow.py	Sat Feb 27 18:19:09 2016 +0100
@@ -588,38 +588,38 @@
 ##            self.saveAsAct.triggered.connect(self.__savePageAs)
 ##        self.__actions.append(self.saveAsAct)
 ##        
-##        self.savePageScreenAct = E5Action(
-##            self.tr('Save Page Screen'),
-##            UI.PixmapCache.getIcon("fileSavePixmap.png"),
-##            self.tr('Save Page Screen...'),
-##            0, 0, self, 'webbrowser_file_save_page_screen')
-##        self.savePageScreenAct.setStatusTip(
-##            self.tr('Save the current page as a screen shot'))
-##        self.savePageScreenAct.setWhatsThis(self.tr(
-##            """<b>Save Page Screen...</b>"""
-##            """<p>Saves the current page as a screen shot.</p>"""
-##        ))
-##        if not self.__initShortcutsOnly:
-##            self.savePageScreenAct.triggered.connect(self.__savePageScreen)
-##        self.__actions.append(self.savePageScreenAct)
-##        
-##        self.saveVisiblePageScreenAct = E5Action(
-##            self.tr('Save Visible Page Screen'),
-##            UI.PixmapCache.getIcon("fileSaveVisiblePixmap.png"),
-##            self.tr('Save Visible Page Screen...'),
-##            0, 0, self, 'webbrowser_file_save_visible_page_screen')
-##        self.saveVisiblePageScreenAct.setStatusTip(
-##            self.tr('Save the visible part of the current page as a'
-##                    ' screen shot'))
-##        self.saveVisiblePageScreenAct.setWhatsThis(self.tr(
-##            """<b>Save Visible Page Screen...</b>"""
-##            """<p>Saves the visible part of the current page as a"""
-##            """ screen shot.</p>"""
-##        ))
-##        if not self.__initShortcutsOnly:
-##            self.saveVisiblePageScreenAct.triggered.connect(
-##                self.__saveVisiblePageScreen)
-##        self.__actions.append(self.saveVisiblePageScreenAct)
+        self.savePageScreenAct = E5Action(
+            self.tr('Save Page Screen'),
+            UI.PixmapCache.getIcon("fileSavePixmap.png"),
+            self.tr('Save Page Screen...'),
+            0, 0, self, 'webbrowser_file_save_page_screen')
+        self.savePageScreenAct.setStatusTip(
+            self.tr('Save the current page as a screen shot'))
+        self.savePageScreenAct.setWhatsThis(self.tr(
+            """<b>Save Page Screen...</b>"""
+            """<p>Saves the current page as a screen shot.</p>"""
+        ))
+        if not self.__initShortcutsOnly:
+            self.savePageScreenAct.triggered.connect(self.__savePageScreen)
+        self.__actions.append(self.savePageScreenAct)
+        
+        self.saveVisiblePageScreenAct = E5Action(
+            self.tr('Save Visible Page Screen'),
+            UI.PixmapCache.getIcon("fileSaveVisiblePixmap.png"),
+            self.tr('Save Visible Page Screen...'),
+            0, 0, self, 'webbrowser_file_save_visible_page_screen')
+        self.saveVisiblePageScreenAct.setStatusTip(
+            self.tr('Save the visible part of the current page as a'
+                    ' screen shot'))
+        self.saveVisiblePageScreenAct.setWhatsThis(self.tr(
+            """<b>Save Visible Page Screen...</b>"""
+            """<p>Saves the visible part of the current page as a"""
+            """ screen shot.</p>"""
+        ))
+        if not self.__initShortcutsOnly:
+            self.saveVisiblePageScreenAct.triggered.connect(
+                self.__saveVisiblePageScreen)
+        self.__actions.append(self.saveVisiblePageScreenAct)
         
         bookmarksManager = self.bookmarksManager()
         self.importBookmarksAct = E5Action(
@@ -1754,9 +1754,9 @@
         menu.addAction(self.openTabAct)
         menu.addSeparator()
 ##        menu.addAction(self.saveAsAct)
-##        menu.addAction(self.savePageScreenAct)
-##        menu.addAction(self.saveVisiblePageScreenAct)
-##        menu.addSeparator()
+        menu.addAction(self.savePageScreenAct)
+        menu.addAction(self.saveVisiblePageScreenAct)
+        menu.addSeparator()
 ##        menu.addAction(self.printPreviewAct)
 ##        menu.addAction(self.printAct)
 ##        menu.addAction(self.printPdfAct)
@@ -1922,8 +1922,8 @@
         filetb.addAction(self.openTabAct)
         filetb.addSeparator()
 ##        filetb.addAction(self.saveAsAct)
-##        filetb.addAction(self.savePageScreenAct)
-##        filetb.addSeparator()
+        filetb.addAction(self.savePageScreenAct)
+        filetb.addSeparator()
 ##        filetb.addAction(self.printPreviewAct)
 ##        filetb.addAction(self.printAct)
 ##        filetb.addAction(self.printPdfAct)
@@ -1931,12 +1931,12 @@
         filetb.addAction(self.closeAct)
         filetb.addAction(self.exitAct)
         
-##        self.savePageScreenMenu = QMenu(self)
-##        self.savePageScreenMenu.addAction(self.savePageScreenAct)
-##        self.savePageScreenMenu.addAction(self.saveVisiblePageScreenAct)
-##        savePageScreenButton = filetb.widgetForAction(self.savePageScreenAct)
-##        savePageScreenButton.setMenu(self.savePageScreenMenu)
-##        savePageScreenButton.setPopupMode(QToolButton.MenuButtonPopup)
+        self.savePageScreenMenu = QMenu(self)
+        self.savePageScreenMenu.addAction(self.savePageScreenAct)
+        self.savePageScreenMenu.addAction(self.saveVisiblePageScreenAct)
+        savePageScreenButton = filetb.widgetForAction(self.savePageScreenAct)
+        savePageScreenButton.setMenu(self.savePageScreenMenu)
+        savePageScreenButton.setPopupMode(QToolButton.MenuButtonPopup)
         
         edittb = self.addToolBar(self.tr("Edit"))
         edittb.setObjectName("EditToolBar")
@@ -2237,25 +2237,26 @@
 ##        if browser is not None:
 ##            browser.saveAs()
 ##    
-##    @pyqtSlot()
-##    def __savePageScreen(self, visibleOnly=False):
-##        """
-##        Private slot to save the current page as a screen shot.
-##        
-##        @param visibleOnly flag indicating to just save the visible part
-##            of the page (boolean)
-##        """
-##        from .PageScreenDialog import PageScreenDialog
-##        self.__pageScreen = PageScreenDialog(
-##            self.currentBrowser(), visibleOnly=visibleOnly)
-##        self.__pageScreen.show()
-##        
-##    def __saveVisiblePageScreen(self):
-##        """
-##        Private slot to save the visible part of the current page as a screen
-##        shot.
-##        """
-##        self.__savePageScreen(visibleOnly=True)
+    @pyqtSlot()
+    def __savePageScreen(self, visibleOnly=False):
+        """
+        Private slot to save the current page as a screen shot.
+        
+        @param visibleOnly flag indicating to just save the visible part
+            of the page (boolean)
+        """
+        from .PageScreenDialog import PageScreenDialog
+        self.__pageScreen = PageScreenDialog(
+            self.currentBrowser(), visibleOnly=visibleOnly)
+        self.__pageScreen.show()
+        
+    @pyqtSlot()
+    def __saveVisiblePageScreen(self):
+        """
+        Private slot to save the visible part of the current page as a screen
+        shot.
+        """
+        self.__savePageScreen(visibleOnly=True)
         
     def __about(self):
         """
--- a/eric6.e4p	Sat Feb 27 13:10:03 2016 +0100
+++ b/eric6.e4p	Sat Feb 27 18:19:09 2016 +0100
@@ -1349,6 +1349,7 @@
     <Source>WebBrowser/OpenSearch/OpenSearchReader.py</Source>
     <Source>WebBrowser/OpenSearch/OpenSearchWriter.py</Source>
     <Source>WebBrowser/OpenSearch/__init__.py</Source>
+    <Source>WebBrowser/PageScreenDialog.py</Source>
     <Source>WebBrowser/Passwords/LoginForm.py</Source>
     <Source>WebBrowser/Passwords/PasswordManager.py</Source>
     <Source>WebBrowser/Passwords/PasswordModel.py</Source>
@@ -1821,6 +1822,7 @@
     <Form>WebBrowser/History/HistoryDialog.ui</Form>
     <Form>WebBrowser/OpenSearch/OpenSearchDialog.ui</Form>
     <Form>WebBrowser/OpenSearch/OpenSearchEditDialog.ui</Form>
+    <Form>WebBrowser/PageScreenDialog.ui</Form>
     <Form>WebBrowser/Passwords/PasswordsDialog.ui</Form>
     <Form>WebBrowser/PersonalInformationManager/PersonalDataDialog.ui</Form>
     <Form>WebBrowser/SearchWidget.ui</Form>

eric ide

mercurial