WebBrowser/WebBrowserView.py

branch
QtWebEngine
changeset 4726
c26e2a2dc0cb
parent 4725
b19ff70ba509
child 4727
62b50a24fb59
equal deleted inserted replaced
4725:b19ff70ba509 4726:c26e2a2dc0cb
16 16
17 from PyQt5.QtCore import pyqtSlot, pyqtSignal, QObject, QT_TRANSLATE_NOOP, \ 17 from PyQt5.QtCore import pyqtSlot, pyqtSignal, QObject, QT_TRANSLATE_NOOP, \
18 QUrl, QBuffer, QIODevice, QFileInfo, Qt, QTimer, QEvent, \ 18 QUrl, QBuffer, QIODevice, QFileInfo, Qt, QTimer, QEvent, \
19 QRect, QFile, QPoint, QByteArray, qVersion 19 QRect, QFile, QPoint, QByteArray, qVersion
20 from PyQt5.QtGui import QDesktopServices, QClipboard, QMouseEvent, QColor, \ 20 from PyQt5.QtGui import QDesktopServices, QClipboard, QMouseEvent, QColor, \
21 QPalette 21 QPalette, QIcon
22 from PyQt5.QtWidgets import qApp, QStyle, QMenu, QApplication, QInputDialog, \ 22 from PyQt5.QtWidgets import qApp, QStyle, QMenu, QApplication, QInputDialog, \
23 QLineEdit, QLabel, QToolTip, QFrame, QDialog 23 QLineEdit, QLabel, QToolTip, QFrame, QDialog
24 from PyQt5.QtPrintSupport import QPrinter, QPrintDialog 24 from PyQt5.QtPrintSupport import QPrinter, QPrintDialog
25 from PyQt5.QtNetwork import QNetworkReply, QNetworkRequest 25 from PyQt5.QtNetwork import QNetworkReply, QNetworkRequest
26 from PyQt5.QtWebEngineWidgets import QWebEngineView, QWebEnginePage 26 from PyQt5.QtWebEngineWidgets import QWebEngineView, QWebEnginePage
27 27
28 from E5Gui import E5MessageBox, E5FileDialog 28 from E5Gui import E5MessageBox, E5FileDialog
29 29
30 import WebBrowser 30 import WebBrowser
31 from .WebBrowserPage import WebBrowserPage 31 from .WebBrowserPage import WebBrowserPage
32
33 from .Tools.WebIconLoader import WebIconLoader
32 34
33 import Preferences 35 import Preferences
34 import UI.PixmapCache 36 import UI.PixmapCache
35 import Globals 37 import Globals
36 38
49 @signal forwardAvailable(bool) emitted after the current URL has changed 51 @signal forwardAvailable(bool) emitted after the current URL has changed
50 @signal backwardAvailable(bool) emitted after the current URL has changed 52 @signal backwardAvailable(bool) emitted after the current URL has changed
51 @signal highlighted(str) emitted, when the mouse hovers over a link 53 @signal highlighted(str) emitted, when the mouse hovers over a link
52 @signal search(QUrl) emitted, when a search is requested 54 @signal search(QUrl) emitted, when a search is requested
53 @signal zoomValueChanged(int) emitted to signal a change of the zoom value 55 @signal zoomValueChanged(int) emitted to signal a change of the zoom value
56 @signal iconChanged() emitted to signal a changed web site icon
54 """ 57 """
55 sourceChanged = pyqtSignal(QUrl) 58 sourceChanged = pyqtSignal(QUrl)
56 forwardAvailable = pyqtSignal(bool) 59 forwardAvailable = pyqtSignal(bool)
57 backwardAvailable = pyqtSignal(bool) 60 backwardAvailable = pyqtSignal(bool)
58 highlighted = pyqtSignal(str) 61 highlighted = pyqtSignal(str)
59 search = pyqtSignal(QUrl) 62 search = pyqtSignal(QUrl)
60 zoomValueChanged = pyqtSignal(int) 63 zoomValueChanged = pyqtSignal(int)
64 iconChanged = pyqtSignal()
61 65
62 ZoomLevels = [ 66 ZoomLevels = [
63 30, 40, 50, 67, 80, 90, 67 30, 40, 50, 67, 80, 90,
64 100, 68 100,
65 110, 120, 133, 150, 170, 200, 220, 233, 250, 270, 285, 300, 69 110, 120, 133, 150, 170, 200, 220, 233, 250, 270, 285, 300,
88 92
89 self.__mw = mainWindow 93 self.__mw = mainWindow
90 self.__ctrlPressed = False 94 self.__ctrlPressed = False
91 self.__isLoading = False 95 self.__isLoading = False
92 self.__progress = 0 96 self.__progress = 0
97 self.__siteIconLoader = None
98 self.__siteIcon = QIcon()
93 99
94 self.__currentZoom = 100 100 self.__currentZoom = 100
95 self.__zoomLevels = WebBrowserView.ZoomLevels[:] 101 self.__zoomLevels = WebBrowserView.ZoomLevels[:]
96 ## 102 ##
97 ## self.__javaScriptBinding = None 103 ## self.__javaScriptBinding = None
100 ## self.__mw.zoomTextOnlyChanged.connect(self.__applyZoom) 106 ## self.__mw.zoomTextOnlyChanged.connect(self.__applyZoom)
101 107
102 ## self.page().setLinkDelegationPolicy(QWebPage.DelegateAllLinks) 108 ## self.page().setLinkDelegationPolicy(QWebPage.DelegateAllLinks)
103 ## self.linkClicked.connect(self.setSource) 109 ## self.linkClicked.connect(self.setSource)
104 ## 110 ##
111 self.iconUrlChanged.connect(self.__iconUrlChanged)
105 self.urlChanged.connect(self.__urlChanged) 112 self.urlChanged.connect(self.__urlChanged)
106 ## self.statusBarMessage.connect(self.__statusBarMessage) 113 ## self.statusBarMessage.connect(self.__statusBarMessage)
107 self.page().linkHovered.connect(self.__linkHovered) 114 self.page().linkHovered.connect(self.__linkHovered)
108 115
109 self.loadStarted.connect(self.__loadStarted) 116 self.loadStarted.connect(self.__loadStarted)
123 ## self.__currentEngineChanged) 130 ## self.__currentEngineChanged)
124 131
125 self.setAcceptDrops(True) 132 self.setAcceptDrops(True)
126 133
127 # TODO: Access Keys 134 # TODO: Access Keys
128 ## self.__enableAccessKeys = Preferences.getHelp("AccessKeysEnabled") 135 ## self.__enableAccessKeys = Preferences.getWebBrowser("AccessKeysEnabled")
129 ## self.__accessKeysPressed = False 136 ## self.__accessKeysPressed = False
130 ## self.__accessKeyLabels = [] 137 ## self.__accessKeyLabels = []
131 ## self.__accessKeyNodes = {} 138 ## self.__accessKeyNodes = {}
132 ## 139 ##
133 ## self.page().loadStarted.connect(self.__hideAccessKeys) 140 ## self.page().loadStarted.connect(self.__hideAccessKeys)
220 ## """ 227 ## """
221 ## Private slot to track a change of the current search engine. 228 ## Private slot to track a change of the current search engine.
222 ## """ 229 ## """
223 ## if self.url().toString() == "eric:home": 230 ## if self.url().toString() == "eric:home":
224 ## self.reload() 231 ## self.reload()
232
233 def mainWindow(self):
234 """
235 Public method to get a reference to the main window.
236
237 @return reference to the main window
238 @rtype WebBrowserWindow
239 """
240 return self.__mw
225 241
226 # TODO: eliminate requestData, add param to get rid of __ctrlPressed 242 # TODO: eliminate requestData, add param to get rid of __ctrlPressed
227 def setSource(self, name, requestData=None): 243 def setSource(self, name, requestData=None):
228 """ 244 """
229 Public method used to set the source to be displayed. 245 Public method used to set the source to be displayed.
413 @param value zoom value (integer) 429 @param value zoom value (integer)
414 @keyparam saveValue flag indicating to save the zoom value with the 430 @keyparam saveValue flag indicating to save the zoom value with the
415 zoom manager 431 zoom manager
416 @type bool 432 @type bool
417 """ 433 """
418 if value != self.zoomValue(): 434 if value != self.__currentZoom:
419 self.setZoomFactor(value / 100.0) 435 self.setZoomFactor(value / 100.0)
420 self.__currentZoom = value 436 self.__currentZoom = value
421 # TODO: Zoom Manager 437 if saveValue and not self.__mw.isPrivate():
422 ## if saveValue: 438 from .ZoomManager import ZoomManager
423 ## Helpviewer.HelpWindow.HelpWindow.zoomManager().setZoomValue( 439 ZoomManager.instance().setZoomValue(self.url(), value)
424 ## self.url(), value)
425 self.zoomValueChanged.emit(value) 440 self.zoomValueChanged.emit(value)
426 441
427 def zoomValue(self): 442 def zoomValue(self):
428 """ 443 """
429 Public method to get the current zoom value. 444 Public method to get the current zoom value.
479 @param highlightAll flag indicating to highlight all occurrences 494 @param highlightAll flag indicating to highlight all occurrences
480 (boolean) 495 (boolean)
481 @param callback reference to a function with a bool parameter 496 @param callback reference to a function with a bool parameter
482 @type function(bool) or None 497 @type function(bool) or None
483 """ 498 """
484
485 findFlags = QWebEnginePage.FindFlags() 499 findFlags = QWebEnginePage.FindFlags()
486 if case: 500 if case:
487 findFlags |= QWebEnginePage.FindCaseSensitively 501 findFlags |= QWebEnginePage.FindCaseSensitively
488 if backwards: 502 if backwards:
489 findFlags |= QWebEnginePage.FindBackward 503 findFlags |= QWebEnginePage.FindBackward
545 ## self.tr("Copy Link to Clipboard"), self.__copyLink) 559 ## self.tr("Copy Link to Clipboard"), self.__copyLink)
546 ## menu.addAction( 560 ## menu.addAction(
547 ## UI.PixmapCache.getIcon("mailSend.png"), 561 ## UI.PixmapCache.getIcon("mailSend.png"),
548 ## self.tr("Send Link"), 562 ## self.tr("Send Link"),
549 ## self.__sendLink).setData(hit.linkUrl()) 563 ## self.__sendLink).setData(hit.linkUrl())
550 ## if Preferences.getHelp("VirusTotalEnabled") and \ 564 ## if Preferences.getWebBrowser("VirusTotalEnabled") and \
551 ## Preferences.getHelp("VirusTotalServiceKey") != "": 565 ## Preferences.getWebBrowser("VirusTotalServiceKey") != "":
552 ## menu.addAction( 566 ## menu.addAction(
553 ## UI.PixmapCache.getIcon("virustotal.png"), 567 ## UI.PixmapCache.getIcon("virustotal.png"),
554 ## self.tr("Scan Link with VirusTotal"), 568 ## self.tr("Scan Link with VirusTotal"),
555 ## self.__virusTotal).setData(hit.linkUrl()) 569 ## self.__virusTotal).setData(hit.linkUrl())
556 570
578 ## menu.addSeparator() 592 ## menu.addSeparator()
579 ## menu.addAction( 593 ## menu.addAction(
580 ## UI.PixmapCache.getIcon("adBlockPlus.png"), 594 ## UI.PixmapCache.getIcon("adBlockPlus.png"),
581 ## self.tr("Block Image"), self.__blockImage)\ 595 ## self.tr("Block Image"), self.__blockImage)\
582 ## .setData(hit.imageUrl().toString()) 596 ## .setData(hit.imageUrl().toString())
583 ## if Preferences.getHelp("VirusTotalEnabled") and \ 597 ## if Preferences.getWebBrowser("VirusTotalEnabled") and \
584 ## Preferences.getHelp("VirusTotalServiceKey") != "": 598 ## Preferences.getWebBrowser("VirusTotalServiceKey") != "":
585 ## menu.addAction( 599 ## menu.addAction(
586 ## UI.PixmapCache.getIcon("virustotal.png"), 600 ## UI.PixmapCache.getIcon("virustotal.png"),
587 ## self.tr("Scan Image with VirusTotal"), 601 ## self.tr("Scan Image with VirusTotal"),
588 ## self.__virusTotal).setData(hit.imageUrl()) 602 ## self.__virusTotal).setData(hit.imageUrl())
589 603
1303 self.__applyZoom() 1317 self.__applyZoom()
1304 evt.accept() 1318 evt.accept()
1305 1319
1306 def eventFilter(self, obj, evt): 1320 def eventFilter(self, obj, evt):
1307 """ 1321 """
1308 Protected method to process event for other objects. 1322 Public method to process event for other objects.
1309 1323
1310 @param obj reference to object to process events for 1324 @param obj reference to object to process events for
1311 @type QObject 1325 @type QObject
1312 @param evt reference to event to be processed 1326 @param evt reference to event to be processed
1313 @type QEvent 1327 @type QEvent
1375 self.sourceChanged.emit(url) 1389 self.sourceChanged.emit(url)
1376 1390
1377 self.forwardAvailable.emit(self.isForwardAvailable()) 1391 self.forwardAvailable.emit(self.isForwardAvailable())
1378 self.backwardAvailable.emit(self.isBackwardAvailable()) 1392 self.backwardAvailable.emit(self.isBackwardAvailable())
1379 1393
1394 def __iconUrlChanged(self, url):
1395 """
1396 Private slot to handle the iconUrlChanged signal.
1397
1398 @param url URL to get web site icon from
1399 @type QUrl
1400 """
1401 self.__siteIcon = QIcon()
1402 if self.__siteIconLoader is not None:
1403 self.__siteIconLoader.deleteLater()
1404 self.__siteIconLoader = WebIconLoader(url, self)
1405 self.__siteIconLoader.iconLoaded.connect(self.__iconLoaded)
1406
1407 def __iconLoaded(self, icon):
1408 """
1409 Private slot handling the loaded web site icon.
1410
1411 @param icon web site icon
1412 @type QIcon
1413 """
1414 self.__siteIcon = icon
1415
1416 from .Tools import WebIconProvider
1417 WebIconProvider.instance().saveIcon(self)
1418
1419 self.iconChanged.emit()
1420
1421 def icon(self):
1422 """
1423 Public method to get the web site icon.
1424
1425 @return web site icon
1426 @rtype QIcon
1427 """
1428 if not self.__siteIcon.isNull():
1429 return QIcon(self.__siteIcon)
1430
1431 from .Tools import WebIconProvider
1432 return WebIconProvider.instance().iconForUrl(self.url())
1433
1380 ## def __statusBarMessage(self, text): 1434 ## def __statusBarMessage(self, text):
1381 ## """ 1435 ## """
1382 ## Private slot to handle the statusBarMessage signal. 1436 ## Private slot to handle the statusBarMessage signal.
1383 ## 1437 ##
1384 ## @param text text to be shown in the status bar (string) 1438 ## @param text text to be shown in the status bar (string)
1420 """ 1474 """
1421 self.__isLoading = False 1475 self.__isLoading = False
1422 self.__progress = 0 1476 self.__progress = 0
1423 1477
1424 # TODO: ClickToFlash (?) 1478 # TODO: ClickToFlash (?)
1425 ## if Preferences.getHelp("ClickToFlashEnabled"): 1479 ## if Preferences.getWebBrowser("ClickToFlashEnabled"):
1426 ## # this is a hack to make the ClickToFlash button appear 1480 ## # this is a hack to make the ClickToFlash button appear
1427 ## self.zoomIn() 1481 ## self.zoomIn()
1428 ## self.zoomOut() 1482 ## self.zoomOut()
1429 1483
1430 # TODO: Zoom Manager 1484 from .ZoomManager import ZoomManager
1431 ## zoomValue = Helpviewer.HelpWindow.HelpWindow.zoomManager()\ 1485 zoomValue = ZoomManager.instance().zoomValue(self.url())
1432 ## .zoomValue(self.url()) 1486 self.setZoomValue(zoomValue)
1433 ## self.setZoomValue(zoomValue)
1434 1487
1435 if ok: 1488 if ok:
1436 pass 1489 pass
1437 # TODO: AdBlock 1490 # TODO: AdBlock
1438 ## self.__mw.adBlockManager().page().hideBlockedPageEntries(self.page()) 1491 ## self.__mw.adBlockManager().page().hideBlockedPageEntries(self.page())
1792 def preferencesChanged(self): 1845 def preferencesChanged(self):
1793 """ 1846 """
1794 Public method to indicate a change of the settings. 1847 Public method to indicate a change of the settings.
1795 """ 1848 """
1796 # TODO: Access Keys 1849 # TODO: Access Keys
1797 ## self.__enableAccessKeys = Preferences.getHelp("AccessKeysEnabled") 1850 ## self.__enableAccessKeys = Preferences.getWebBrowser("AccessKeysEnabled")
1798 ## if not self.__enableAccessKeys: 1851 ## if not self.__enableAccessKeys:
1799 ## self.__hideAccessKeys() 1852 ## self.__hideAccessKeys()
1800 1853
1801 self.reload() 1854 self.reload()
1802 1855

eric ide

mercurial