8#include "runnercontext.h"
13#include <QReadWriteLock>
14#include <QRegularExpression>
18#include <KConfigGroup>
21#include "abstractrunner.h"
22#include "abstractrunner_p.h"
23#include "querymatch.h"
24#include "runnermanager.h"
28KRUNNER_EXPORT
int __changeCountBeforeSaving = 5;
32 explicit RunnerContextPrivate(RunnerManager *manager)
38 RunnerContextPrivate(
const RunnerContextPrivate &p)
40 , m_manager(p.m_manager)
41 , launchCounts(p.launchCounts)
45 ~RunnerContextPrivate()
54 void addMatch(
const QueryMatch &match)
56 if (
match.runner() &&
match.runner()->d->hasUniqueResults) {
57 if (uniqueIds.contains(
match.id())) {
58 const QueryMatch &existentMatch = uniqueIds.value(
match.id());
59 if (existentMatch.runner() && existentMatch.runner()->d->hasWeakResults) {
61 matches.removeOne(existentMatch);
62 matches.append(match);
66 uniqueIds.insert(
match.id(), match);
67 matches.append(match);
71 matches.append(match);
84 bool m_isValid =
true;
87 int changedLaunchCounts = 0;
89 bool singleRunnerQueryMode =
false;
90 bool shouldIgnoreCurrentMatchForHistory =
false;
93 int requestedCursorPosition = 0;
94 qint64 queryStartTs = 0;
97RunnerContext::RunnerContext(RunnerManager *manager)
98 : d(new RunnerContextPrivate(manager))
109RunnerContext::~RunnerContext()
115 if (this->d == other.d) {
133void RunnerContext::reset()
157 d->uniqueIds.clear();
158 d->singleRunnerQueryMode =
false;
159 d->shouldIgnoreCurrentMatchForHistory =
false;
162void RunnerContext::setQuery(
const QString &term)
164 if (!this->query().isEmpty()) {
172 d->requestedText.clear();
184bool RunnerContext::isValid()
const
192 if (matches.
isEmpty() || !isValid()) {
202 if (
int count = d->launchCounts.value(match.id())) {
203 match.setRelevance(match.relevance() + 0.5 * (1 - exp(-count * 0.3)));
215 return addMatches({match});
225void RunnerContext::requestQueryStringUpdate(
const QString &text,
int cursorPosition)
const
227 d->requestedText = text;
228 d->requestedCursorPosition = cursorPosition;
231void RunnerContext::setSingleRunnerQueryMode(
bool enabled)
233 d->singleRunnerQueryMode = enabled;
236bool RunnerContext::singleRunnerQueryMode()
const
238 return d->singleRunnerQueryMode;
241void RunnerContext::ignoreCurrentMatchForHistory()
const
243 d->shouldIgnoreCurrentMatchForHistory =
true;
246bool RunnerContext::shouldIgnoreCurrentMatchForHistory()
const
248 return d->shouldIgnoreCurrentMatchForHistory;
265 for (
const QString &entry : cfgList) {
266 if (
int idx = entry.indexOf(
QLatin1Char(
' ')); idx != -1) {
267 const int count = entry.
mid(0, idx).
toInt();
269 d->launchCounts[id] = count;
276 if (d->changedLaunchCounts < __changeCountBeforeSaving) {
279 d->changedLaunchCounts = 0;
281 countList.
reserve(d->launchCounts.size());
282 for (
auto it = d->launchCounts.cbegin(), end = d->launchCounts.cend(); it !=
end; ++it) {
290void RunnerContext::increaseLaunchCount(
const QueryMatch &match)
292 ++d->launchCounts[
match.id()];
293 ++d->changedLaunchCounts;
296QString RunnerContext::requestedQueryString()
const
298 return d->requestedText;
300int RunnerContext::requestedCursorPosition()
const
302 return d->requestedCursorPosition;
305void RunnerContext::setJobStartTs(qint64 queryStartTs)
307 d->queryStartTs = queryStartTs;
309QString RunnerContext::runnerJobId(AbstractRunner *runner)
const
void writeEntry(const char *key, const char *value, WriteConfigFlags pFlags=Normal)
QString readEntry(const char *key, const char *aDefault=nullptr) const
A match returned by an AbstractRunner in response to a given RunnerContext.
The RunnerContext class provides information related to a search, including the search term and colle...
KSERVICE_EXPORT KService::List query(FilterFunc filterFunc)
KCOREADDONS_EXPORT Result match(QStringView pattern, QStringView str)
const QList< QKeySequence > & end()
bool isEmpty() const const
void reserve(qsizetype size)
bool isEmpty() const const
QString mid(qsizetype position, qsizetype n) const const
QString number(double n, char format, int precision)
int toInt(bool *ok, int base) const const