diff --git a/MM.cpp b/MM.cpp index 9881fdd..a67ece6 100644 --- a/MM.cpp +++ b/MM.cpp @@ -29,6 +29,7 @@ const QString MM::ORGANIZATION_DOMAIN = "mapmap.info"; const QString MM::FILE_EXTENSION = "mmp"; const QString MM::VIDEO_FILES_FILTER = "*.mov *.mp4 *.avi *.ogg *.ogv *.mpeg *.mpeg1 *.mpeg4 *.mpg *.mpg2 *.mp2 *.mjpq *.mjp *.wmv *sock"; const QString MM::IMAGE_FILES_FILTER = "*.jpg *.jpeg *.gif *.png *.tiff *.tif *.bmp"; +const QString MM::NAMESPACE_PREFIX = QString("%1::").arg(TOSTRING(MM_NAMESPACE)); const QColor MM::WHITE("#f6f5f5"); const QColor MM::BLUE_GRAY("#323541"); diff --git a/MM.h b/MM.h index 0579b4d..3a9a8f1 100644 --- a/MM.h +++ b/MM.h @@ -36,6 +36,9 @@ MM_BEGIN_NAMESPACE class name; MM_END_NAMESPACE \ using MM_PREPEND_NAMESPACE(name); +#define STRINGIFY(x) #x +#define TOSTRING(x) STRINGIFY(x) + MM_BEGIN_NAMESPACE /** @@ -54,6 +57,7 @@ public: static const QString FILE_EXTENSION; static const QString VIDEO_FILES_FILTER; static const QString IMAGE_FILES_FILTER; + static const QString NAMESPACE_PREFIX; // GUI. static const int DEFAULT_WINDOW_WIDTH = 640; diff --git a/Mapping.cpp b/Mapping.cpp index a58ec83..7779e14 100644 --- a/Mapping.cpp +++ b/Mapping.cpp @@ -128,7 +128,7 @@ void Mapping::_readShape(const QDomElement& obj, bool isOutput) QDomElement shapeObj = obj.firstChildElement(tag); - QString className = shapeObj.attribute(ProjectLabels::CLASS_NAME); + QString className = Serializable::classNameCleanToReal(shapeObj.attribute(ProjectLabels::CLASS_NAME)); const QMetaObject* metaObject = MetaObjectRegistry::instance().getMetaObject(className); if (metaObject) diff --git a/ProjectReader.cpp b/ProjectReader.cpp index 8c20180..a8a673a 100644 --- a/ProjectReader.cpp +++ b/ProjectReader.cpp @@ -112,7 +112,7 @@ void ProjectReader::parseProject(const QDomElement& project) Paint::ptr ProjectReader::parsePaint(const QDomElement& paintElem) { - QString className = paintElem.attribute(ProjectLabels::CLASS_NAME); + QString className = Serializable::classNameCleanToReal(paintElem.attribute(ProjectLabels::CLASS_NAME)); int id = paintElem.attribute(ProjectLabels::ID, QString::number(NULL_UID)).toInt(); qDebug() << "Found paint with classname: " << className << endl; @@ -145,7 +145,7 @@ Paint::ptr ProjectReader::parsePaint(const QDomElement& paintElem) Mapping::ptr ProjectReader::parseMapping(const QDomElement& mappingElem) { // Get attributes. - QString className = mappingElem.attribute(ProjectLabels::CLASS_NAME); + QString className = Serializable::classNameCleanToReal(mappingElem.attribute(ProjectLabels::CLASS_NAME)); int id = mappingElem.attribute(ProjectLabels::ID, QString::number(NULL_UID)).toInt(); const QMetaObject* metaObject = MetaObjectRegistry::instance().getMetaObject(className); diff --git a/Serializable.cpp b/Serializable.cpp index e6e139c..095fb09 100644 --- a/Serializable.cpp +++ b/Serializable.cpp @@ -21,6 +21,24 @@ MM_BEGIN_NAMESPACE +QString Serializable::cleanClassName() const +{ + return classNameRealToClean(metaObject()->className()); +} + +QString Serializable::classNameRealToClean(const QString& realClassName) +{ + Q_ASSERT(realClassName.startsWith(MM::NAMESPACE_PREFIX)); + // Removes the NAMESPACE:: prefix. + return realClassName.right( realClassName.size() - MM::NAMESPACE_PREFIX.size() ); +} + +QString Serializable::classNameCleanToReal(const QString& cleanClassName) +{ + Q_ASSERT(!cleanClassName.startsWith(MM::NAMESPACE_PREFIX)); + return MM::NAMESPACE_PREFIX + cleanClassName; +} + void Serializable::read(const QDomElement& obj) { QList attributeNames = _propertiesAttributes(); @@ -75,7 +93,7 @@ void Serializable::write(QDomElement& obj) QList specialNames = _propertiesSpecial(); // Write up classname. - obj.setAttribute("className", metaObject()->className()); + obj.setAttribute(ProjectLabels::CLASS_NAME, cleanClassName()); // Fill up properties. int count = metaObject()->propertyCount(); diff --git a/Serializable.h b/Serializable.h index 351d5d5..59fb66e 100644 --- a/Serializable.h +++ b/Serializable.h @@ -38,6 +38,16 @@ protected: public: virtual ~Serializable() {} + /// Returns the "cleaned" classname ie. without the namespace prefix. + QString cleanClassName() const; + + /* + * Used for file loading/saving. File save uses a "clean" version of the classname that + * removes the namespace prefix (mmp::) to avoid useless repetitions in the saved file. + */ + static QString classNameRealToClean(const QString& realClassName); + static QString classNameCleanToReal(const QString& cleanClassName); + virtual void read(const QDomElement& obj); virtual void write(QDomElement& obj);