43 , m_locationBar(nullptr)
44 , m_lastRefreshTimestamp(0)
45 , m_popupClosed(false)
61 m_locationBar = locationBar;
66 return s_view->isVisible();
76 QString trimmedStr =
string.trimmed();
80 m_popupClosed =
false;
88 if (
qzSettings->searchFromAddressBar &&
qzSettings->showABSearchSuggestions && trimmedStr.length() >= 2) {
89 if (!m_openSearchEngine) {
96 m_suggestionsTerm = trimmedStr;
99 m_oldSuggestions.clear();
103 QTimer::singleShot(0,
this, [=]() {
104 const QModelIndex index = s_model->index(0, 0);
106 s_model->setData(index, trimmedStr, Qt::DisplayRole);
107 s_model->setData(index, trimmedStr, LocationCompleterModel::UrlRole);
108 s_model->setData(index, m_locationBar->text(), LocationCompleterModel::SearchStringRole);
110 auto *item = new QStandardItem();
111 item->setText(trimmedStr);
112 item->setData(trimmedStr, LocationCompleterModel::UrlRole);
113 item->setData(m_locationBar->text(), LocationCompleterModel::SearchStringRole);
114 item->setData(true, LocationCompleterModel::VisitSearchItemRole);
115 s_model->setCompletions({item});
116 addSuggestions(m_oldSuggestions);
120 m_ignoreCurrentChanged =
true;
122 m_ignoreCurrentChanged =
false;
129 m_locationBar->setFocus();
133void LocationCompleter::refreshJobFinished()
135 auto* job = qobject_cast<LocationCompleterRefreshJob*>(sender());
140 if (!job->isCanceled() && job->timestamp() > m_lastRefreshTimestamp && !m_popupClosed) {
142 addSuggestions(m_oldSuggestions);
145 m_lastRefreshTimestamp = job->timestamp();
148 m_ignoreCurrentChanged =
true;
150 m_ignoreCurrentChanged =
false;
163void LocationCompleter::slotPopupClosed()
165 m_popupClosed =
true;
166 m_oldSuggestions.clear();
175 disconnect(s_view->
selectionModel(), &QItemSelectionModel::currentChanged,
this, &LocationCompleter::currentChanged);
180void LocationCompleter::addSuggestions(
const QStringList &suggestions)
185 for (QStandardItem *item : suggestionItems) {
186 s_model->takeRow(item->row());
191 QList<QStandardItem*> items;
192 for (
const QString &suggestion : suggestions) {
193 auto* item =
new QStandardItem();
194 item->setText(suggestion);
203 m_oldSuggestions = suggestions;
205 if (!m_popupClosed) {
210void LocationCompleter::currentChanged(
const QModelIndex &index)
212 if (m_ignoreCurrentChanged) {
216 QString completion = index.data().toString();
223 if (completeDomain && completion == originalText) {
224 completeDomain =
false;
227 if (completion.isEmpty()) {
228 completeDomain =
true;
229 completion = originalText;
235void LocationCompleter::indexActivated(
const QModelIndex &index)
237 Q_ASSERT(index.isValid());
248 if (ok && tabPos > -1) {
251 switchToTab(window, tabPos);
255 loadRequest(createLoadRequest(index));
258void LocationCompleter::indexCtrlActivated(
const QModelIndex &index)
260 Q_ASSERT(index.isValid());
272void LocationCompleter::indexShiftActivated(
const QModelIndex &index)
274 Q_ASSERT(index.isValid());
285 loadRequest(createLoadRequest(index));
289void LocationCompleter::indexDeleteRequested(
const QModelIndex &index)
291 if (!index.isValid()) {
297 mApp->bookmarks()->removeBookmark(bookmark);
300 mApp->history()->deleteHistoryEntry(
id);
305 s_view->setUpdatesEnabled(
false);
306 s_model->removeRow(index.row(), index.parent());
307 s_view->setUpdatesEnabled(
true);
312LoadRequest LocationCompleter::createLoadRequest(
const QModelIndex &index)
326 switch (action.type) {
329 request = action.loadRequest;
332 bookmark = action.bookmark;
341 request = bookmark->
url();
347void LocationCompleter::switchToTab(
BrowserWindow* window,
int tab)
354 if (window->isActiveWindow() || tabWidget->
currentIndex() != tab) {
357 window->activateWindow();
361 tabWidget->
webTab()->setFocus();
365void LocationCompleter::loadRequest(
const LoadRequest &request)
376void LocationCompleter::openSearchEnginesDialog()
385void LocationCompleter::showPopup()
388 Q_ASSERT(m_locationBar);
390 if (!m_locationBar->hasFocus() || s_model->rowCount() == 0) {
395 if (s_view->isVisible()) {
400 QRect popupRect(m_locationBar->mapToGlobal(m_locationBar->pos()), m_locationBar->size());
401 popupRect.setY(popupRect.bottom());
403 if (
qzSettings->completionPopupExpandToWindow) {
404 popupRect.setX(m_window->mapToGlobal(QPoint(0,0)).x());
405 popupRect.setWidth(m_window->size().width());
408 s_view->setGeometry(popupRect);
409 s_view->setFocusProxy(m_locationBar);
419 connect(s_view->
selectionModel(), &QItemSelectionModel::currentChanged,
this, &LocationCompleter::currentChanged);
421 s_view->createWinId();
422 s_view->windowHandle()->setTransientParent(m_window->windowHandle());
427void LocationCompleter::adjustPopupSize()
TabWidget * tabWidget() const
static SearchEngine searchEngine()
static LoadAction loadAction(const QString &text)
void setLocationBar(LocationBar *locationBar)
LocationCompleter(QObject *parent=nullptr)
void setMainWindow(BrowserWindow *window)
void showCompletion(const QString &completion, bool completeDomain)
void loadRequested(const LoadRequest &request)
void complete(const QString &string)
void showDomainCompletion(const QString &completion)
void setCompletions(const QList< QStandardItem * > &items)
void addCompletions(const QList< QStandardItem * > &items)
QList< QStandardItem * > suggestionItems() const
void setModel(QAbstractItemModel *model)
void indexCtrlActivated(const QModelIndex &index)
void indexShiftActivated(const QModelIndex &index)
void indexDeleteRequested(const QModelIndex &index)
QItemSelectionModel * selectionModel() const
void searchEnginesDialogRequested()
void indexActivated(const QModelIndex &index)
void setCurrentIndex(const QModelIndex &index)
void loadRequested(const LoadRequest &request)
QModelIndex currentIndex() const
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)