12 #ifndef hifi_task_Config_h
13 #define hifi_task_Config_h
17 #include <QtCore/qobject.h>
18 #include <QtCore/qjsondocument.h>
19 #include <QtCore/qjsonobject.h>
20 #include <QtCore/qjsonvalue.h>
21 #include <QtCore/QRegularExpression>
22 #include <shared/JSONHelpers.h>
24 #include "SettingHandle.h"
30 template <
class C>
class PersistentConfig :
public C {
32 const QString DEFAULT =
"Default";
33 const QString NONE =
"None";
35 PersistentConfig() =
delete;
36 PersistentConfig(
const QStringList& path) :
37 _preset(path, DEFAULT) { }
38 PersistentConfig(
const QStringList& path,
bool enabled) : C(enabled),
39 _preset(path, enabled ? DEFAULT : NONE) { }
41 QStringList getPresetList() {
42 if (_presets.empty()) {
43 setPresetList(QJsonObject());
45 return _presets.keys();
48 virtual void setPresetList(
const QJsonObject& list)
override {
49 assert(_presets.empty());
51 _default = toJsonValue(*this).toObject().toVariantMap();
53 _presets.unite(list.toVariantMap());
55 _presets.insert(DEFAULT, _default);
57 _presets.insert(NONE, QVariantMap{{
"enabled",
false }});
59 auto preset = _preset.get();
60 if (preset != _preset.getDefault() && _presets.contains(preset)) {
62 C::load(_presets.value(preset).toMap());
66 QString getPreset() {
return _preset.get(); }
68 void setPreset(
const QString& preset) {
70 if (_presets.contains(preset)) {
72 QVariantMap config = _default;
73 QVariantMap presetConfig = _presets[preset].toMap();
74 for (
auto it = presetConfig.cbegin(); it != presetConfig.cend(); it++) {
75 config.insert(it.key(), it.value());
82 QMultiMap<QString, QVariant> _default;
83 QMultiMap<QString, QVariant> _presets;
91 using Config = JobConfig;
106 class JobConfig :
public QObject {
108 Q_PROPERTY(
double cpuRunTime READ getCPURunTime NOTIFY newStats())
109 Q_PROPERTY(
bool enabled READ isEnabled WRITE setEnabled NOTIFY dirtyEnabled())
110 Q_PROPERTY(
int branch READ getBranch WRITE setBranch NOTIFY dirtyEnabled)
112 double _msCPURunTime{ 0.0 };
115 friend class TaskConfig;
117 bool _isEnabled{
true };
119 uint8_t _branch { 0 };
121 bool _isTask{
false };
122 bool _isSwitch{
false };
124 using Persistent = PersistentConfig<JobConfig>;
126 JobConfig() =
default;
127 JobConfig(
bool enabled): _isEnabled{ enabled } {}
130 bool isEnabled()
const {
return _isEnabled; }
131 void setEnabled(
bool enable);
133 virtual void setPresetList(
const QJsonObject&
object);
140 Q_INVOKABLE QString toJSON() {
return QJsonDocument(toJsonValue(*this).toObject()).toJson(QJsonDocument::Compact); }
146 Q_INVOKABLE
void load(
const QVariantMap& map) { qObjectFromJsonValue(QJsonObject::fromVariantMap(map), *
this); emit loaded(); }
150 void setCPURunTime(
const std::chrono::nanoseconds& runtime) { _msCPURunTime = std::chrono::duration<double, std::milli>(runtime).count(); emit newStats(); }
151 double getCPURunTime()
const {
return _msCPURunTime; }
166 Q_INVOKABLE QObject* getConfig(
const QString& name) {
return getConfig<TConfigProxy>(name.toStdString()); }
169 JobConfig* getRootConfig(
const std::string& jobPath, std::string& jobName)
const;
170 JobConfig* getJobConfig(
const std::string& jobPath)
const;
171 template <
class T>
typename T::Config* getConfig(std::string jobPath =
"")
const {
172 return dynamic_cast<typename T::Config*
>(getJobConfig(jobPath));
180 Q_INVOKABLE
bool isTask()
const {
return _isTask; }
186 Q_INVOKABLE
bool isSwitch()
const {
return _isSwitch; }
192 Q_INVOKABLE QObjectList getSubConfigs()
const {
193 auto list = findChildren<JobConfig*>(QRegularExpression(
".*"), Qt::FindDirectChildrenOnly);
194 QObjectList returned;
195 for (
int i = 0; i < list.size(); i++) {
196 returned.push_back(list[i]);
205 Q_INVOKABLE
int getNumSubs()
const {
return getSubConfigs().size(); }
212 Q_INVOKABLE QObject* getSubConfig(
int i)
const {
213 auto subs = getSubConfigs();
214 return ((i < 0 || i >= subs.size()) ?
nullptr : subs[i]);
217 void connectChildConfig(std::shared_ptr<JobConfig> childConfig,
const std::string& name);
218 void transferChildrenConfigs(std::shared_ptr<JobConfig> source);
220 JobConcept* _jobConcept;
222 uint8_t getBranch()
const {
return _branch; }
223 void setBranch(uint8_t index);
231 void load(
const QJsonObject& val) { qObjectFromJsonValue(val, *
this); emit loaded(); }
259 using QConfigPointer = std::shared_ptr<JobConfig>;