1/*
2 * SPDX-FileCopyrightText: 2019 Kai Uwe Broulik <kde@broulik.de>
3 * SPDX-FileCopyrightText: 2023 Alexander Lohnau <alexander.lohnau@gmx.de>
4 *
5 * SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
6 *
7 */
8
9#ifndef KRUNNER_RESULTSMODEL
10#define KRUNNER_RESULTSMODEL
11
12#include "krunner_export.h"
13
14#include <KRunner/RunnerManager>
15#include <QIcon>
16#include <QSortFilterProxyModel>
17#include <memory>
18
19namespace KRunner
20{
21class ResultsModelPrivate;
22
23/*!
24 * \class KRunner::ResultsModel
25 * \inheaderfile KRunner/ResultsModel
26 * \inmodule KRunner
27 *
28 * \brief A model that exposes and sorts results for a given query.
29 *
30 * \since 6.0
31 */
32class KRUNNER_EXPORT ResultsModel : public QSortFilterProxyModel
33{
34 Q_OBJECT
35
36 /*!
37 * \property KRunner::ResultsModel::queryString
38 *
39 * The query string to run
40 */
41 Q_PROPERTY(QString queryString READ queryString WRITE setQueryString NOTIFY queryStringChanged)
42 /*!
43 * \property KRunner::ResultsModel::limit
44 *
45 * The preferred maximum number of matches in the model
46 *
47 * If there are lots of results from different categories,
48 * the limit can be slightly exceeded.
49 *
50 * Default is 0, which means no limit.
51 */
52 Q_PROPERTY(int limit READ limit WRITE setLimit RESET resetLimit NOTIFY limitChanged)
53 /*!
54 * \property KRunner::ResultsModel::querying
55 *
56 * Whether the query is currently being run
57 *
58 * This can be used to show a busy indicator
59 */
60 Q_PROPERTY(bool querying READ querying NOTIFY queryingChanged)
61
62 /*!
63 * \property KRunner::ResultsModel::singleRunner
64 *
65 * The single runner to use for querying in single runner mode
66 *
67 * Defaults to empty string which means all runners
68 */
69 Q_PROPERTY(QString singleRunner READ singleRunner WRITE setSingleRunner NOTIFY singleRunnerChanged)
70
71 /*!
72 * \property KRunner::ResultsModel::singleRunnerMetaData
73 */
74 Q_PROPERTY(KPluginMetaData singleRunnerMetaData READ singleRunnerMetaData NOTIFY singleRunnerChanged)
75
76 /*!
77 * \property KRunner::ResultsModel::runnerManager
78 */
79 Q_PROPERTY(KRunner::RunnerManager *runnerManager READ runnerManager WRITE setRunnerManager NOTIFY runnerManagerChanged)
80
81 /*!
82 * \property KRunner::ResultsModel::favoriteIds
83 */
84 Q_PROPERTY(QStringList favoriteIds READ favoriteIds WRITE setFavoriteIds NOTIFY favoriteIdsChanged)
85
86public:
87 /*!
88 *
89 */
90 explicit ResultsModel(const KConfigGroup &configGroup, const KConfigGroup &stateConfigGroup, QObject *parent = nullptr);
91
92 /*!
93 *
94 */
95 explicit ResultsModel(QObject *parent = nullptr);
96 ~ResultsModel() override;
97
98 /*!
99 * \value IdRole
100 * \value CategoryRelevanceRole
101 * \value RelevanceRole
102 * \value EnabledRole
103 * \value CategoryRole
104 * \value SubtextRole
105 * \value ActionsRole
106 * \value MultiLineRole
107 * \value UrlsRole
108 * \omitvalue QueryMatchRole
109 * \omitvalue FavoriteIndexRole
110 * \omitvalue FavoriteCountRole
111 */
112 enum Roles {
113 IdRole = Qt::UserRole + 1,
114 CategoryRelevanceRole,
115 RelevanceRole,
116 EnabledRole,
117 CategoryRole,
118 SubtextRole,
119 ActionsRole,
120 MultiLineRole,
121 UrlsRole,
122 QueryMatchRole,
123 FavoriteIndexRole,
124 FavoriteCountRole,
125 };
126 Q_ENUM(Roles)
127
128 QString queryString() const;
129 void setQueryString(const QString &queryString);
130 Q_SIGNAL void queryStringChanged(const QString &queryString);
131
132 /*!
133 * IDs of favorite plugins. Those plugins are always in a fixed order before the other ones.
134 *
135 * \a ids KPluginMetaData::pluginId values of plugins
136 */
137 void setFavoriteIds(const QStringList &ids);
138 QStringList favoriteIds() const;
139 Q_SIGNAL void favoriteIdsChanged();
140
141 int limit() const;
142 void setLimit(int limit);
143 void resetLimit();
144 Q_SIGNAL void limitChanged();
145
146 bool querying() const;
147 Q_SIGNAL void queryingChanged();
148
149 QString singleRunner() const;
150 void setSingleRunner(const QString &runner);
151 Q_SIGNAL void singleRunnerChanged();
152
153 KPluginMetaData singleRunnerMetaData() const;
154
155 QHash<int, QByteArray> roleNames() const override;
156
157 /*!
158 * Clears the model content and resets the runner context, i.e. no new items will appear.
159 */
160 Q_INVOKABLE void clear();
161
162 /*!
163 * Run the result at the given model index \a idx
164 */
165 Q_INVOKABLE bool run(const QModelIndex &idx);
166 /*!
167 * Run the action \a actionNumber at given model index \a idx
168 */
169 Q_INVOKABLE bool runAction(const QModelIndex &idx, int actionNumber);
170
171 /*!
172 * Get mime data for the result at given model index \a idx
173 */
174 Q_INVOKABLE QMimeData *getMimeData(const QModelIndex &idx) const;
175
176 /*!
177 * Get match for the result at given model index \a idx
178 */
179 KRunner::QueryMatch getQueryMatch(const QModelIndex &idx) const;
180
181 KRunner::RunnerManager *runnerManager() const;
182 /*!
183 * \since 6.9
184 */
185 void setRunnerManager(KRunner::RunnerManager *manager);
186 /*!
187 * \since 6.9
188 */
189 Q_SIGNAL void runnerManagerChanged();
190
191Q_SIGNALS:
192 /*!
193 * This signal is emitted when a an InformationalMatch is run, and it is advised
194 * to update the search term, e.g. used for calculator runner results
195 */
196 void queryStringChangeRequested(const QString &queryString, int pos);
197
198private:
199 const std::unique_ptr<ResultsModelPrivate> d;
200};
201
202} // namespace KRunner
203#endif
204

source code of krunner/src/model/resultsmodel.h