1/*
2 SPDX-FileCopyrightText: 2006-2007 Aaron Seigo <aseigo@kde.org>
3
4 SPDX-License-Identifier: LGPL-2.0-or-later
5*/
6
7#include "querymatch.h"
8#include "action.h"
9
10#include <QIcon>
11#include <QPointer>
12#include <QReadWriteLock>
13#include <QSharedData>
14#include <QVariant>
15
16#include "abstractrunner.h"
17#include "abstractrunner_p.h"
18
19namespace KRunner
20{
21class QueryMatchPrivate : public QSharedData
22{
23public:
24 explicit QueryMatchPrivate(AbstractRunner *r)
25 : QSharedData()
26 , runner(r)
27 {
28 }
29
30 QueryMatchPrivate(const QueryMatchPrivate &other)
31 : QSharedData(other)
32 {
33 QReadLocker l(&other.lock);
34 runner = other.runner;
35 categoryRelevance = other.categoryRelevance;
36 relevance = other.relevance;
37 selAction = other.selAction;
38 enabled = other.enabled;
39 idSetByData = other.idSetByData;
40 matchCategory = other.matchCategory;
41 id = other.id;
42 text = other.text;
43 subtext = other.subtext;
44 icon = other.icon;
45 iconName = other.iconName;
46 data = other.data;
47 urls = other.urls;
48 actions = other.actions;
49 multiLine = other.multiLine;
50 }
51
52 void setId(const QString &newId)
53 {
54 if (runner && runner->d->hasUniqueResults) {
55 id = newId;
56 } else {
57 if (runner) {
58 id = runner.data()->id();
59 }
60 if (!id.isEmpty()) {
61 id.append(c: QLatin1Char('_')).append(s: newId);
62 }
63 }
64 idSetByData = false;
65 }
66
67 mutable QReadWriteLock lock;
68 QPointer<AbstractRunner> runner;
69 QString matchCategory;
70 QString id;
71 QString text;
72 QString subtext;
73 QString mimeType;
74 QList<QUrl> urls;
75 QIcon icon;
76 QString iconName;
77 QVariant data;
78 qreal categoryRelevance = 50;
79 qreal relevance = .7;
80 KRunner::Action selAction;
81 KRunner::Actions actions;
82 bool enabled = true;
83 bool idSetByData = false;
84 bool multiLine = false;
85};
86
87QueryMatch::QueryMatch(AbstractRunner *runner)
88 : d(new QueryMatchPrivate(runner))
89{
90}
91
92QueryMatch::QueryMatch(const QueryMatch &other)
93 : d(other.d)
94{
95}
96
97QueryMatch::~QueryMatch() = default;
98
99bool QueryMatch::isValid() const
100{
101 return d->runner != nullptr;
102}
103
104QString QueryMatch::id() const
105{
106 if (d->id.isEmpty() && d->runner) {
107 return d->runner.data()->id();
108 }
109
110 return d->id;
111}
112
113void QueryMatch::setCategoryRelevance(qreal relevance)
114{
115 d->categoryRelevance = qBound(min: 0.0, val: relevance, max: 100.0);
116}
117
118qreal QueryMatch::categoryRelevance() const
119{
120 return d->categoryRelevance;
121}
122
123void QueryMatch::setMatchCategory(const QString &category)
124{
125 d->matchCategory = category;
126}
127
128QString QueryMatch::matchCategory() const
129{
130 if (d->matchCategory.isEmpty() && d->runner) {
131 return d->runner->name();
132 }
133 return d->matchCategory;
134}
135
136void QueryMatch::setRelevance(qreal relevance)
137{
138 d->relevance = qMax(a: qreal(0.0), b: relevance);
139}
140
141qreal QueryMatch::relevance() const
142{
143 return d->relevance;
144}
145
146AbstractRunner *QueryMatch::runner() const
147{
148 return d->runner.data();
149}
150
151void QueryMatch::setText(const QString &text)
152{
153 QWriteLocker locker(&d->lock);
154 d->text = text;
155}
156
157void QueryMatch::setSubtext(const QString &subtext)
158{
159 QWriteLocker locker(&d->lock);
160 d->subtext = subtext;
161}
162
163void QueryMatch::setData(const QVariant &data)
164{
165 QWriteLocker locker(&d->lock);
166 d->data = data;
167
168 if (d->id.isEmpty() || d->idSetByData) {
169 const QString matchId = data.toString();
170 if (!matchId.isEmpty()) {
171 d->setId(matchId);
172 d->idSetByData = true;
173 }
174 }
175}
176
177void QueryMatch::setId(const QString &id)
178{
179 QWriteLocker locker(&d->lock);
180 d->setId(id);
181}
182
183void QueryMatch::setIcon(const QIcon &icon)
184{
185 QWriteLocker locker(&d->lock);
186 d->icon = icon;
187}
188
189void QueryMatch::setIconName(const QString &iconName)
190{
191 QWriteLocker locker(&d->lock);
192 d->iconName = iconName;
193}
194
195QVariant QueryMatch::data() const
196{
197 QReadLocker locker(&d->lock);
198 return d->data;
199}
200
201QString QueryMatch::text() const
202{
203 QReadLocker locker(&d->lock);
204 return d->text;
205}
206
207QString QueryMatch::subtext() const
208{
209 QReadLocker locker(&d->lock);
210 return d->subtext;
211}
212
213QIcon QueryMatch::icon() const
214{
215 QReadLocker locker(&d->lock);
216 return d->icon;
217}
218
219QString QueryMatch::iconName() const
220{
221 QReadLocker locker(&d->lock);
222 return d->iconName;
223}
224
225void QueryMatch::setUrls(const QList<QUrl> &urls)
226{
227 QWriteLocker locker(&d->lock);
228 d->urls = urls;
229}
230
231QList<QUrl> QueryMatch::urls() const
232{
233 QReadLocker locker(&d->lock);
234 return d->urls;
235}
236
237void QueryMatch::setEnabled(bool enabled)
238{
239 d->enabled = enabled;
240}
241
242bool QueryMatch::isEnabled() const
243{
244 return d->enabled && d->runner;
245}
246
247KRunner::Action QueryMatch::selectedAction() const
248{
249 return d->selAction;
250}
251
252void QueryMatch::setSelectedAction(const KRunner::Action &action)
253{
254 d->selAction = action;
255}
256
257void QueryMatch::setMultiLine(bool multiLine)
258{
259 d->multiLine = multiLine;
260}
261
262bool QueryMatch::isMultiLine() const
263{
264 return d->multiLine;
265}
266
267QueryMatch &QueryMatch::operator=(const QueryMatch &other)
268{
269 if (d != other.d) {
270 d = other.d;
271 }
272
273 return *this;
274}
275
276bool QueryMatch::operator==(const QueryMatch &other) const
277{
278 return (d == other.d);
279}
280
281bool QueryMatch::operator!=(const QueryMatch &other) const
282{
283 return (d != other.d);
284}
285
286void QueryMatch::setActions(const QList<KRunner::Action> &actions)
287{
288 QWriteLocker locker(&d->lock);
289 d->actions = actions;
290}
291
292void QueryMatch::addAction(const KRunner::Action &action)
293{
294 QWriteLocker locker(&d->lock);
295 d->actions << action;
296}
297
298KRunner::Actions QueryMatch::actions() const
299{
300 QReadLocker locker(&d->lock);
301 return d->actions;
302}
303
304QDebug operator<<(QDebug debug, const KRunner::QueryMatch &match)
305{
306 QDebugStateSaver saver(debug);
307 debug.nospace() << "QueryMatch(category: " << match.matchCategory() << " text:" << match.text() << ")";
308 return debug;
309}
310
311} // KRunner namespace
312

source code of krunner/src/querymatch.cpp