diff --git a/tools/settingsgenerator/main.cpp b/tools/settingsgenerator/main.cpp
index df1226c..cebd1b6 100644
--- a/tools/settingsgenerator/main.cpp
+++ b/tools/settingsgenerator/main.cpp
@@ -49,8 +49,8 @@ int main(int argc, char *argv[])
};
generator.process(parser.value(QStringLiteral("in")));
return EXIT_SUCCESS;
- } catch (const QString &str) {
- qCritical() << qUtf8Printable(str);
+ } catch (const QException &e) {
+ qCritical() << e.what();
return EXIT_FAILURE;
}
}
diff --git a/tools/settingsgenerator/qsettingsgenerator.xsd b/tools/settingsgenerator/qsettingsgenerator.xsd
index b7d844c..9740ad3 100644
--- a/tools/settingsgenerator/qsettingsgenerator.xsd
+++ b/tools/settingsgenerator/qsettingsgenerator.xsd
@@ -7,24 +7,25 @@
QtCore/QHash
+
-
+
-
+
@@ -56,10 +57,10 @@
-
-
-
-
+
+
+
+
diff --git a/tools/settingsgenerator/settingsgenerator.cpp b/tools/settingsgenerator/settingsgenerator.cpp
index a3a1540..9a1946e 100644
--- a/tools/settingsgenerator/settingsgenerator.cpp
+++ b/tools/settingsgenerator/settingsgenerator.cpp
@@ -37,6 +37,58 @@ bool SettingsGenerator::read_type_mapping(QXmlStreamReader &reader, QHash(reader.device())) {
+ QFileInfo docInfo{static_cast(reader.device())->fileName()};
+ import.importPath = docInfo.dir().absoluteFilePath(import.importPath);
+ }
+
+ // read the document
+ try {
+ auto settings = readDocument(import.importPath);
+ NodeContentGroup *cGrp = &settings;
+ if(import.rootNode) {
+ for(const auto &key : import.rootNode.value().split(QLatin1Char('/'), QString::SkipEmptyParts)) {
+ cGrp = findContentGroup(cGrp, key);
+ if(!cGrp)
+ return;
+ }
+ }
+ data = *cGrp;
+ } catch(QException &e) {
+ if(import.required)
+ throw;
+ else {
+ qWarning() << e.what();
+ return;
+ }
+ }
+}
+
+SettingsGeneratorBase::NodeContentGroup *SettingsGenerator::findContentGroup(SettingsGeneratorBase::NodeContentGroup *cGrp, const QString &key)
+{
+ for(const auto &cNode : cGrp->contentNodes) {
+ if(nonstd::holds_alternative(cNode)) {
+ if(std::get(cNode).key == key)
+ return const_cast(&(std::get(cNode)));
+ } else if(nonstd::holds_alternative(cNode)) {
+ if(std::get(cNode).key == key)
+ return const_cast(&(std::get(cNode)));
+ } else if(nonstd::holds_alternative(cNode)) {
+ auto res = findContentGroup(const_cast(&(std::get(cNode))), key);
+ if(res)
+ return res;
+ }
+ }
+
+ return nullptr;
+}
+
void SettingsGenerator::writeHeader(const SettingsType &settings)
{
QString incGuard = QFileInfo{_hdrFile.fileName()}
@@ -49,9 +101,9 @@ void SettingsGenerator::writeHeader(const SettingsType &settings)
// write the includes
for(const auto &inc : settings.includes) {
if(inc.local)
- _hdr << "#include \"" << inc.include << "\"\n";
+ _hdr << "#include \"" << inc.includePath << "\"\n";
else
- _hdr << "#include <" << inc.include << ">\n";
+ _hdr << "#include <" << inc.includePath << ">\n";
}
_hdr << "\n";
@@ -77,10 +129,14 @@ void SettingsGenerator::writeHeader(const SettingsType &settings)
void SettingsGenerator::writeNodeElements(const NodeContentGroup &node, int intendent)
{
- for(const auto &cNode : node.nodes)
- writeNode(cNode, intendent);
- for(const auto &cEntry : node.entries)
- writeEntry(cEntry, intendent);
+ for(const auto &cNode : node.contentNodes) {
+ if(nonstd::holds_alternative(cNode))
+ writeNode(nonstd::get(cNode), intendent);
+ else if(nonstd::holds_alternative(cNode))
+ writeEntry(nonstd::get(cNode), intendent);
+ else if(nonstd::holds_alternative(cNode))
+ writeNodeElements(nonstd::get(cNode), intendent);
+ }
}
void SettingsGenerator::writeNode(const NodeType &node, int intendent)
diff --git a/tools/settingsgenerator/settingsgenerator.h b/tools/settingsgenerator/settingsgenerator.h
index 1d5c5b6..9d897b5 100644
--- a/tools/settingsgenerator/settingsgenerator.h
+++ b/tools/settingsgenerator/settingsgenerator.h
@@ -16,6 +16,7 @@ public:
protected:
bool read_type_mapping(QXmlStreamReader &reader, QHash &data, bool hasNext) override;
+ void read_included_file(QXmlStreamReader &reader, NodeContentGroup &data) override;
private:
QFile _hdrFile;
@@ -24,6 +25,8 @@ private:
QTextStream _hdr;
QTextStream _src;
+ NodeContentGroup *findContentGroup(NodeContentGroup *cGrp, const QString &key);
+
void writeHeader(const SettingsType &settings);
void writeNodeElements(const NodeContentGroup &node, int intendent = 1);
void writeNode(const NodeType &node, int intendent = 1);