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 |
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()) |