Helpviewer/HelpWebSearchWidget.py

branch
5_2_x
changeset 2201
2cb2e3bb4f3f
parent 1509
c0b5e693b0eb
child 2302
f29e9405c851
equal deleted inserted replaced
2200:719cf8ba4743 2201:2cb2e3bb4f3f
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
128 84
129 def __searchNow(self): 85 def __searchNow(self):
130 """ 86 """
131 Private slot to perform the web search. 87 Private slot to perform the web search.
132 """ 88 """
133 searchText = self.__searchEdit.text() 89 searchText = self.text()
134 if not searchText: 90 if not searchText:
135 return 91 return
136 92
137 globalSettings = QWebSettings.globalSettings() 93 globalSettings = QWebSettings.globalSettings()
138 if not globalSettings.testAttribute(QWebSettings.PrivateBrowsingEnabled): 94 if not globalSettings.testAttribute(QWebSettings.PrivateBrowsingEnabled):
217 173
218 if self.__recentSearchesItem and \ 174 if self.__recentSearchesItem and \
219 self.__recentSearchesItem.index().row() == index.row(): 175 self.__recentSearchesItem.index().row() == index.row():
220 return False 176 return False
221 177
222 self.__searchEdit.setText(index.data()) 178 self.setText(index.data())
223 return True 179 return True
224 180
225 def __textEdited(self, txt): 181 def __textEdited(self, txt):
226 """ 182 """
227 Private slot to handle changes of the search text. 183 Private slot to handle changes of the search text.
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 """
281 229
282 if self.__openSearchManager.currentEngineName() == engineName: 230 if self.__openSearchManager.currentEngineName() == engineName:
283 action.setCheckable(True) 231 action.setCheckable(True)
284 action.setChecked(True) 232 action.setChecked(True)
285 233
286 ct = self.mw.currentBrowser() 234 ct = self.__mw.currentBrowser()
287 linkedResources = ct.linkedResources("search") 235 linkedResources = ct.linkedResources("search")
288 236
289 if len(linkedResources) > 0: 237 if len(linkedResources) > 0:
290 self.__enginesMenu.addSeparator() 238 self.__enginesMenu.addSeparator()
291 239
312 self.__addEngineFromUrl) 260 self.__addEngineFromUrl)
313 action.setData(url) 261 action.setData(url)
314 action.setIcon(ct.icon()) 262 action.setIcon(ct.icon())
315 263
316 self.__enginesMenu.addSeparator() 264 self.__enginesMenu.addSeparator()
317 self.__enginesMenu.addAction(self.mw.searchEnginesAction()) 265 self.__enginesMenu.addAction(self.__mw.searchEnginesAction())
318 266
319 if self.__recentSearches: 267 if self.__recentSearches:
320 self.__enginesMenu.addAction(self.trUtf8("Clear Recent Searches"), 268 self.__enginesMenu.addAction(self.trUtf8("Clear Recent Searches"),
321 self.clear) 269 self.clear)
322 270
352 """ 300 """
353 Public method to clear all private data. 301 Public method to clear all private data.
354 """ 302 """
355 self.__recentSearches = [] 303 self.__recentSearches = []
356 self.__setupCompleterMenu() 304 self.__setupCompleterMenu()
357 self.__searchEdit.clear() 305 super().clear()
358 self.clearFocus() 306 self.clearFocus()
359 307
360 def preferencesChanged(self): 308 def preferencesChanged(self):
361 """ 309 """
362 Public method to handle the change of preferences. 310 Public method to handle the change of preferences.
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)

eric ide

mercurial