diff --git a/src/mvvmcore/settingsentry.h b/src/mvvmcore/settingsentry.h index 74acf88..61c3829 100644 --- a/src/mvvmcore/settingsentry.h +++ b/src/mvvmcore/settingsentry.h @@ -192,6 +192,8 @@ public: const_iterator constBegin() const; const_iterator constEnd() const; + void addChangeCallback(const std::function)> &callback); + void addChangeCallback(QObject *scope, const std::function)> &callback); void addChangeCallback(const std::function &callback); // index, value void addChangeCallback(QObject *scope, const std::function &callback); void addSizeChangeCallback(const std::function &callback); // size @@ -474,6 +476,27 @@ typename SettingsEntry>::const_iterator SettingsEntry> return const_iterator{const_cast>*>(this), size()}; } +template +void SettingsEntry>::addChangeCallback(const std::function)> &callback) +{ + addChangeCallback(_accessor, callback); +} + +template +void SettingsEntry>::addChangeCallback(QObject *scope, const std::function)> &callback) +{ + QObject::connect(_accessor, &ISettingsAccessor::entryChanged, + scope, [this, callback](const QString &key, const QVariant &) { + if(key.startsWith(_key)) + callback(get()); + }); + QObject::connect(_accessor, &ISettingsAccessor::entryRemoved, + scope, [this, callback](const QString &key) { + if(key.startsWith(_key)) + callback(get()); + }); +} + template void SettingsEntry>::addChangeCallback(const std::function &callback) { @@ -496,7 +519,7 @@ void SettingsEntry>::addChangeCallback(QObject *scope, const std::f scope, [mKey, mDefault, callback](const QString &key) { auto match = mKey.match(key); if(match.hasMatch()) - callback(match.captured(1).toInt(), mDefault); + callback(match.captured(1).toInt(), mDefault.template value()); }); } diff --git a/tests/auto/mvvmcore/settingsgenerator/generatortest.xml b/tests/auto/mvvmcore/settingsgenerator/generatortest.xml index 2caa100..d00b1da 100644 --- a/tests/auto/mvvmcore/settingsgenerator/generatortest.xml +++ b/tests/auto/mvvmcore/settingsgenerator/generatortest.xml @@ -56,6 +56,10 @@ type="void"/> + + {42} + diff --git a/tests/auto/mvvmcore/settingsgenerator/test_de.ts b/tests/auto/mvvmcore/settingsgenerator/test_de.ts index 0d57e36..1d6c479 100644 --- a/tests/auto/mvvmcore/settingsgenerator/test_de.ts +++ b/tests/auto/mvvmcore/settingsgenerator/test_de.ts @@ -4,7 +4,7 @@ SettingsGeneratorTest - + somet translated text... diff --git a/tests/auto/mvvmcore/settingsgenerator/tst_settingsgenerator.cpp b/tests/auto/mvvmcore/settingsgenerator/tst_settingsgenerator.cpp index 38e266f..8f8de83 100644 --- a/tests/auto/mvvmcore/settingsgenerator/tst_settingsgenerator.cpp +++ b/tests/auto/mvvmcore/settingsgenerator/tst_settingsgenerator.cpp @@ -40,6 +40,7 @@ void SettingsGeneratorTest::testSettingsGenerator() QCOMPARE(settings->parentNode.parentEntry.nodeWithCodeEntry.key(), QStringLiteral("tests/parentNode/parentEntry/nodeWithCodeEntry")); QCOMPARE(settings->parentNode.parentEntry.leafEntry.key(), QStringLiteral("tests/parentNode/parentEntry/leafEntry")); QCOMPARE(settings->variantEntry.key(), QStringLiteral("tests/variantEntry")); + QCOMPARE(settings->simpleListEntry.key(), QStringLiteral("tests/simpleListEntry")); QCOMPARE(settings->listEntry.key(), QStringLiteral("tests/listEntry")); QCOMPARE(settings->listEntry.dummyChild.key(), QStringLiteral("tests/listEntry/dummyChild")); @@ -52,6 +53,7 @@ void SettingsGeneratorTest::testSettingsGenerator() QCOMPARE(settings->parentNode.parentEntry.nodeWithCodeEntry.get(), 43); QCOMPARE(settings->parentNode.parentEntry.leafEntry.get(), QStringLiteral("translate me")); QCOMPARE(settings->variantEntry.get(), QVariant{}); + QCOMPARE(settings->simpleListEntry.get(), QList{42}); QByteArrayList iList{"test1", "test2", "test3"}; QCOMPARE(settings->listEntry.get(), iList); QCOMPARE(settings->listEntry.dummyChild.get(), false); diff --git a/tests/auto/qml/qmlsettingsgenerator/generatortest.xml b/tests/auto/qml/qmlsettingsgenerator/generatortest.xml index 1bc9c4d..49176af 100644 --- a/tests/auto/qml/qmlsettingsgenerator/generatortest.xml +++ b/tests/auto/qml/qmlsettingsgenerator/generatortest.xml @@ -55,6 +55,10 @@ type="void"/> + + {42} + diff --git a/tools/settingsgenerator/cppsettingsgenerator.cpp b/tools/settingsgenerator/cppsettingsgenerator.cpp index 780abfa..218dbc7 100644 --- a/tools/settingsgenerator/cppsettingsgenerator.cpp +++ b/tools/settingsgenerator/cppsettingsgenerator.cpp @@ -154,12 +154,11 @@ void CppSettingsGenerator::writeSource(const SettingsType &settings) first = false; else _src << ",\n"; - _src << "\t\tQVariant{"; + _src << "\t\t"; if(param.asStr) - _src << "QStringLiteral(\"" << param.value << "\")"; + _src << "QVariant{QStringLiteral(\"" << param.value << "\")}.value<" << param.type << ">()"; else _src << param.value; - _src << "}.value<" << param.type << ">()"; } _src << "\n\t"; } diff --git a/tools/settingsgenerator/qmlsettingsgenerator.cpp b/tools/settingsgenerator/qmlsettingsgenerator.cpp index 5b3dba2..b11ecb5 100644 --- a/tools/settingsgenerator/qmlsettingsgenerator.cpp +++ b/tools/settingsgenerator/qmlsettingsgenerator.cpp @@ -33,7 +33,7 @@ void QmlSettingsGenerator::process(const QString &inPath) _srcFile.close(); } -void QmlSettingsGenerator::writeHeader(const SettingsGeneratorBase::SettingsType &settings, const QString &inHdrPath) +void QmlSettingsGenerator::writeHeader(const SettingsType &settings, const QString &inHdrPath) { QString incGuard = QFileInfo{_hdrFile.fileName()} .completeBaseName() @@ -58,88 +58,106 @@ void QmlSettingsGenerator::writeHeader(const SettingsGeneratorBase::SettingsType } _hdr << "\n"; - writeListTypeBaseClass(settings); + writeListTypeBaseClass(); // create all the qmltype classes - auto keyList = settings.prefix ? QStringList{settings.prefix.value()} : QStringList{}; + auto keyList = settings.baseKey ? QStringList{settings.baseKey.value()} : QStringList{}; int offset; QList childOffsets; std::tie(offset, childOffsets) = writeNodeContentClassesDeclarations(settings, keyList); // create the class - _hdr << "class " << _prefixName << " : public QObject\n" + _hdr << "class " << _name << " : public QObject\n" << "{\n" << "\tQ_OBJECT\n\n" << "\tQ_PROPERTY(QtMvvm::ISettingsAccessor *accessor READ accessor CONSTANT FINAL)\n\n"; QList> childConstructs; - writeNodeClassPropertiesDeclarations(settings, keyList, childOffsets, childConstructs); + QList listEntries; + writeNodeClassPropertiesDeclarations(settings, keyList, childOffsets, listEntries, childConstructs); - _hdr << "public:\n" - << "\texplicit " << settings.name.value() << "(QObject *parent = nullptr);\n" - << "\tQtMvvm::ISettingsAccessor *accessor() const;\n\n"; - - _hdr << "\nprivate:\n" - << "\tQtMvvm::ISettingsAccessor *_accessor;\n" + _hdr << "\t" << _cppName << " *_settings;\n\n" + << "public:\n" + << "\texplicit " << _name << "(" << _cppName << " *settings, QObject *parent = nullptr) : \n" + << "\t\tQObject{parent},\n"; + writeMemberInits(keyList, childConstructs); + _hdr << "\t\t_settings{settings}\n" + << "\t{\n"; + writeEntryPropertySignalConnects(settings, keyList, -1, listEntries); + _hdr << "\t}\n\n" + << "\texplicit " << _name << "(QObject *parent = nullptr) :\n" + << "\t\t" << _name << "{" << _cppName << "::instance(), parent}\n" + << "\t{}\n\n" + << "\tQtMvvm::ISettingsAccessor *accessor() const { return _settings->accessor(); }\n" + << "\t" << _cppName << " *settings() const { return _settings; }\n" << "};\n\n" << "#endif //" << incGuard << '\n'; } -void QmlSettingsGenerator::writeListTypeBaseClass(const SettingsGeneratorBase::SettingsType &settings) +void QmlSettingsGenerator::writeListTypeBaseClass() { // write the generic variant _hdr << "template \n" - << "class " << _prefixName << "_ListType : public QObject\n" + << "class " << _name << "_ListType : public QObject\n" << "{\n" << "public:\n" << "\ttemplate \n" << "\tstruct ListData {\n" - << "\t\tstatic_assert(std::is_base_of<" << _prefixName << "_ListType, TList>::value, \"TList must extend " << _prefixName << "_ListType\");\n" + << "\t\tstatic_assert(std::is_base_of<" << _name << "_ListType, TList>::value, \"TList must extend " << _name << "_ListType\");\n" << "\t\tQtMvvm::SettingsEntry> &entry;\n" << "\t\tQList elements;\n" << "\t};\n\n" - << "\t" << _prefixName << "_ListType(QtMvvm::SettingsEntry> &entry, QObject *parent) : \n" - << "\t\tQObject{parent},\n" - << "\t\t_entry{entry}\n" + << "\t" << _name << "_ListType(QObject *parent) : \n" + << "\t\tQObject{parent}\n" << "\t{}\n" - << "\tT value() const { return _index >= 0 ? _entry.getAt(_index) : _buffer; }\n" - << "\tvoid setValue(const T &value) { if(_index >= 0) _entry.setAt(_index, value); else { _index = -2; _buffer = value; } }\n\n" - << "private:\n" - << "\tfriend class " << _prefixName << ";\n" - << "\tQtMvvm::SettingsEntry> &_entry;\n" - << "\tint _index = -1;\n" - << "\tT _buffer{};\n\n" + << "\tT value() const { return _entry ? _entry->getAt(_index) : _buffer; }\n" + << "\tvoid setValue(const T &value) { if(_entry) _entry->setAt(_index, value); else { _index = -2; _buffer = value; } }\n\n" + << "\ttemplate \n" - << "\tstatic void append(QQmlListProperty *list, TList *element) {\n" - << "\t\tconst auto data = reinterpret_cast*>(list->data);\n" - << "\t\tconst auto maxIndex = data->entry.size();\n" - << "\t\tfor(auto index = data->elements.size(); index <= maxIndex; index++) {\n" - << "\t\t\tTList *elem;\n" - << "\t\t\tif(index == maxIndex) {\n" - << "\t\t\t\telem = element;\n" - << "\t\t\t\telem->setParent(list->object);\n" - << "\t\t\t} else\n" - << "\t\t\t\telem = new TList{list->object};\n" - << "\t\t\tconst auto copyDefault = elem->_index == -2;\n" + << "\tstatic void adjust(ListData *data, QObject *parent, int size) {\n" + << "\t\twhile(data->elements.size() > size)\n" + << "\t\t\tdata->elements.takeLast()->deleteLater();\n" + << "\t\tfor(auto index = data->elements.size(); index < size; index++) {\n" + << "\t\t\tauto elem = new TList{parent};\n" << "\t\t\telem->_index = index;\n" + << "\t\t\telem->_entry = &data->entry;\n" << "\t\t\tdata->elements.append(elem);\n" - << "\t\t\tif(copyDefault)\n" - << "\t\t\t\telem->setValue(T{std::move(elem->_buffer)});\n" << "\t\t\tdata->entry.addChangeCallback(elem, [index, elem](int i, const T &d) {\n" << "\t\t\t\tif(i == index)\n" << "\t\t\t\t\temit elem->valueChanged(d);\n" << "\t\t\t});\n" << "\t\t}\n" << "\t}\n\n" + + << "\ttemplate \n" + << "\tstatic void append(QQmlListProperty *list, TList *element) {\n" + << "\t\tconst auto data = reinterpret_cast*>(list->data);\n" + << "\t\tconst auto maxIndex = data->entry.size();\n" + << "\t\tadjust(data, list->object, maxIndex);\n" + << "\t\telement->setParent(list->object);\n" + << "\t\tconst auto copyDefault = element->_index == -2;\n" + << "\t\telement->_index = maxIndex;\n" + << "\t\telement->_entry = &data->entry;\n" + << "\t\tdata->elements.append(element);\n" + << "\t\tif(copyDefault)\n" + << "\t\t\telement->setValue(T{std::move(element->_buffer)});\n" + << "\t\tdata->entry.addChangeCallback(element, [maxIndex, element](int i, const T &d) {\n" + << "\t\t\tif(i == maxIndex)\n" + << "\t\t\t\temit element->valueChanged(d);\n" + << "\t\t});\n" + << "\t}\n\n" + << "\ttemplate \n" << "\tstatic TList *at(QQmlListProperty *list, int index) {\n" << "\t\tconst auto data = reinterpret_cast*>(list->data);\n" << "\t\treturn data->elements.size() > index ? data->elements.value(index) : nullptr;\n" << "\t}\n\n" + << "\ttemplate \n" << "\tstatic int count(QQmlListProperty *list) {\n" << "\t\treturn reinterpret_cast*>(list->data)->elements.size();\n" << "\t}\n\n" + << "\ttemplate \n" << "\tstatic void clear(QQmlListProperty *list) {\n" << "\t\tconst auto data = reinterpret_cast*>(list->data);\n" @@ -147,11 +165,16 @@ void QmlSettingsGenerator::writeListTypeBaseClass(const SettingsGeneratorBase::S << "\t\t\telem->deleteLater();\n" << "\t\tdata->elements.clear();\n" << "\t\tdata->entry.reset(false);\n" - << "\t}\n" + << "\t}\n\n" + + << "private:\n" + << "\tQtMvvm::SettingsEntry> *_entry = nullptr;\n" + << "\tint _index = -1;\n" + << "\tT _buffer{};\n" << "};\n\n"; } -std::tuple> QmlSettingsGenerator::writeNodeContentClassesDeclarations(const SettingsGeneratorBase::NodeContentGroup &node, const QStringList &keyList, int offset) +std::tuple> QmlSettingsGenerator::writeNodeContentClassesDeclarations(const NodeContentGroup &node, const QStringList &keyList, int offset) { QList offsetList; for(const auto &cNode : node.contentNodes) { @@ -165,7 +188,7 @@ std::tuple> QmlSettingsGenerator::writeNodeContentClassesDeclara } else offsetList.append(-1); } else if(nonstd::holds_alternative(cNode)) { - offset = writeListEntryListClass(nonstd::get(cNode), keyList, offset); + offset = writeListEntryListClass(nonstd::get(cNode), offset); offsetList.append(offset - 1); //double offset!!! if(!nonstd::get(cNode).contentNodes.isEmpty()) { offset = writeNodeClassDeclaration(nonstd::get(cNode), keyList, offset); @@ -182,41 +205,45 @@ std::tuple> QmlSettingsGenerator::writeNodeContentClassesDeclara return std::make_tuple(offset, offsetList); } -int QmlSettingsGenerator::writeNodeClassDeclaration(const SettingsGeneratorBase::NodeType &node, const QStringList &keyList, int offset) +int QmlSettingsGenerator::writeNodeClassDeclaration(const NodeType &node, QStringList keyList, int offset) { - auto subList = QStringList{keyList} << node.key; + keyList.append(node.key); QList childOffsets; - std::tie(offset, childOffsets) = writeNodeContentClassesDeclarations(node, subList, offset); + std::tie(offset, childOffsets) = writeNodeContentClassesDeclarations(node, keyList, offset); - _hdr << "class " << _prefixName << "_" << offset << " : public QObject // " << node.key << "\n" + _hdr << "class " << _name << "_" << offset << " : public QObject // " << node.key << "\n" << "{\n" << "\tQ_OBJECT\n\n"; QList> childConstructs; - writeNodeClassPropertiesDeclarations(node, subList, childOffsets, childConstructs); + QList listEntries; + writeNodeClassPropertiesDeclarations(node, keyList, childOffsets, listEntries, childConstructs); _hdr << "\t" << _cppName << " *_settings;\n\n" << "public:\n" << "\t" << _name << "_" << offset << "(" << _cppName << " *settings, QObject *parent) : \n" << "\t\tQObject{parent},\n"; - for(const auto &info : childConstructs) - _hdr << "\t\t_" << info.first << "{new " << _name << "_" << info.second << "{settings, this}},\n"; + writeMemberInits(keyList, childConstructs); _hdr << "\t\t_settings{settings}\n" - << "\t{}\n" + << "\t{\n"; + writeEntryPropertySignalConnects(node, keyList, offset, listEntries); + _hdr << "\t}\n" << "};\n\n"; return ++offset; } -int QmlSettingsGenerator::writeListEntryListClass(const SettingsGeneratorBase::ListEntryType &entry, QStringList keyList, int offset) +int QmlSettingsGenerator::writeListEntryListClass(const ListEntryType &entry, int offset) { const auto &mType = _typeMappings.value(entry.type, entry.type); - _hdr << "class " << _prefixName << "_" << offset << " : public " << _prefixName << "_ListType<" << mType << "> // " << entry.key << "\n" + _hdr << "class " << _name << "_" << offset << " : public " << _name << "_ListType<" << mType << "> // " << entry.key << "\n" << "{\n" << "\tQ_OBJECT\n\n" << "\tQ_PROPERTY(" << mType << " value READ value WRITE setValue NOTIFY valueChanged)\n\n" << "public:\n" - << "\texplicit " << _name << "_" << offset << "(QObject *parent = nullptr);\n\n" + << "\texplicit " << _name << "_" << offset << "(QObject *parent = nullptr) : \n" + << "\t\t" << _name << "_ListType{parent}\n" + << "\t{}\n\n" << "Q_SIGNALS:\n" << "\tvoid valueChanged(const " << mType << " &value);\n" << "};\n\n"; @@ -224,7 +251,7 @@ int QmlSettingsGenerator::writeListEntryListClass(const SettingsGeneratorBase::L return ++offset; } -void QmlSettingsGenerator::writeNodeClassPropertiesDeclarations(const SettingsGeneratorBase::NodeContentGroup &node, const QStringList &keyList, QList &childOffsets, QList> &childConstructs) +void QmlSettingsGenerator::writeNodeClassPropertiesDeclarations(const NodeContentGroup &node, const QStringList &keyList, QList &childOffsets, QList &listEntries, QList> &childConstructs) { for(const auto &cNode : node.contentNodes) { if(nonstd::holds_alternative(cNode)) @@ -232,25 +259,26 @@ void QmlSettingsGenerator::writeNodeClassPropertiesDeclarations(const SettingsGe else if(nonstd::holds_alternative(cNode)) writeEntryPropertyDeclaration(nonstd::get(cNode), keyList, childOffsets.takeFirst(), childConstructs); else if(nonstd::holds_alternative(cNode)) { - childOffsets.takeFirst(); //TODO use... - writeEntryPropertyDeclaration(nonstd::get(cNode), keyList, childOffsets.takeFirst(), childConstructs); + auto lIndex = childOffsets.takeFirst(); //done seperately because of undefine param call order + writeListEntryPropertyDeclaration(nonstd::get(cNode), keyList, lIndex, childOffsets.takeFirst(), childConstructs); + listEntries.append(lIndex); } else if(nonstd::holds_alternative(cNode)) - writeNodeClassPropertiesDeclarations(nonstd::get(cNode), keyList, childOffsets, childConstructs); + writeNodeClassPropertiesDeclarations(nonstd::get(cNode), keyList, childOffsets, listEntries, childConstructs); else Q_UNREACHABLE(); } } -void QmlSettingsGenerator::writeNodePropertyDeclaration(const SettingsGeneratorBase::NodeType &entry, int classIndex, QList> &childConstructs, const QString &overwriteName) +void QmlSettingsGenerator::writeNodePropertyDeclaration(const NodeType &entry, int classIndex, QList> &childConstructs, const QString &overwriteName) { const auto &mName = overwriteName.isNull() ? entry.key : overwriteName; _hdr << "\tQ_PROPERTY(" << _name << "_" << classIndex << "* " << mName - << " MEMBER _" << mName << " CONSTANT)\n"; - _hdr << "\t" << _name << "_" << classIndex << "* _" << mName << ";\n\n"; + << " MEMBER _" << mName << " CONSTANT)\n" + << "\t" << _name << "_" << classIndex << "* _" << mName << ";\n\n"; childConstructs.append({mName, classIndex}); } -void QmlSettingsGenerator::writeEntryPropertyDeclaration(const SettingsGeneratorBase::EntryType &entry, QStringList keyList, int classIndex, QList> &childConstructs) +void QmlSettingsGenerator::writeEntryPropertyDeclaration(const EntryType &entry, QStringList keyList, int classIndex, QList> &childConstructs) { keyList.append(entry.key); const auto &mType = _typeMappings.value(entry.type, entry.type); @@ -261,9 +289,9 @@ void QmlSettingsGenerator::writeEntryPropertyDeclaration(const SettingsGenerator << " NOTIFY " << entry.key << "_changed)\n"; _hdr << "\t" << mType << " get_" << entry.key << "() const { return _settings->" << keyList.join(QLatin1Char('.')) << ".get(); }\n" - << "\tvoid set_" << entry.key << "(const " << mType << "& value) { _settings->" << keyList.join(QLatin1Char('.')) << ".set(value); }\n" + << "\tvoid set_" << entry.key << "(const " << mType << " &value) { _settings->" << keyList.join(QLatin1Char('.')) << ".set(value); }\n" << "Q_SIGNALS:\n" - << "\tvoid " << entry.key << "_changed();\n" + << "\tvoid " << entry.key << "_changed(const " << mType << " &value);\n" << "private:\n\n"; } @@ -271,12 +299,77 @@ void QmlSettingsGenerator::writeEntryPropertyDeclaration(const SettingsGenerator writeNodePropertyDeclaration(entry, classIndex, childConstructs, entry.qmlGroupKey.value_or(entry.key + QStringLiteral("Group"))); } -void QmlSettingsGenerator::writeSource(const SettingsGeneratorBase::SettingsType &settings) +void QmlSettingsGenerator::writeListEntryPropertyDeclaration(const ListEntryType &entry, QStringList keyList, int listIndex, int classIndex, QList> &childConstructs) { - _src << "#include \"" << _hdrFile.fileName() << "\"\n\n"; + keyList.append(entry.key); + _hdr << "\tQ_PROPERTY(QQmlListProperty<" << _name << "_" << listIndex << "> " << entry.key + << " READ get_" << entry.key << " CONSTANT)\n" + << "\t" << _name << "_" << listIndex << "::ListData<" << _name << "_" << listIndex << "> _" << entry.key << ";\n" + << "\tQQmlListProperty<" << _name << "_" << listIndex << "> get_" << entry.key << "() {\n" + << "\t\treturn {\n" + << "\t\t\tthis, &_" << entry.key << ",\n" + << "\t\t\t&" << _name << "_" << listIndex << "::append<" << _name << "_" << listIndex << ">,\n" + << "\t\t\t&" << _name << "_" << listIndex << "::count<" << _name << "_" << listIndex << ">,\n" + << "\t\t\t&" << _name << "_" << listIndex << "::at<" << _name << "_" << listIndex << ">,\n" + << "\t\t\t&" << _name << "_" << listIndex << "::clear<" << _name << "_" << listIndex << ">\n" + << "\t\t};\n" + << "\t}\n\n"; - _src << "QtMvvm::ISettingsAccessor *" << settings.name.value() << "::accessor() const\n" - << "{\n" - << "\treturn _accessor;\n" - << "}\n\n"; + childConstructs.append({entry.key, -1}); + + if(!entry.contentNodes.isEmpty()) + writeNodePropertyDeclaration(entry, classIndex, childConstructs, entry.qmlGroupKey.value_or(entry.key + QStringLiteral("Group"))); +} + +void QmlSettingsGenerator::writeMemberInits(const QStringList &keyList, const QList> &childConstructs) +{ + for(const auto &info : childConstructs) { + if(info.second < 0) + _hdr << "\t\t_" << info.first << "{settings->" << (QStringList{keyList} << info.first).join(QLatin1Char('.')) << ", {}},\n"; + else + _hdr << "\t\t_" << info.first << "{new " << _name << "_" << info.second << "{settings, this}},\n"; + } +} + +void QmlSettingsGenerator::writeEntryPropertySignalConnects(const NodeContentGroup &node, const QStringList &keyList, int classIndex, QList &listEntries) +{ + for(const auto &cNode : node.contentNodes) { + if(nonstd::holds_alternative(cNode)) + continue; //nothing to be set + else if(nonstd::holds_alternative(cNode)) + writeEntryPropertySignalConnect(nonstd::get(cNode), keyList, classIndex); + else if(nonstd::holds_alternative(cNode)) + writeListEntryPropertySignalConnect(nonstd::get(cNode), keyList, listEntries); + else if(nonstd::holds_alternative(cNode)) + writeEntryPropertySignalConnects(nonstd::get(cNode), keyList, classIndex, listEntries); + else + Q_UNREACHABLE(); + } +} + +void QmlSettingsGenerator::writeEntryPropertySignalConnect(const EntryType &entry, QStringList keyList, int classIndex) +{ + if(_typeMappings.value(entry.type, entry.type) == QStringLiteral("void")) + return; + keyList.append(entry.key); + _hdr << "\t\t_settings->" << keyList.join(QLatin1Char('.')) + << ".addChangeCallback(this, std::bind(&" << _name; + if(classIndex >= 0) + _hdr << "_" << classIndex; + _hdr << "::" << entry.key << "_changed, this, std::placeholders::_1));\n"; +} + +void QmlSettingsGenerator::writeListEntryPropertySignalConnect(const SettingsGeneratorBase::ListEntryType &entry, QStringList keyList, QList &listEntries) +{ + auto classIndex = listEntries.takeFirst(); + keyList.append(entry.key); + _hdr << "\t\t_settings->" << keyList.join(QLatin1Char('.')) + << ".addSizeChangeCallback(this, std::bind(&" + << _name << "_" << classIndex << "::adjust<" << _name << "_" << classIndex + << ">, &_" << entry.key << ", this, std::placeholders::_1));\n"; +} + +void QmlSettingsGenerator::writeSource(const SettingsType &settings) +{ + _src << "#include \"" << _hdrFile.fileName() << "\"\n\n"; } diff --git a/tools/settingsgenerator/qmlsettingsgenerator.h b/tools/settingsgenerator/qmlsettingsgenerator.h index aec06fb..4eb9495 100644 --- a/tools/settingsgenerator/qmlsettingsgenerator.h +++ b/tools/settingsgenerator/qmlsettingsgenerator.h @@ -26,15 +26,25 @@ private: void writeHeader(const SettingsType &settings, const QString &inHdrPath); - void writeListTypeBaseClass(const SettingsType &settings); + void writeListTypeBaseClass(); std::tuple> writeNodeContentClassesDeclarations(const NodeContentGroup &node, const QStringList &keyList, int offset = 0); - int writeNodeClassDeclaration(const NodeType &node, const QStringList &keyList, int offset); - int writeListEntryListClass(const ListEntryType &entry, QStringList keyList, int offset); - - void writeNodeClassPropertiesDeclarations(const NodeContentGroup &node, const QStringList &keyList, QList &childOffsets, QList> &childConstructs); + int writeNodeClassDeclaration(const NodeType &node, QStringList keyList, int offset); + int writeListEntryListClass(const ListEntryType &entry, int offset); + + void writeNodeClassPropertiesDeclarations(const NodeContentGroup &node, + const QStringList &keyList, + QList &childOffsets, + QList &listEntries, + QList> &childConstructs); void writeNodePropertyDeclaration(const NodeType &entry, int classIndex, QList> &childConstructs, const QString &overwriteName = {}); void writeEntryPropertyDeclaration(const EntryType &entry, QStringList keyList, int classIndex, QList> &childConstructs); + void writeListEntryPropertyDeclaration(const ListEntryType &entry, QStringList keyList, int listIndex, int classIndex, QList> &childConstructs); + + void writeMemberInits(const QStringList &keyList, const QList> &childConstructs); + void writeEntryPropertySignalConnects(const NodeContentGroup &node, const QStringList &keyList, int classIndex, QList &listEntries); + void writeEntryPropertySignalConnect(const EntryType &entry, QStringList keyList, int classIndex); + void writeListEntryPropertySignalConnect(const ListEntryType &entry, QStringList keyList, QList &listEntries); void writeSource(const SettingsType &settings); };