6 """ |
6 """ |
7 Module implementing a web search widget for the web browser. |
7 Module implementing a web search widget for the web browser. |
8 """ |
8 """ |
9 |
9 |
10 from PyQt4.QtCore import pyqtSignal, QUrl, QModelIndex, QTimer, Qt |
10 from PyQt4.QtCore import pyqtSignal, QUrl, QModelIndex, QTimer, Qt |
11 from PyQt4.QtGui import QWidget, QMenu, QHBoxLayout, QStandardItem, QStandardItemModel, \ |
11 from PyQt4.QtGui import QMenu, QStandardItem, QStandardItemModel, \ |
12 QCompleter, QFont, QIcon, QPixmap |
12 QCompleter, QFont, QIcon, QPixmap |
13 from PyQt4.QtWebKit import QWebSettings, QWebPage |
13 from PyQt4.QtWebKit import QWebSettings, QWebPage |
14 |
14 |
15 import UI.PixmapCache |
15 import UI.PixmapCache |
16 |
16 |
17 import Preferences |
17 import Preferences |
18 |
18 |
19 from E5Gui.E5LineEdit import E5LineEdit |
19 from E5Gui.E5LineEdit import E5LineEdit, E5ClearableLineEdit |
20 from E5Gui.E5LineEditButton import E5LineEditButton |
20 from E5Gui.E5LineEditButton import E5LineEditButton |
21 |
21 |
22 from .OpenSearch.OpenSearchManager import OpenSearchManager |
22 from .OpenSearch.OpenSearchManager import OpenSearchManager |
23 from .OpenSearch.OpenSearchEngineAction import OpenSearchEngineAction |
23 from .OpenSearch.OpenSearchEngineAction import OpenSearchEngineAction |
24 |
24 |
25 |
25 |
26 class HelpWebSearchEdit(E5LineEdit): |
26 class HelpWebSearchWidget(E5ClearableLineEdit): |
27 """ |
|
28 Class implementing the web search line edit. |
|
29 """ |
|
30 def __init__(self, mainWindow, parent=None): |
|
31 """ |
|
32 Constructor |
|
33 |
|
34 @param mainWindow reference to the main window (HelpWindow) |
|
35 @param parent reference to the parent widget (QWidget) |
|
36 """ |
|
37 super().__init__(parent) |
|
38 |
|
39 self.__mw = mainWindow |
|
40 |
|
41 def mousePressEvent(self, evt): |
|
42 """ |
|
43 Protected method called by a mouse press event. |
|
44 |
|
45 @param evt reference to the mouse event (QMouseEvent) |
|
46 """ |
|
47 if evt.button() == Qt.XButton1: |
|
48 self.__mw.currentBrowser().pageAction(QWebPage.Back).trigger() |
|
49 elif evt.button() == Qt.XButton2: |
|
50 self.__mw.currentBrowser().pageAction(QWebPage.Forward).trigger() |
|
51 else: |
|
52 super().mousePressEvent(evt) |
|
53 |
|
54 |
|
55 class HelpWebSearchWidget(QWidget): |
|
56 """ |
27 """ |
57 Class implementing a web search widget for the web browser. |
28 Class implementing a web search widget for the web browser. |
58 |
29 |
59 @signal search(QUrl) emitted when the search should be done |
30 @signal search(QUrl) emitted when the search should be done |
60 """ |
31 """ |
66 |
37 |
67 @param parent reference to the parent widget (QWidget) |
38 @param parent reference to the parent widget (QWidget) |
68 """ |
39 """ |
69 super().__init__(parent) |
40 super().__init__(parent) |
70 |
41 |
71 self.mw = parent |
42 self.__mw = parent |
72 |
43 |
73 self.__openSearchManager = OpenSearchManager(self) |
44 self.__openSearchManager = OpenSearchManager(self) |
74 self.__openSearchManager.currentEngineChanged.connect(self.__currentEngineChanged) |
45 self.__openSearchManager.currentEngineChanged.connect(self.__currentEngineChanged) |
75 self.__currentEngine = "" |
46 self.__currentEngine = "" |
76 |
47 |
77 self.__layout = QHBoxLayout(self) |
|
78 self.__layout.setMargin(0) |
|
79 self.__layout.setSpacing(0) |
|
80 self.setLayout(self.__layout) |
|
81 |
|
82 self.__enginesMenu = QMenu(self) |
48 self.__enginesMenu = QMenu(self) |
83 |
|
84 self.__searchEdit = HelpWebSearchEdit(self.mw, parent=self) |
|
85 self.__layout.addWidget(self.__searchEdit) |
|
86 |
49 |
87 self.__engineButton = E5LineEditButton(self) |
50 self.__engineButton = E5LineEditButton(self) |
88 self.__engineButton.setMenu(self.__enginesMenu) |
51 self.__engineButton.setMenu(self.__enginesMenu) |
89 self.__searchEdit.addWidget(self.__engineButton, E5LineEdit.LeftSide) |
52 self.addWidget(self.__engineButton, E5LineEdit.LeftSide) |
90 |
53 |
91 self.__searchButton = E5LineEditButton(self) |
54 self.__searchButton = E5LineEditButton(self) |
92 self.__searchButton.setIcon(UI.PixmapCache.getIcon("webSearch.png")) |
55 self.__searchButton.setIcon(UI.PixmapCache.getIcon("webSearch.png")) |
93 self.__searchEdit.addWidget(self.__searchButton, E5LineEdit.LeftSide) |
56 self.addWidget(self.__searchButton, E5LineEdit.LeftSide) |
94 |
|
95 self.__clearButton = E5LineEditButton(self) |
|
96 self.__clearButton.setIcon(UI.PixmapCache.getIcon("clearLeft.png")) |
|
97 self.__searchEdit.addWidget(self.__clearButton, E5LineEdit.RightSide) |
|
98 self.__clearButton.setVisible(False) |
|
99 |
57 |
100 self.__model = QStandardItemModel(self) |
58 self.__model = QStandardItemModel(self) |
101 self.__completer = QCompleter() |
59 self.__completer = QCompleter() |
102 self.__completer.setModel(self.__model) |
60 self.__completer.setModel(self.__model) |
103 self.__completer.setCompletionMode(QCompleter.UnfilteredPopupCompletion) |
61 self.__completer.setCompletionMode(QCompleter.UnfilteredPopupCompletion) |
104 self.__completer.setWidget(self.__searchEdit) |
62 self.__completer.setWidget(self) |
105 |
63 |
106 self.__searchButton.clicked[()].connect(self.__searchButtonClicked) |
64 self.__searchButton.clicked[()].connect(self.__searchButtonClicked) |
107 self.__clearButton.clicked[()].connect(self.__searchEdit.clear) |
65 self.textEdited.connect(self.__textEdited) |
108 self.__searchEdit.textEdited.connect(self.__textEdited) |
66 self.returnPressed[()].connect(self.__searchNow) |
109 self.__searchEdit.textChanged.connect(self.__textChanged) |
|
110 self.__searchEdit.returnPressed[()].connect(self.__searchNow) |
|
111 self.__completer.activated[QModelIndex].connect(self.__completerActivated) |
67 self.__completer.activated[QModelIndex].connect(self.__completerActivated) |
112 self.__completer.highlighted[QModelIndex].connect(self.__completerHighlighted) |
68 self.__completer.highlighted[QModelIndex].connect(self.__completerHighlighted) |
113 self.__enginesMenu.aboutToShow.connect(self.__showEnginesMenu) |
69 self.__enginesMenu.aboutToShow.connect(self.__showEnginesMenu) |
114 |
70 |
115 self.__suggestionsItem = None |
71 self.__suggestionsItem = None |
237 self.__suggestTimer.start() |
193 self.__suggestTimer.start() |
238 else: |
194 else: |
239 self.__completer.setCompletionPrefix(txt) |
195 self.__completer.setCompletionPrefix(txt) |
240 self.__completer.complete() |
196 self.__completer.complete() |
241 |
197 |
242 def __textChanged(self, txt): |
|
243 """ |
|
244 Private slot to handle changes of the search text. |
|
245 |
|
246 @param txt search text (string) |
|
247 """ |
|
248 self.__clearButton.setVisible(txt != "") |
|
249 |
|
250 def __getSuggestions(self): |
198 def __getSuggestions(self): |
251 """ |
199 """ |
252 Private slot to get search suggestions from the configured search engine. |
200 Private slot to get search suggestions from the configured search engine. |
253 """ |
201 """ |
254 searchText = self.__searchEdit.text() |
202 searchText = self.text() |
255 if searchText: |
203 if searchText: |
256 self.__openSearchManager.currentEngine().requestSuggestions(searchText) |
204 self.__openSearchManager.currentEngine().requestSuggestions(searchText) |
257 |
205 |
258 def __newSuggestions(self, suggestions): |
206 def __newSuggestions(self, suggestions): |
259 """ |
207 """ |
399 if self.__suggestionsEnabled: |
347 if self.__suggestionsEnabled: |
400 oldEngine.suggestions.disconnect(self.__newSuggestions) |
348 oldEngine.suggestions.disconnect(self.__newSuggestions) |
401 |
349 |
402 newEngine = self.__openSearchManager.currentEngine() |
350 newEngine = self.__openSearchManager.currentEngine() |
403 if newEngine.networkAccessManager() is None: |
351 if newEngine.networkAccessManager() is None: |
404 newEngine.setNetworkAccessManager(self.mw.networkAccessManager()) |
352 newEngine.setNetworkAccessManager(self.__mw.networkAccessManager()) |
405 newEngine.imageChanged.connect(self.__engineImageChanged) |
353 newEngine.imageChanged.connect(self.__engineImageChanged) |
406 if self.__suggestionsEnabled: |
354 if self.__suggestionsEnabled: |
407 newEngine.suggestions.connect(self.__newSuggestions) |
355 newEngine.suggestions.connect(self.__newSuggestions) |
408 |
356 |
409 self.__searchEdit.setInactiveText(self.__openSearchManager.currentEngineName()) |
357 self.setInactiveText(self.__openSearchManager.currentEngineName()) |
410 self.__currentEngine = self.__openSearchManager.currentEngineName() |
358 self.__currentEngine = self.__openSearchManager.currentEngineName() |
411 self.__engineButton.setIcon( |
359 self.__engineButton.setIcon( |
412 QIcon(QPixmap.fromImage(self.__openSearchManager.currentEngine().image()))) |
360 QIcon(QPixmap.fromImage(self.__openSearchManager.currentEngine().image()))) |
413 self.__suggestions = [] |
361 self.__suggestions = [] |
414 self.__setupCompleterMenu() |
362 self.__setupCompleterMenu() |
425 Protected method called by a mouse press event. |
373 Protected method called by a mouse press event. |
426 |
374 |
427 @param evt reference to the mouse event (QMouseEvent) |
375 @param evt reference to the mouse event (QMouseEvent) |
428 """ |
376 """ |
429 if evt.button() == Qt.XButton1: |
377 if evt.button() == Qt.XButton1: |
430 self.mw.currentBrowser().pageAction(QWebPage.Back).trigger() |
378 self.__mw.currentBrowser().pageAction(QWebPage.Back).trigger() |
431 elif evt.button() == Qt.XButton2: |
379 elif evt.button() == Qt.XButton2: |
432 self.mw.currentBrowser().pageAction(QWebPage.Forward).trigger() |
380 self.__mw.currentBrowser().pageAction(QWebPage.Forward).trigger() |
433 else: |
381 else: |
434 super().mousePressEvent(evt) |
382 super().mousePressEvent(evt) |