Browse Source

added support for (same class) imports

pull/2/head
Skycoder42 7 years ago
parent
commit
8c6ac409b5
No known key found for this signature in database GPG Key ID: 8E01AD9EF0578D2B
  1. 4
      tools/settingsgenerator/main.cpp
  2. 17
      tools/settingsgenerator/qsettingsgenerator.xsd
  3. 68
      tools/settingsgenerator/settingsgenerator.cpp
  4. 3
      tools/settingsgenerator/settingsgenerator.h

4
tools/settingsgenerator/main.cpp

@ -49,8 +49,8 @@ int main(int argc, char *argv[])
}; };
generator.process(parser.value(QStringLiteral("in"))); generator.process(parser.value(QStringLiteral("in")));
return EXIT_SUCCESS; return EXIT_SUCCESS;
} catch (const QString &str) { } catch (const QException &e) {
qCritical() << qUtf8Printable(str); qCritical() << e.what();
return EXIT_FAILURE; return EXIT_FAILURE;
} }
} }

17
tools/settingsgenerator/qsettingsgenerator.xsd

@ -7,24 +7,25 @@
<qxg:include>QtCore/QHash</qxg:include> <qxg:include>QtCore/QHash</qxg:include>
</qxg:config> </qxg:config>
<qxg:method name="read_type_mapping" type="QHash&lt;QString, QString&gt;" asGroup="true"/> <qxg:method name="read_type_mapping" type="QHash&lt;QString, QString&gt;" asGroup="true"/>
<qxg:method name="read_included_file" type="NodeContentGroup"/>
<!-- Type definitions --> <!-- Type definitions -->
<xs:complexType name="IncludeType"> <xs:complexType name="IncludeType">
<xs:simpleContent> <xs:simpleContent>
<xs:extension base="xs:string" qxg:member="include"> <xs:extension base="xs:string" qxg:member="includePath">
<xs:attribute default="false" name="local" type="xs:boolean" use="optional"/> <xs:attribute default="false" name="local" type="xs:boolean" use="optional"/>
</xs:extension> </xs:extension>
</xs:simpleContent> </xs:simpleContent>
</xs:complexType> </xs:complexType>
<!--xs:complexType name="Import"> <xs:complexType name="ImportType">
<xs:simpleContent> <xs:simpleContent>
<xs:extension base="xs:string"> <xs:extension base="xs:string" qxg:member="importPath">
<xs:attribute default="true" name="required" type="xs:boolean" use="optional"/> <xs:attribute default="true" name="required" type="xs:boolean" use="optional"/>
<xs:attribute name="rootNode" type="xs:string" use="optional"/> <xs:attribute name="rootNode" type="xs:string" use="optional"/>
</xs:extension> </xs:extension>
</xs:simpleContent> </xs:simpleContent>
</xs:complexType--> </xs:complexType>
<xs:complexType name="TypeMappingEntry"> <xs:complexType name="TypeMappingEntry">
<xs:attribute name="key" type="xs:string" use="required"/> <xs:attribute name="key" type="xs:string" use="required"/>
@ -56,10 +57,10 @@
<xs:group name="NodeContentGroup"> <xs:group name="NodeContentGroup">
<xs:sequence> <xs:sequence>
<xs:choice maxOccurs="unbounded" minOccurs="0" qxg:unordered="true"> <xs:choice maxOccurs="unbounded" minOccurs="0" qxg:member="contentNodes">
<xs:element name="Node" type="NodeType" qxg:member="nodes"/> <xs:element name="Node" type="NodeType"/>
<xs:element name="Entry" type="EntryType" qxg:member="entries"/> <xs:element name="Entry" type="EntryType"/>
<!--xs:element name="Import" type="Import"/--> <xs:element name="Import" type="ImportType" qxg:method="read_included_file" qxg:methodType="NodeContentGroup"/>
</xs:choice> </xs:choice>
</xs:sequence> </xs:sequence>
</xs:group> </xs:group>

68
tools/settingsgenerator/settingsgenerator.cpp

