1 /*
2     SPDX-FileCopyrightText: 2012 Aurélien Gâteau <agateau@kde.org>
3     SPDX-FileCopyrightText: 2014 Eike Hein <hein@kde.org>
4 
5     SPDX-License-Identifier: GPL-2.0-or-later
6 */
7 
8 #pragma once
9 
10 #include "abstractmodel.h"
11 
12 #include <QAbstractListModel>
13 #include <QTimer>
14 
15 #include <KRunner/QueryMatch>
16 
17 namespace Plasma
18 {
19 class RunnerManager;
20 }
21 
22 class AbstractModel;
23 class RunnerMatchesModel;
24 
25 class RunnerModel : public QAbstractListModel
26 {
27     Q_OBJECT
28 
29     Q_PROPERTY(int count READ count NOTIFY countChanged)
30     Q_PROPERTY(AbstractModel *favoritesModel READ favoritesModel WRITE setFavoritesModel NOTIFY favoritesModelChanged)
31     Q_PROPERTY(QObject *appletInterface READ appletInterface WRITE setAppletInterface NOTIFY appletInterfaceChanged)
32     Q_PROPERTY(QStringList runners READ runners WRITE setRunners NOTIFY runnersChanged)
33     Q_PROPERTY(QString query READ query WRITE setQuery NOTIFY queryChanged)
34     Q_PROPERTY(bool mergeResults READ mergeResults WRITE setMergeResults NOTIFY mergeResultsChanged)
35     Q_PROPERTY(bool deleteWhenEmpty READ deleteWhenEmpty WRITE setDeleteWhenEmpty NOTIFY deleteWhenEmptyChanged)
36 
37 public:
38     explicit RunnerModel(QObject *parent = nullptr);
39     ~RunnerModel() override;
40 
41     QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
42 
43     QHash<int, QByteArray> roleNames() const override;
44     int rowCount(const QModelIndex &parent = QModelIndex()) const override;
45     int count() const;
46 
47     Q_INVOKABLE QObject *modelForRow(int row);
48 
49     QStringList runners() const;
50     void setRunners(const QStringList &runners);
51 
52     QString query() const;
53     void setQuery(const QString &query);
54 
55     AbstractModel *favoritesModel() const;
56     void setFavoritesModel(AbstractModel *model);
57 
58     QObject *appletInterface() const;
59     void setAppletInterface(QObject *appletInterface);
60 
61     bool mergeResults() const;
62     void setMergeResults(bool merge);
63 
64     bool deleteWhenEmpty() const;
65     void setDeleteWhenEmpty(bool deleteWhenEmpty);
66 
67 Q_SIGNALS:
68     void countChanged() const;
69     void favoritesModelChanged() const;
70     void appletInterfaceChanged() const;
71     void runnersChanged() const;
72     void queryChanged() const;
73     void mergeResultsChanged() const;
74     void deleteWhenEmptyChanged();
75 
76 private Q_SLOTS:
77     void startQuery();
78     void matchesChanged(const QList<Plasma::QueryMatch> &matches);
79 
80 private:
81     void createManager();
82     void clear();
83 
84     AbstractModel *m_favoritesModel;
85     QObject *m_appletInterface;
86     Plasma::RunnerManager *m_runnerManager;
87     QStringList m_runners;
88     QList<RunnerMatchesModel *> m_models;
89     QString m_query;
90     QTimer m_queryTimer;
91     bool m_mergeResults;
92     bool m_deleteWhenEmpty;
93 };
94