From 8c6ac409b5425c0f54a1d42c9f3092fb1b1a9d22 Mon Sep 17 00:00:00 2001 From: Skycoder42 Date: Thu, 12 Jul 2018 11:33:18 +0200 Subject: [PATCH] added support for (same class) imports --- tools/settingsgenerator/main.cpp | 4 +- .../settingsgenerator/qsettingsgenerator.xsd | 17 ++--- tools/settingsgenerator/settingsgenerator.cpp | 68 +++++++++++++++++-- tools/settingsgenerator/settingsgenerator.h | 3 + 4 files changed, 76 insertions(+), 16 deletions(-) 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);