Skip to content

Commit 101a7df

Browse files
MinyazevRiakov
authored andcommitted
Add a constant field order for separate saving of WorldModel.xml
1 parent 5c7f1aa commit 101a7df

File tree

4 files changed

+66
-65
lines changed

4 files changed

+66
-65
lines changed

plugins/robots/common/twoDModel/src/engine/view/twoDModelWidget.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -536,7 +536,7 @@ void TwoDModelWidget::saveWorldModel()
536536

537537
utils::OutFile saveFile(saveFileName);
538538
saveFile() << "<?xml version='1.0' encoding='utf-8'?>\n";
539-
saveFile() << save.toString(4);
539+
saveFile() << xmlUtils::ensureXmlFieldsOrder(save.toString(4));
540540
}
541541

542542
void TwoDModelWidget::loadWorldModel()

qrrepo/private/serializer.cpp

Lines changed: 1 addition & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -36,67 +36,6 @@ using namespace details;
3636
using namespace utils;
3737
using namespace qReal;
3838

39-
namespace {
40-
41-
QString ensureXmlFieldsOrder(const QString &xmlInput) {
42-
if (xmlInput.isEmpty()) {
43-
return {};
44-
}
45-
46-
QXmlStreamReader reader(xmlInput);
47-
QString result;
48-
QXmlStreamWriter writer(&result);
49-
writer.setAutoFormatting(false);
50-
writer.setAutoFormattingIndent(4);
51-
bool first = true;
52-
53-
while (!reader.atEnd() && !reader.hasError()) {
54-
auto token = reader.readNext();
55-
56-
switch (token) {
57-
case QXmlStreamReader::StartElement: {
58-
writer.writeStartElement(reader.name().toString());
59-
if (first) {
60-
writer.setAutoFormatting(true);
61-
first = false;
62-
}
63-
QMap<QString, QString> sortedAttrs;
64-
for (auto &&attr : reader.attributes()) {
65-
sortedAttrs.insert(attr.name().toString(), attr.value().toString());
66-
}
67-
68-
for (auto it = sortedAttrs.constBegin(); it != sortedAttrs.constEnd(); ++it) {
69-
writer.writeAttribute(it.key(), it.value());
70-
}
71-
break;
72-
}
73-
74-
case QXmlStreamReader::EndElement:
75-
writer.writeEndElement();
76-
break;
77-
78-
case QXmlStreamReader::Characters:
79-
if (!reader.isWhitespace()) {
80-
writer.writeCharacters(reader.text().toString());
81-
}
82-
break;
83-
84-
case QXmlStreamReader::Comment:
85-
writer.writeComment(reader.text().toString());
86-
break;
87-
88-
default:
89-
break;
90-
}
91-
}
92-
93-
if (reader.hasError()) {
94-
return xmlInput;
95-
}
96-
97-
return result;
98-
}
99-
}
10039
const char * const unsavedDir = "%1/unsaved/%2";
10140

10241
Serializer::Serializer(const QString &workingFile) // NOLINT(modernize-pass-by-value)
@@ -244,7 +183,7 @@ void Serializer::saveMetaInfo(QHash<QString, QVariant> const &metaInfo) const
244183
OutFile out(filePath);
245184
auto value = ValuesSerializer::serializeQVariant(metaInfo[key]);
246185
if (key == "worldModel") {
247-
out() << ensureXmlFieldsOrder(value);
186+
out() << xmlUtils::ensureXmlFieldsOrder(value);
248187
continue;
249188
}
250189
out() << ValuesSerializer::serializeQVariant(metaInfo[key]);

qrutils/xmlUtils.cpp

Lines changed: 63 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
#include <QtCore/QFile>
1818
#include <QtCore/QDebug>
19+
#include <QXmlStreamReader>
1920

2021
using namespace utils;
2122

@@ -24,19 +25,79 @@ QDomDocument xmlUtils::loadDocument(const QString &fileName, QString *errorMessa
2425
QFile file(fileName);
2526
if (!file.open(QIODevice::ReadOnly)) {
2627
qWarning() << "Cannot open" << fileName << "for reading";
27-
return QDomDocument();
28+
return {};
2829
}
2930

3031
QDomDocument doc;
3132
if (!doc.setContent(&file, false, errorMessage, errorLine, errorColumn)) {
3233
file.close();
33-
return QDomDocument();
34+
return {};
3435
}
3536

3637
file.close();
3738
return doc;
3839
}
3940

41+
QString xmlUtils::ensureXmlFieldsOrder(const QString &xmlInput)
42+
{
43+
if (xmlInput.isEmpty()) {
44+
return {};
45+
}
46+
47+
QXmlStreamReader reader(xmlInput);
48+
QString result;
49+
QXmlStreamWriter writer(&result);
50+
writer.setAutoFormatting(false);
51+
writer.setAutoFormattingIndent(4);
52+
bool first = true;
53+
54+
while (!reader.atEnd() && !reader.hasError()) {
55+
auto token = reader.readNext();
56+
57+
switch (token) {
58+
case QXmlStreamReader::StartElement: {
59+
writer.writeStartElement(reader.name().toString());
60+
if (first) {
61+
writer.setAutoFormatting(true);
62+
first = false;
63+
}
64+
QMap<QString, QString> sortedAttrs;
65+
for (auto &&attr : reader.attributes()) {
66+
sortedAttrs.insert(attr.name().toString(), attr.value().toString());
67+
}
68+
69+
for (auto it = sortedAttrs.constBegin(); it != sortedAttrs.constEnd(); ++it) {
70+
writer.writeAttribute(it.key(), it.value());
71+
}
72+
break;
73+
}
74+
75+
case QXmlStreamReader::EndElement:
76+
writer.writeEndElement();
77+
break;
78+
79+
case QXmlStreamReader::Characters:
80+
if (!reader.isWhitespace()) {
81+
writer.writeCharacters(reader.text().toString());
82+
}
83+
break;
84+
85+
case QXmlStreamReader::Comment:
86+
writer.writeComment(reader.text().toString());
87+
break;
88+
89+
default:
90+
break;
91+
}
92+
}
93+
94+
if (reader.hasError()) {
95+
return xmlInput;
96+
}
97+
98+
return result;
99+
}
100+
40101
QDomDocument xmlUtils::loadDocumentWithConversion(const QString &loadFileName
41102
, QString *errorMessage, int *errorLine, int *errorColumn)
42103
{

qrutils/xmlUtils.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ class QRUTILS_EXPORT xmlUtils
2727
, QString *errorMessage = nullptr, int *errorLine = nullptr, int *errorColumn = nullptr);
2828
static QDomDocument loadDocumentWithConversion(const QString &fileName
2929
, QString *errorMessage = nullptr, int *errorLine = nullptr, int *errorColumn = nullptr);
30+
static QString ensureXmlFieldsOrder(const QString &xmlInput);
3031
};
3132

3233
}

0 commit comments

Comments
 (0)