Sat, 27 Feb 2016 18:19:09 +0100
Continued porting the web browser.
- ported the save page scree stuff (full page doesn't work yet because of QtWebEngine)
--- /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>