38 from PyQt5.QtNetwork import QSslCertificate |
38 from PyQt5.QtNetwork import QSslCertificate |
39 SSL_AVAILABLE = True |
39 SSL_AVAILABLE = True |
40 except ImportError: |
40 except ImportError: |
41 SSL_AVAILABLE = False |
41 SSL_AVAILABLE = False |
42 |
42 |
43 ############################################################################### |
|
44 ## |
|
45 ## |
|
46 ##class JavaScriptExternalObject(QObject): |
|
47 ## """ |
|
48 ## Class implementing an external javascript object to add search providers. |
|
49 ## """ |
|
50 ## def __init__(self, mw, parent=None): |
|
51 ## """ |
|
52 ## Constructor |
|
53 ## |
|
54 ## @param mw reference to the main window 8HelpWindow) |
|
55 ## @param parent reference to the parent object (QObject) |
|
56 ## """ |
|
57 ## super(JavaScriptExternalObject, self).__init__(parent) |
|
58 ## |
|
59 ## self.__mw = mw |
|
60 ## |
|
61 ## @pyqtSlot(str) |
|
62 ## def AddSearchProvider(self, url): |
|
63 ## """ |
|
64 ## Public slot to add a search provider. |
|
65 ## |
|
66 ## @param url url of the XML file defining the search provider (string) |
|
67 ## """ |
|
68 ## self.__mw.openSearchManager().addEngine(QUrl(url)) |
|
69 ## |
|
70 ## |
|
71 ##class LinkedResource(object): |
|
72 ## """ |
|
73 ## Class defining a data structure for linked resources. |
|
74 ## """ |
|
75 ## def __init__(self): |
|
76 ## """ |
|
77 ## Constructor |
|
78 ## """ |
|
79 ## self.rel = "" |
|
80 ## self.type_ = "" |
|
81 ## self.href = "" |
|
82 ## self.title = "" |
|
83 ## |
|
84 ############################################################################### |
|
85 ## |
|
86 ## |
|
87 ##class JavaScriptEricObject(QObject): |
|
88 ## """ |
|
89 ## Class implementing an external javascript object to search via the |
|
90 ## startpage. |
|
91 ## """ |
|
92 ## # these must be in line with the strings used by the javascript part of |
|
93 ## # the start page |
|
94 ## translations = [ |
|
95 ## QT_TRANSLATE_NOOP("JavaScriptEricObject", |
|
96 ## "Welcome to eric6 Web Browser!"), |
|
97 ## QT_TRANSLATE_NOOP("JavaScriptEricObject", "eric6 Web Browser"), |
|
98 ## QT_TRANSLATE_NOOP("JavaScriptEricObject", "Search!"), |
|
99 ## QT_TRANSLATE_NOOP("JavaScriptEricObject", "About eric6"), |
|
100 ## ] |
|
101 ## |
|
102 ## def __init__(self, mw, parent=None): |
|
103 ## """ |
|
104 ## Constructor |
|
105 ## |
|
106 ## @param mw reference to the main window 8HelpWindow) |
|
107 ## @param parent reference to the parent object (QObject) |
|
108 ## """ |
|
109 ## super(JavaScriptEricObject, self).__init__(parent) |
|
110 ## |
|
111 ## self.__mw = mw |
|
112 ## |
|
113 ## @pyqtSlot(str, result=str) |
|
114 ## def translate(self, trans): |
|
115 ## """ |
|
116 ## Public method to translate the given string. |
|
117 ## |
|
118 ## @param trans string to be translated (string) |
|
119 ## @return translation (string) |
|
120 ## """ |
|
121 ## if trans == "QT_LAYOUT_DIRECTION": |
|
122 ## # special handling to detect layout direction |
|
123 ## if qApp.isLeftToRight(): |
|
124 ## return "LTR" |
|
125 ## else: |
|
126 ## return "RTL" |
|
127 ## |
|
128 ## return self.tr(trans) |
|
129 ## |
|
130 ## @pyqtSlot(result=str) |
|
131 ## def providerString(self): |
|
132 ## """ |
|
133 ## Public method to get a string for the search provider. |
|
134 ## |
|
135 ## @return string for the search provider (string) |
|
136 ## """ |
|
137 ## return self.tr("Search results provided by {0}")\ |
|
138 ## .format(self.__mw.openSearchManager().currentEngineName()) |
|
139 ## |
|
140 ## @pyqtSlot(str, result=str) |
|
141 ## def searchUrl(self, searchStr): |
|
142 ## """ |
|
143 ## Public method to get the search URL for the given search term. |
|
144 ## |
|
145 ## @param searchStr search term (string) |
|
146 ## @return search URL (string) |
|
147 ## """ |
|
148 ## return bytes( |
|
149 ## self.__mw.openSearchManager().currentEngine() |
|
150 ## .searchUrl(searchStr).toEncoded()).decode() |
|
151 ## |
|
152 ############################################################################### |
|
153 |
|
154 |
43 |
155 class WebBrowserView(QWebEngineView): |
44 class WebBrowserView(QWebEngineView): |
156 """ |
45 """ |
157 Class implementing the web browser view widget. |
46 Class implementing the web browser view widget. |
158 |
47 |
1330 evt.accept() |
1220 evt.accept() |
1331 return |
1221 return |
1332 |
1222 |
1333 super(WebBrowserView, self).wheelEvent(evt) |
1223 super(WebBrowserView, self).wheelEvent(evt) |
1334 |
1224 |
1335 ## def keyPressEvent(self, evt): |
1225 def _keyPressEvent(self, evt): |
1336 ## """ |
1226 """ |
1337 ## Protected method called by a key press. |
1227 Protected method called by a key press. |
1338 ## |
1228 |
1339 ## @param evt reference to the key event (QKeyEvent) |
1229 @param evt reference to the key event (QKeyEvent) |
1340 ## """ |
1230 """ |
1341 ## # TODO: PIM |
1231 # TODO: PIM |
1342 #### if self.__mw.personalInformationManager().viewKeyPressEvent(self, evt): |
1232 ## if self.__mw.personalInformationManager().viewKeyPressEvent(self, evt): |
1343 #### return |
1233 ## return |
1344 ## |
1234 |
1345 ## # TODO: Access Keys |
1235 # TODO: Access Keys |
1346 #### if self.__enableAccessKeys: |
1236 ## if self.__enableAccessKeys: |
1347 #### self.__accessKeysPressed = ( |
1237 ## self.__accessKeysPressed = ( |
1348 #### evt.modifiers() == Qt.ControlModifier and |
1238 ## evt.modifiers() == Qt.ControlModifier and |
1349 #### evt.key() == Qt.Key_Control) |
1239 ## evt.key() == Qt.Key_Control) |
1350 #### if not self.__accessKeysPressed: |
1240 ## if not self.__accessKeysPressed: |
1351 #### if self.__checkForAccessKey(evt): |
1241 ## if self.__checkForAccessKey(evt): |
1352 #### self.__hideAccessKeys() |
1242 ## self.__hideAccessKeys() |
1353 #### evt.accept() |
1243 ## evt.accept() |
1354 #### return |
1244 ## return |
1355 #### self.__hideAccessKeys() |
1245 ## self.__hideAccessKeys() |
1356 #### else: |
1246 ## else: |
1357 #### QTimer.singleShot(300, self.__accessKeyShortcut) |
1247 ## QTimer.singleShot(300, self.__accessKeyShortcut) |
1358 ## |
1248 |
1359 ## self.__ctrlPressed = (evt.key() == Qt.Key_Control) |
1249 self.__ctrlPressed = (evt.key() == Qt.Key_Control) |
1360 ## super(WebBrowserView, self).keyPressEvent(evt) |
1250 super(WebBrowserView, self).keyPressEvent(evt) |
1361 ## |
1251 |
1362 ## def keyReleaseEvent(self, evt): |
1252 def _keyReleaseEvent(self, evt): |
1363 ## """ |
1253 """ |
1364 ## Protected method called by a key release. |
1254 Protected method called by a key release. |
1365 ## |
1255 |
1366 ## @param evt reference to the key event (QKeyEvent) |
1256 @param evt reference to the key event (QKeyEvent) |
1367 ## """ |
1257 """ |
1368 ## # TODO: Access Keys |
1258 # TODO: Access Keys |
1369 #### if self.__enableAccessKeys: |
1259 ## if self.__enableAccessKeys: |
1370 #### self.__accessKeysPressed = evt.key() == Qt.Key_Control |
1260 ## self.__accessKeysPressed = evt.key() == Qt.Key_Control |
1371 ## |
1261 |
1372 ## self.__ctrlPressed = False |
1262 self.__ctrlPressed = False |
1373 ## super(WebBrowserView, self).keyReleaseEvent(evt) |
1263 super(WebBrowserView, self).keyReleaseEvent(evt) |
1374 |
1264 |
1375 def focusOutEvent(self, evt): |
1265 def focusOutEvent(self, evt): |
1376 """ |
1266 """ |
1377 Protected method called by a focus out event. |
1267 Protected method called by a focus out event. |
1378 |
1268 |
1383 ## self.__hideAccessKeys() |
1273 ## self.__hideAccessKeys() |
1384 ## self.__accessKeysPressed = False |
1274 ## self.__accessKeysPressed = False |
1385 |
1275 |
1386 super(WebBrowserView, self).focusOutEvent(evt) |
1276 super(WebBrowserView, self).focusOutEvent(evt) |
1387 |
1277 |
1388 def event(self, evt): |
1278 # TODO: Obsoleted by eventFilter() (?) |
1389 """ |
1279 ## def event(self, evt): |
1390 Public method handling events. |
1280 ## """ |
1391 |
1281 ## Public method handling events. |
1392 @param evt reference to the event (QEvent) |
1282 ## |
1393 @return flag indicating, if the event was handled (boolean) |
1283 ## @param evt reference to the event (QEvent) |
1394 """ |
1284 ## @return flag indicating, if the event was handled (boolean) |
1395 if evt.type() == QEvent.Gesture: |
1285 ## """ |
1396 self.gestureEvent(evt) |
1286 ## if evt.type() == QEvent.Gesture: |
1397 return True |
1287 ## self.gestureEvent(evt) |
1398 |
1288 ## return True |
1399 return super(WebBrowserView, self).event(evt) |
1289 ## |
1400 |
1290 ## return super(WebBrowserView, self).event(evt) |
1401 def gestureEvent(self, evt): |
1291 |
|
1292 def _gestureEvent(self, evt): |
1402 """ |
1293 """ |
1403 Protected method handling gesture events. |
1294 Protected method handling gesture events. |
1404 |
1295 |
1405 @param evt reference to the gesture event (QGestureEvent |
1296 @param evt reference to the gesture event (QGestureEvent |
1406 """ |
1297 """ |
1411 else: |
1302 else: |
1412 scaleFactor = pinch.scaleFactor() |
1303 scaleFactor = pinch.scaleFactor() |
1413 self.__currentZoom = int(scaleFactor * 100) |
1304 self.__currentZoom = int(scaleFactor * 100) |
1414 self.__applyZoom() |
1305 self.__applyZoom() |
1415 evt.accept() |
1306 evt.accept() |
1416 ##bool WebView::eventFilter(QObject *obj, QEvent *event) |
1307 |
1417 ##{ |
1308 def eventFilter(self, obj, evt): |
1418 ## // Hack to find widget that receives input events |
1309 """ |
1419 ## if (obj == this && event->type() == QEvent::ChildAdded) { |
1310 Protected method to process event for other objects. |
1420 ## QWidget *child = qobject_cast<QWidget*>(static_cast<QChildEvent*>(event)->child()); |
1311 |
1421 ## if (child && child->inherits("QtWebEngineCore::RenderWidgetHostViewQtDelegateWidget")) { |
1312 @param obj reference to object to process events for |
1422 ## m_rwhvqt = child; |
1313 @type QObject |
1423 ## m_rwhvqt->installEventFilter(this); |
1314 @param evt reference to event to be processed |
1424 ## } |
1315 @type QEvent |
1425 ## } |
1316 @return flag indicating that the event should be filtered out |
1426 ## |
1317 @rtype bool |
1427 ## // Forward events to WebView |
1318 """ |
1428 ## if (obj == m_rwhvqt) { |
1319 # find the render widget receiving events for the web page |
1429 ###define HANDLE_EVENT(f, t) \ |
1320 if obj is self and evt.type() == QEvent.ChildAdded: |
1430 ## { \ |
1321 child = evt.child() |
1431 ## bool wasAccepted = event->isAccepted(); \ |
1322 if child and child.inherits( |
1432 ## event->setAccepted(false); \ |
1323 "QtWebEngineCore::RenderWidgetHostViewQtDelegateWidget"): |
1433 ## f(static_cast<t*>(event)); \ |
1324 self.__rwhvqt = child |
1434 ## bool ret = event->isAccepted(); \ |
1325 self.__rwhvqt.installEventFilter(self) |
1435 ## event->setAccepted(wasAccepted); \ |
1326 |
1436 ## return ret; \ |
1327 # forward events to WebBrowserView |
1437 ## } |
1328 if obj is self.__rwhvqt: |
1438 ## |
1329 wasAccepted = evt.isAccepted() |
1439 ## switch (event->type()) { |
1330 evt.setAccepted(False) |
1440 ## case QEvent::KeyPress: |
1331 if evt.type() == QEvent.KeyPress: |
1441 ## HANDLE_EVENT(_keyPressEvent, QKeyEvent); |
1332 self._keyPressEvent(evt) |
1442 ## |
1333 elif evt.type() == QEvent.KeyRelease: |
1443 ## case QEvent::KeyRelease: |
1334 self._keyReleaseEvent(evt) |
1444 ## HANDLE_EVENT(_keyReleaseEvent, QKeyEvent); |
1335 elif evt.type() == QEvent.MouseButtonPress: |
1445 ## |
1336 self._mousePressEvent(evt) |
1446 ## case QEvent::MouseButtonPress: |
1337 elif evt.type() == QEvent.MouseButtonRelease: |
1447 ## HANDLE_EVENT(_mousePressEvent, QMouseEvent); |
1338 self._mouseReleaseEvent(evt) |
1448 ## |
1339 ## elif evt.type() == QEvent.MouseMove: |
1449 ## case QEvent::MouseButtonRelease: |
1340 ## self.__mouseMoveEvent(evt) |
1450 ## HANDLE_EVENT(_mouseReleaseEvent, QMouseEvent); |
1341 elif evt.type() == QEvent.Wheel: |
1451 ## |
1342 self._wheelEvent(evt) |
1452 ## case QEvent::MouseMove: |
1343 elif evt.type() == QEvent.Gesture: |
1453 ## HANDLE_EVENT(_mouseMoveEvent, QMouseEvent); |
1344 self._gestureEvent(evt) |
1454 ## |
1345 ret = evt.isAccepted() |
1455 ## case QEvent::Wheel: |
1346 evt.setAccepted(wasAccepted) |
1456 ## HANDLE_EVENT(_wheelEvent, QWheelEvent); |
1347 return ret |
1457 ## |
1348 |
1458 ## default: |
1349 # block already handled events |
1459 ## break; |
1350 if obj is self: |
1460 ## } |
1351 if evt.type() in [QEvent.KeyPress, QEvent.KeyRelease, |
1461 ## |
1352 QEvent.MouseButtonPress, |
1462 ###undef HANDLE_EVENT |
1353 QEvent.MouseButtonRelease, |
1463 ## } |
1354 ## QEvent.MouseMove, |
1464 ## |
1355 QEvent.Wheel, QEvent.Gesture]: |
1465 ## // Block already handled events |
1356 return True |
1466 ## if (obj == this) { |
1357 |
1467 ## switch (event->type()) { |
1358 return super(WebBrowserView, self).eventFilter(obj, evt) |
1468 ## case QEvent::KeyPress: |
|
1469 ## case QEvent::KeyRelease: |
|
1470 ## case QEvent::MouseButtonPress: |
|
1471 ## case QEvent::MouseButtonRelease: |
|
1472 ## case QEvent::MouseMove: |
|
1473 ## case QEvent::Wheel: |
|
1474 ## return true; |
|
1475 ## |
|
1476 ## default: |
|
1477 ## break; |
|
1478 ## } |
|
1479 ## } |
|
1480 ## |
|
1481 ## return QWebEngineView::eventFilter(obj, event); |
|
1482 ##} |
|
1483 |
1359 |
1484 def clearHistory(self): |
1360 def clearHistory(self): |
1485 """ |
1361 """ |
1486 Public slot to clear the history. |
1362 Public slot to clear the history. |
1487 """ |
1363 """ |