32#include <QAbstractItemView>
34#include <QStringListModel>
38#include <QContextMenuEvent>
43 setObjectName(
"websearchbar-searchbutton");
44 setCursor(QCursor(Qt::PointingHandCursor));
45 setFocusPolicy(Qt::ClickFocus);
48void WebSearchBar_Button::contextMenuEvent(QContextMenuEvent* event)
56 , m_reloadingEngines(false)
58 setObjectName(
"websearchbar");
64 m_boxSearchType->setObjectName(
"websearchbar-searchprovider-combobox");
65 m_boxSearchType->setFocusProxy(
this);
81 m_searchManager =
mApp->searchEnginesManager();
82 connect(m_boxSearchType->
menu(), &QMenu::aboutToShow,
this, &WebSearchBar::aboutToShowMenu);
84 m_completer =
new QCompleter(
this);
85 m_completer->setCompletionMode(QCompleter::UnfilteredPopupCompletion);
86 m_completerModel =
new QStringListModel(
this);
87 m_completer->setModel(m_completerModel);
88 m_completer->popup()->setMinimumHeight(90);
89 setCompleter(m_completer);
90 connect(m_completer->popup(), &QAbstractItemView::activated,
this, &WebSearchBar::search);
101 QTimer::singleShot(0,
this, &WebSearchBar::setupEngines);
104void WebSearchBar::aboutToShowMenu()
106 QMenu* menu = m_boxSearchType->
menu();
108 menu->addSeparator();
111 const QVariantList &list = res.toList();
112 for (
const QVariant &val : list) {
113 const QVariantMap &link = val.toMap();
114 QUrl url = m_window->
weView()->url().resolved(link.value(
QSL(
"url")).toUrl());
115 QString title = link.value(
QSL(
"title")).toString();
123 menu->addAction(m_window->
weView()->
icon(), tr(
"Add %1 ...").arg(title),
this, &WebSearchBar::addEngineFromAction)->setData(url);
126 menu->addSeparator();
131void WebSearchBar::addSuggestions(
const QStringList &list)
134 QStringList list_ = list.mid(0, 6);
135 m_completerModel->setStringList(list_);
136 m_completer->complete();
140void WebSearchBar::openSearchEnginesDialog()
145 m_searchDialog->open();
146 m_searchDialog->raise();
147 m_searchDialog->activateWindow();
150void WebSearchBar::enableSearchSuggestions(
bool enable)
157 qzSettings->showWSBSearchSuggestions = enable;
158 m_completerModel->setStringList(QStringList());
159 updateOpenSearchEngine();
162void WebSearchBar::setupEngines()
165 m_reloadingEngines =
true;
169 if (m_boxSearchType->
allItems().count() != 0) {
170 activeEngine = m_activeEngine.
name;
175 const auto engines = m_searchManager->
allEngines();
184 m_boxSearchType->
addItem(item);
186 if (item.
text == activeEngine) {
194 m_reloadingEngines =
false;
199 setPlaceholderText(item.
text);
200 m_completerModel->setStringList(QStringList());
204 updateOpenSearchEngine();
208 if (
qzSettings->searchOnEngineChange && !m_reloadingEngines && !text().isEmpty()) {
213void WebSearchBar::instantSearchChanged(
bool enable)
217 settings.
setValue(
QSL(
"SearchOnEngineChange"), enable);
222void WebSearchBar::search()
224 m_window->
weView()->setFocus();
228void WebSearchBar::searchInNewTab()
231 m_window->
weView(index)->setFocus();
235void WebSearchBar::addEngineFromAction()
237 if (
auto* action = qobject_cast<QAction*>(sender())) {
238 m_searchManager->
addEngine(action->data().toUrl());
242void WebSearchBar::pasteAndGo()
249void WebSearchBar::contextMenuEvent(QContextMenuEvent* event)
254 menu->setAttribute(Qt::WA_DeleteOnClose);
256 menu->addSeparator();
257 QAction* act = menu->addAction(tr(
"Show suggestions"));
258 act->setCheckable(
true);
259 act->setChecked(
qzSettings->showWSBSearchSuggestions);
260 connect(act, &QAction::triggered,
this, &WebSearchBar::enableSearchSuggestions);
262 QAction* instantSearch = menu->addAction(tr(
"Search when engine changed"));
263 instantSearch->setCheckable(
true);
264 instantSearch->setChecked(
qzSettings->searchOnEngineChange);
265 connect(instantSearch, &QAction::triggered,
this, &WebSearchBar::instantSearchChanged);
268 QPoint pos =
event->globalPos();
269 pos.setY(pos.y() + 1);
273void WebSearchBar::focusOutEvent(QFocusEvent* e)
275 if (text().isEmpty()) {
277 setPlaceholderText(search);
280 LineEdit::focusOutEvent(e);
283void WebSearchBar::dropEvent(QDropEvent* event)
285 if (
event->mimeData()->hasText()) {
286 QString dropText =
event->mimeData()->text();
290 QFocusEvent
event(QFocusEvent::FocusOut);
291 LineEdit::focusOutEvent(&
event);
295 LineEdit::dropEvent(
event);
298void WebSearchBar::keyPressEvent(QKeyEvent* event)
300 switch (
event->key()) {
302 if (
event->modifiers() == (Qt::ControlModifier | Qt::ShiftModifier)) {
311 if (
event->modifiers() == Qt::AltModifier) {
320 if (
event->modifiers() == Qt::ControlModifier) {
326 if (
event->modifiers() == Qt::ControlModifier) {
335 LineEdit::keyPressEvent(
event);
338void WebSearchBar::updateOpenSearchEngine()
TabWidget * tabWidget() const
TabbedWebView * weView() const
void middleClicked(QPoint)
static QIcon settingsIcon()
QAction * editAction(EditAction action) const
void addWidget(QWidget *widget, WidgetPosition position)
QMenu * createContextMenu()
void setWidgetSpacing(int spacing)
bool event(QEvent *event) override
A class representing a single search engine described in OpenSearch format.
void requestSuggestions(const QString &searchTerm)
void setNetworkAccessManager(QNetworkAccessManager *networkAccessManager)
void setSuggestionsParameters(const Parameters &suggestionsParameters)
void suggestions(const QStringList &suggestions)
void setSuggestionsUrl(const QString &string)
static QString getOpenSearchLinks()
QVector< Engine > allEngines()
void addEngine(const QUrl &url)
QString startingEngineName()
void setActiveEngine(const Engine &engine)
LoadRequest searchResult(const Engine &engine, const QString &string)
void beginGroup(const QString &prefix)
void setValue(const QString &key, const QVariant &defaultValue=QVariant())
WebSearchBar(BrowserWindow *window)
QIcon icon(bool allowNull=false) const
void load(const QUrl &url)
QString title(bool allowEmpty=false) const
QByteArray suggestionsParameters