1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
|
/*
Copyright (c) 2016 Christian Mollekopf <mollekopf@kolabsys.com>
This library is free software; you can redistribute it and/or modify it
under the terms of the GNU Library General Public License as published by
the Free Software Foundation; either version 2 of the License, or (at your
option) any later version.
This library is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
License for more details.
You should have received a copy of the GNU Library General Public License
along with this library; see the file COPYING.LIB. If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301, USA.
*/
#pragma once
#include <QObject>
#include <QVariant>
#include <KAsync/Async>
#define KUBE_CONTROLLER_PROPERTY(TYPE, NAME, LOWERCASENAME) \
public: Q_PROPERTY(TYPE LOWERCASENAME MEMBER m##NAME NOTIFY LOWERCASENAME##Changed) \
Q_SIGNALS: void LOWERCASENAME##Changed(); \
private: TYPE m##NAME; \
public: \
struct NAME { \
static constexpr const char *name = #LOWERCASENAME; \
typedef TYPE Type; \
}; \
void set##NAME(const TYPE &value) { setProperty(NAME::name, QVariant::fromValue(value)); } \
void clear##NAME() { setProperty(NAME::name, QVariant{}); } \
TYPE get##NAME() const { return m##NAME; } \
#define KUBE_CONTROLLER_ACTION(NAME) \
Q_PROPERTY (Kube::ControllerAction* NAME##Action READ NAME##Action CONSTANT) \
private: QScopedPointer<Kube::ControllerAction> action_##NAME; \
public: Kube::ControllerAction* NAME##Action() const { Q_ASSERT(action_##NAME); return action_##NAME.data(); } \
private slots: void NAME(); \
#define KUBE_CONTROLLER_LISTCONTROLLER(NAME) \
Q_PROPERTY (Kube::ListPropertyController* NAME READ NAME##Controller CONSTANT) \
private: QScopedPointer<Kube::ListPropertyController> controller_##NAME; \
public: Kube::ListPropertyController* NAME##Controller() const { Q_ASSERT(controller_##NAME); return controller_##NAME.data(); } \
class QAbstractItemModel;
class QStandardItemModel;
namespace Kube {
class ControllerState : public QObject {
Q_OBJECT
Q_PROPERTY(bool enabled MEMBER mEnabled NOTIFY enabledChanged)
public:
ControllerState();
~ControllerState() = default;
void setEnabled(bool enabled) { setProperty("enabled", enabled); }
signals:
void enabledChanged();
private:
bool mEnabled = false;
};
class ControllerAction : public ControllerState {
Q_OBJECT
public:
ControllerAction();
template <typename Func>
ControllerAction(const typename QtPrivate::FunctionPointer<Func>::Object *obj, Func slot)
: ControllerAction()
{
QObject::connect(this, &ControllerAction::triggered, obj, slot);
}
~ControllerAction() = default;
Q_INVOKABLE void execute();
signals:
void triggered();
};
class Controller : public QObject {
Q_OBJECT
public:
Controller() = default;
virtual ~Controller() = default;
public slots:
virtual void clear();
signals:
void done();
void error();
protected:
void run(const KAsync::Job<void> &job);
};
class ListPropertyController : public QObject
{
Q_OBJECT
Q_PROPERTY(QAbstractItemModel* model READ model CONSTANT)
public:
ListPropertyController(const QStringList &roles);
Q_INVOKABLE virtual void add(const QVariantMap &value);
Q_INVOKABLE virtual void remove(const QByteArray &id);
Q_INVOKABLE void clear();
QAbstractItemModel *model();
void setValue(const QByteArray &id, const QString &key, const QVariant &);
void setValues(const QByteArray &id, const QVariantMap &values);
void traverse(const std::function<void(const QVariantMap &)> &f);
template<typename T>
QList<T> getList(const QString &property)
{
QList<T> list;
traverse([&] (const QVariantMap &map) {
list << map[property].value<T>();
});
return list;
}
Q_SIGNALS:
void added(QByteArray, QVariantMap);
protected:
QScopedPointer<QStandardItemModel> mModel;
private:
QHash<QString, int> mRoles;
};
}
|