ObjectTypes ObjectTypesReader::readObjectTypes(const QString &fileName) { mError.clear(); ObjectTypes objectTypes; QFile file(fileName); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { mError = QCoreApplication::translate( "ObjectTypes", "Could not open file."); return objectTypes; } QXmlStreamReader reader(&file); if (!reader.readNextStartElement() || reader.name() != QLatin1String("objecttypes")) { mError = QCoreApplication::translate( "ObjectTypes", "File doesn't contain object types."); return objectTypes; } while (reader.readNextStartElement()) { if (reader.name() == QLatin1String("objecttype")) { const QXmlStreamAttributes atts = reader.attributes(); const QString name(atts.value(QLatin1String("name")).toString()); const QColor color(atts.value(QLatin1String("color")).toString()); objectTypes.append(ObjectType(name, color)); } reader.skipCurrentElement(); } if (reader.hasError()) { mError = QCoreApplication::translate("ObjectTypes", "%3\n\nLine %1, column %2") .arg(reader.lineNumber()) .arg(reader.columnNumber()) .arg(reader.errorString()); return objectTypes; } return objectTypes; }
void ObjectTypesEditor::importObjectTypes() { Preferences *prefs = Preferences::instance(); const QString lastPath = prefs->lastPath(Preferences::ObjectTypesFile); const QString fileName = QFileDialog::getOpenFileName(this, tr("Import Object Types"), lastPath, tr("Object Types files (*.xml *.json)")); if (fileName.isEmpty()) return; prefs->setLastPath(Preferences::ObjectTypesFile, fileName); ObjectTypesSerializer serializer; ObjectTypes objectTypes; if (serializer.readObjectTypes(fileName, objectTypes)) { ObjectTypes currentTypes = mObjectTypesModel->objectTypes(); for (const ObjectType &type : objectTypes) { auto it = std::find_if(currentTypes.begin(), currentTypes.end(), [&type](ObjectType &existingType) { return existingType.name == type.name; }); if (it != currentTypes.end()) { it->color = type.color; it->defaultProperties.merge(type.defaultProperties); } else { currentTypes.append(type); } } mObjectTypesModel->setObjectTypes(currentTypes); } else { QMessageBox::critical(this, tr("Error Reading Object Types"), serializer.errorString()); } applyObjectTypes(); }