32#include <QtConcurrent/QtConcurrentRun>
36 , m_timestamp(QDateTime::currentMSecsSinceEpoch())
37 , m_searchString(searchString)
38 , m_jobCancelled(false)
40 m_watcher =
new QFutureWatcher<void>(
this);
41 connect(m_watcher, &QFutureWatcherBase::finished,
this, &LocationCompleterRefreshJob::slotFinished);
43 QFuture<void> future = QtConcurrent::run(&LocationCompleterRefreshJob::runJob,
this);
44 m_watcher->setFuture(future);
54 return m_searchString;
59 return m_jobCancelled;
69 return m_domainCompletion;
72void LocationCompleterRefreshJob::jobCancelled()
74 m_jobCancelled =
true;
77void LocationCompleterRefreshJob::slotFinished()
82static bool countBiggerThan(
const QStandardItem* i1,
const QStandardItem* i2)
86 return i1Count > i2Count;
89void LocationCompleterRefreshJob::runJob()
91 if (m_jobCancelled ||
mApp->isClosing() || !
mApp) {
95 if (m_searchString.isEmpty()) {
96 completeMostVisited();
99 completeFromHistory();
103 for (QStandardItem* item : std::as_const(m_items)) {
104 if (m_jobCancelled) {
112 if (m_jobCancelled) {
117 if (!m_searchString.isEmpty() &&
qzSettings->useInlineCompletion) {
119 if (!domainQuery.lastQuery().isEmpty()) {
121 if (domainQuery.next()) {
122 m_domainCompletion = createDomainCompletion(domainQuery.value(0).toUrl().host());
127 if (m_jobCancelled) {
132 if (!m_searchString.isEmpty()) {
133 auto* item =
new QStandardItem();
134 item->setText(m_searchString);
138 if (!m_domainCompletion.isEmpty()) {
139 const QUrl url = QUrl(
QSL(
"http://%1").arg(m_domainCompletion));
142 m_items.prepend(item);
146void LocationCompleterRefreshJob::completeFromHistory()
149 Type showType = (Type)
qzSettings->showLocationSuggestions;
152 if (showType == HistoryAndBookmarks || showType ==
Bookmarks) {
153 const int bookmarksLimit = 10;
154 const QList<BookmarkItem*> bookmarks =
mApp->bookmarks()->searchBookmarks(m_searchString, bookmarksLimit);
157 Q_ASSERT(bookmark->isUrl());
160 if (bookmark->keyword() == m_searchString) {
164 auto* item =
new QStandardItem();
165 item->setText(QString::fromUtf8(bookmark->url().toEncoded()));
174 urlList.append(bookmark->url());
175 m_items.append(item);
180 std::sort(m_items.begin(), m_items.end(), countBiggerThan);
183 if (showType == HistoryAndBookmarks || showType ==
History) {
184 const int historyLimit = 20;
188 while (query.next()) {
189 const QUrl url = query.value(1).toUrl();
191 if (urlList.contains(url)) {
195 auto* item =
new QStandardItem();
196 item->setText(QString::fromUtf8(url.toEncoded()));
204 m_items.append(item);
209void LocationCompleterRefreshJob::completeMostVisited()
212 query.exec(
QSL(
"SELECT id, url, title FROM history ORDER BY count DESC LIMIT 15"));
214 while (query.next()) {
215 auto* item =
new QStandardItem();
216 const QUrl url = query.value(1).toUrl();
218 item->setText(QString::fromUtf8(url.toEncoded()));
224 m_items.append(item);
228QString LocationCompleterRefreshJob::createDomainCompletion(
const QString &completion)
const
232 if (m_searchString.startsWith(
QL1S(
"www.")) && !completion.startsWith(
QL1S(
"www."))) {
233 return QL1S(
"www.") + completion;
236 if (!m_searchString.startsWith(
QL1S(
"www.")) && completion.startsWith(
QL1S(
"www."))) {
237 return completion.mid(4);
static QImage imageForUrl(const QUrl &url, bool allowNull=false)
static QImage imageForDomain(const QUrl &url, bool allowNull=false)
static QSqlQuery createHistoryQuery(const QString &searchString, int limit, bool exactMatch=false)
static QSqlQuery createDomainQuery(const QString &text)
QList< QStandardItem * > completions() const
QString domainCompletion() const
QString searchString() const
LocationCompleterRefreshJob(const QString &searchString)
static SqlDatabase * instance()