@ -37,6 +37,58 @@ bool SettingsGenerator::read_type_mapping(QXmlStreamReader &reader, QHash<QStrin
return hasNext; return hasNext;
} }
void SettingsGenerator::read_included_file(QXmlStreamReader &reader, NodeContentGroup &data)
{
ImportType import;
read_ImportType(reader, import);
//make the path relative if possbile
if(dynamic_cast<QFileDevice*>(reader.device())) {
QFileInfo docInfo{static_cast<QFileDevice*>(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<NodeType>(cNode)) {
if(std::get<NodeType>(cNode).key == key)
return const_cast<NodeType*>(&(std::get<NodeType>(cNode)));
} else if(nonstd::holds_alternative<EntryType>(cNode)) {
if(std::get<EntryType>(cNode).key == key)
return const_cast<EntryType*>(&(std::get<EntryType>(cNode)));
} else if(nonstd::holds_alternative<NodeContentGroup>(cNode)) {
auto res = findContentGroup(const_cast<NodeContentGroup*>(&(std::get<NodeContentGroup>(cNode))), key);
if(res)
return res;
}
}
return nullptr;
}
void SettingsGenerator::writeHeader(const SettingsType &settings) void SettingsGenerator::writeHeader(const SettingsType &settings)
{ {
QString incGuard = QFileInfo{_hdrFile.fileName()} QString incGuard = QFileInfo{_hdrFile.fileName()}
@ -49,9 +101,9 @@ void SettingsGenerator::writeHeader(const SettingsType &settings)
// write the includes // write the includes
for(const auto &inc : settings.includes) { for(const auto &inc : settings.includes) {
if(inc.local) if(inc.local)
_hdr << "#include \"" << inc.include << "\"\n"; _hdr << "#include \"" << inc.includePath << "\"\n";
else else
_hdr << "#include <" << inc.include << ">\n"; _hdr << "#include <" << inc.includePath << ">\n";
} }
_hdr << "\n"; _hdr << "\n";
@ -77,10 +129,14 @@ void SettingsGenerator::writeHeader(const SettingsType &settings)
void SettingsGenerator::writeNodeElements(const NodeContentGroup &node, int intendent) void SettingsGenerator::writeNodeElements(const NodeContentGroup &node, int intendent)
{ {
for(const auto &cNode : node.nodes) for(const auto &cNode : node.contentNodes) {
writeNode(cNode, intendent); if(nonstd::holds_alternative<NodeType>(cNode))
for(const auto &cEntry : node.entries) writeNode(nonstd::get<NodeType>(cNode), intendent);
writeEntry(cEntry, intendent); else if(nonstd::holds_alternative<EntryType>(cNode))
writeEntry(nonstd::get<EntryType>(cNode), intendent);
else if(nonstd::holds_alternative<NodeContentGroup>(cNode))
writeNodeElements(nonstd::get<NodeContentGroup>(cNode), intendent);
}
} }
void SettingsGenerator::writeNode(const NodeType &node, int intendent) void SettingsGenerator::writeNode(const NodeType &node, int intendent)

3
tools/settingsgenerator/settingsgenerator.h

@ -16,6 +16,7 @@ public:
protected: protected:
bool read_type_mapping(QXmlStreamReader &reader, QHash<QString, QString> &data, bool hasNext) override; bool read_type_mapping(QXmlStreamReader &reader, QHash<QString, QString> &data, bool hasNext) override;
void read_included_file(QXmlStreamReader &reader, NodeContentGroup &data) override;
private: private:
QFile _hdrFile; QFile _hdrFile;
@ -24,6 +25,8 @@ private:
QTextStream _hdr; QTextStream _hdr;
QTextStream _src; QTextStream _src;
NodeContentGroup *findContentGroup(NodeContentGroup *cGrp, const QString &key);
void writeHeader(const SettingsType &settings); void writeHeader(const SettingsType &settings);
void writeNodeElements(const NodeContentGroup &node, int intendent = 1); void writeNodeElements(const NodeContentGroup &node, int intendent = 1);
void writeNode(const NodeType &node, int intendent = 1); void writeNode(const NodeType &node, int intendent = 1);

Loading…
Cancel
Save