WebBrowser/WebBrowserView.py

changeset 5530
93f95c4b3153
parent 5526
11337e4fba52
child 5532
3a7c5deab9b7
diff -r 4fdbb36fe794 -r 93f95c4b3153 WebBrowser/WebBrowserView.py
--- a/WebBrowser/WebBrowserView.py	Sat Feb 18 12:23:35 2017 +0100
+++ b/WebBrowser/WebBrowserView.py	Sat Feb 18 19:59:14 2017 +0100
@@ -17,13 +17,14 @@
 import os
 
 from PyQt5.QtCore import pyqtSignal, QUrl, QFileInfo, Qt, QTimer, QEvent, \
-    QPoint, QDateTime, qVersion
+    QPoint, QDateTime, qVersion, QStandardPaths
 from PyQt5.QtGui import QDesktopServices, QClipboard, QIcon, \
     QContextMenuEvent, QPixmap
 from PyQt5.QtWidgets import qApp, QStyle, QMenu, QApplication
-from PyQt5.QtWebEngineWidgets import QWebEngineView, QWebEnginePage
+from PyQt5.QtWebEngineWidgets import QWebEngineView, QWebEnginePage, \
+    QWebEngineDownloadItem
 
-from E5Gui import E5MessageBox
+from E5Gui import E5MessageBox, E5FileDialog
 
 from WebBrowser.WebBrowserWindow import WebBrowserWindow
 from .WebBrowserPage import WebBrowserPage
@@ -503,6 +504,28 @@
         @type WebHitTestResult
         """
         # TODO: Qt 5.8 - add support for spell checking
+        spellCheckActionCount = 0
+        if qVersion() >= "5.7.0":
+            contextMenuData = self.page().contextMenuData()
+            hitTest.updateWithContextMenuData(contextMenuData)
+            
+            if qVersion() >= "5.8.0" and \
+               bool(contextMenuData.misspelledWord()):
+                boldFont = menu.font()
+                boldFont.setBold(True)
+                
+                for suggestion in contextMenuData.spellCheckerSuggestions():
+                    act = menu.addAction(
+                        suggestion,
+                        lambda: self.page().replaceMisspelledWord(suggestion))
+                    act.setFont(boldFont)
+                
+                if bool(menu.actions()):
+                    menu.addAction(self.tr("No suggestions")).setEnabled(False)
+                
+                menu.addSeparator()
+                spellCheckActionCount = len(menu.actions())
+        
         if not hitTest.linkUrl().isEmpty() and \
                 hitTest.linkUrl().scheme() != "javascript":
             self.__createLinkContextMenu(menu, hitTest)
@@ -514,15 +537,17 @@
             self.__createMediaContextMenu(menu, hitTest)
         
         if hitTest.isContentEditable():
-            menu.addAction(self.__mw.undoAct)
-            menu.addAction(self.__mw.redoAct)
-            menu.addSeparator()
-            menu.addAction(self.__mw.cutAct)
-            menu.addAction(self.__mw.copyAct)
-            menu.addAction(self.__mw.pasteAct)
-            menu.addSeparator()
-            self.__mw.personalInformationManager().createSubMenu(
-                menu, self, hitTest)
+            # check, if only spell checker actions were added
+            if len(menu.actions()) == spellCheckActionCount:
+                menu.addAction(self.__mw.undoAct)
+                menu.addAction(self.__mw.redoAct)
+                menu.addSeparator()
+                menu.addAction(self.__mw.cutAct)
+                menu.addAction(self.__mw.copyAct)
+                menu.addAction(self.__mw.pasteAct)
+                menu.addSeparator()
+                self.__mw.personalInformationManager().createSubMenu(
+                    menu, self, hitTest)
             
             if hitTest.tagName() == "input":
                 menu.addSeparator()
@@ -1340,7 +1365,6 @@
         """
         # find the render widget receiving events for the web page
         if obj is self and evt.type() == QEvent.ChildAdded:
-            # TODO: Qt 5.8 - check, if this still works on 5.8 (see Qupzilla)
             child = evt.child()
             if child and child.inherits(
                     "QtWebEngineCore::RenderWidgetHostViewQtDelegateWidget"):
@@ -1615,8 +1639,76 @@
         if url.isEmpty():
             return
         
-        # TODO: Qt 5.8 - use QWebEnginePage.save()
-        self.triggerPageAction(QWebEnginePage.SavePage)
+        if qVersion() >= "5.8.0":
+            # since Qt 5.8.0
+            fileName, savePageFormat = self.__getSavePageFileNameAndFormat()
+            if fileName:
+                self.page().save(fileName, savePageFormat)
+        else:
+            self.triggerPageAction(QWebEnginePage.SavePage)
+    
+    def __getSavePageFileNameAndFormat(self):
+        """
+        Private method to get the file name to save the page to.
+        
+        @return tuple containing the file name to save to and the
+            save page format
+        @rtype tuple of (str, QWebEngineDownloadItem.SavePageFormat)
+        """
+        documentLocation = QStandardPaths.writableLocation(
+            QStandardPaths.DocumentsLocation)
+        filterList = [
+            self.tr("Web Archive (*.mhtml *.mht)"),
+            self.tr("HTML File (*.html *.htm)"),
+            self.tr("HTML File with all resources (*.html *.htm)"),
+        ]
+        extensionsList = [
+            # tuple of extensions for *nix and Windows
+            # keep in sync with filters list
+            (".mhtml", ".mht"),
+            (".html", ".htm"),
+            (".html", ".htm"),
+        ]
+        if self.url().fileName():
+            defaultFileName = os.path.join(documentLocation,
+                                           self.url().fileName())
+        else:
+            defaultFileName = os.path.join(documentLocation,
+                                           self.page().title())
+            if Utilities.isWindowsPlatform():
+                defaultFileName += ".mht"
+            else:
+                defaultFileName += ".mhtml"
+
+        fileName = ""
+        saveFormat = QWebEngineDownloadItem.MimeHtmlSaveFormat
+        
+        fileName, selectedFilter = E5FileDialog.getSaveFileNameAndFilter(
+            None,
+            self.tr("Save Web Page"),
+            defaultFileName,
+            ";;".join(filterList),
+            None)
+        if fileName:
+            index = filterList.index(selectedFilter)
+            if index == 0:
+                saveFormat = QWebEngineDownloadItem.MimeHtmlSaveFormat
+            elif index == 1:
+                saveFormat = QWebEngineDownloadItem.SingleHtmlSaveFormat
+            else:
+                saveFormat = QWebEngineDownloadItem.CompleteHtmlSaveFormat
+            
+            extension = os.path.splitext(fileName)[1]
+            if not extension:
+                # add the platform specific default extension
+                if Utilities.isWindowsPlatform():
+                    extensionsIndex = 1
+                else:
+                    extensionsIndex = 0
+                extensions = extensionsList[index]
+                fileName += extensions[extensionsIndex]
+        
+        return fileName, saveFormat
     
     ###########################################################################
     ## Miscellaneous methods below

eric ide

mercurial