diff --git a/Element.cpp b/Element.cpp index 25cec14..f99763e 100644 --- a/Element.cpp +++ b/Element.cpp @@ -40,90 +40,3 @@ Element::Element(uid id, UidAllocator* allocator) : _name(""), _isLocked(false), Element::~Element() { _allocator->free(_id); } - - -void Element::read(const QDomElement& obj) -{ - QList attributeNames = _propertiesAttributes(); - - // Fill up properties. - int count = metaObject()->propertyCount(); - for (int i=0; iproperty(i); - - // If property is writable, try to find it and rewrite it. - if (property.isWritable()) - { - // Name of property. - const char* propertyName = property.name(); - - // Always ignore objectName default property. - if (QString(propertyName) == QString("objectName")) - continue; - - // Check in attributes. - else if (attributeNames.contains(propertyName)) - { - if (obj.hasAttribute(propertyName)) - setProperty(propertyName, obj.attribute(propertyName)); - } - - // Check in children. - else - { - // Find element. - QDomElement propertyElem = obj.firstChildElement(propertyName); - if (!propertyElem.isNull()) - { - // Set property. - setProperty(propertyName, propertyElem.text()); - } - } - } - } -} - -void Element::write(QDomElement& obj) -{ - QList attributeNames = _propertiesAttributes(); - - // Write up classname. - obj.setAttribute("className", metaObject()->className()); - - // Fill up properties. - int count = metaObject()->propertyCount(); - for (int i=0; iproperty(i); - - // If property is writable, try to find it and rewrite it. - if (property.isWritable() && property.isReadable()) - { - // Name of property. - const char* propertyName = property.name(); - qDebug() << "Read " << propertyName << " : " << property.read(this) << endl; - QString propertyValue = property.read(this).toString(); - - // Add to attributes. - if (attributeNames.contains(propertyName)) - { - obj.setAttribute(propertyName, propertyValue); - } - - // Add to children. - else - { - QDomElement propertyNode = obj.ownerDocument().createElement(propertyName); - QDomText text = obj.ownerDocument().createTextNode(propertyValue); - propertyNode.appendChild(text); - obj.appendChild(propertyNode); - } - } - } -} - -QList Element::_propertiesAttributes() const -{ - return QList() << "name" << "locked"; -} diff --git a/Element.h b/Element.h index 5c6aa5f..ddb280d 100644 --- a/Element.h +++ b/Element.h @@ -24,14 +24,12 @@ #include #include -#include -#include - +#include "Serializable.h" #include "UidAllocator.h" Q_DECLARE_METATYPE(uid) -class Element : public QObject +class Element : public Serializable { Q_OBJECT @@ -64,11 +62,9 @@ public: virtual QIcon getIcon() const { return QIcon(); } - virtual void read(const QDomElement& obj); - virtual void write(QDomElement& obj); - protected: - virtual QList _propertiesAttributes() const; + virtual QList _propertiesAttributes() const + { return Serializable::_propertiesAttributes() << "name" << "locked"; } private: uid _id; diff --git a/Serializable.cpp b/Serializable.cpp new file mode 100644 index 0000000..0186133 --- /dev/null +++ b/Serializable.cpp @@ -0,0 +1,110 @@ +/* + * Serializable.cpp + * + * (c) 2016 Sofian Audry -- info(@)sofianaudry(.)com + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "Serializable.h" + +void Serializable::read(const QDomElement& obj) +{ + QList attributeNames = _propertiesAttributes(); + + // Fill up properties. + int count = metaObject()->propertyCount(); + for (int i=0; iproperty(i); + + // If property is writable, try to find it and rewrite it. + if (property.isWritable()) + { + // Name of property. + const char* propertyName = property.name(); + + // Always ignore objectName default property. + if (QString(propertyName) == QString("objectName")) + continue; + + // Check in attributes. + else if (attributeNames.contains(propertyName)) + { + if (obj.hasAttribute(propertyName)) + setProperty(propertyName, obj.attribute(propertyName)); + } + + // Check in children. + else + { + // Find element. + QDomElement propertyElem = obj.firstChildElement(propertyName); + if (!propertyElem.isNull()) + { + // Set property. + setProperty(propertyName, propertyElem.text()); + } + } + } + } +} + +void Serializable::write(QDomElement& obj) +{ + QList attributeNames = _propertiesAttributes(); + + // Write up classname. + obj.setAttribute("className", metaObject()->className()); + + // Fill up properties. + int count = metaObject()->propertyCount(); + for (int i=0; iproperty(i); + + // Don't save unstored properties. + if (!property.isStored(this)) + continue; + + // If property is writable, try to find it and rewrite it. + if (property.isWritable() && property.isReadable()) + { + // Name of property. + const char* propertyName = property.name(); + qDebug() << "Read " << propertyName << " : " << property.read(this) << endl; + QString propertyValue = property.read(this).toString(); + + // Always ignore objectName default property. + if (QString(propertyName) == QString("objectName")) + continue; + + // Add to attributes. + if (attributeNames.contains(propertyName)) + { + obj.setAttribute(propertyName, propertyValue); + } + + // Add to children. + else + { + QDomElement propertyNode = obj.ownerDocument().createElement(propertyName); + QDomText text = obj.ownerDocument().createTextNode(propertyValue); + propertyNode.appendChild(text); + obj.appendChild(propertyNode); + } + } + } +} + diff --git a/Serializable.h b/Serializable.h new file mode 100644 index 0000000..36e948a --- /dev/null +++ b/Serializable.h @@ -0,0 +1,45 @@ +/* + * Serializable.h + * + * (c) 2016 Sofian Audry -- info(@)sofianaudry(.)com + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef SERIALIZABLE_H_ +#define SERIALIZABLE_H_ + +#include +#include +#include +#include + +class Serializable : public QObject { + Q_OBJECT + +protected: + Serializable() {} + +public: + virtual ~Serializable() {} + + virtual void read(const QDomElement& obj); + virtual void write(QDomElement& obj); + +protected: + // Lists QProperties that should be represented as XML attributes, not as childen nodes. + virtual QList _propertiesAttributes() const { return QList(); } +}; + +#endif /* SERIALIZABLE_H_ */ diff --git a/mapmap.pro b/mapmap.pro index 0f51763..630d8f2 100644 --- a/mapmap.pro +++ b/mapmap.pro @@ -33,6 +33,7 @@ HEADERS = \ ProjectReader.h \ ProjectWriter.h \ Quad.h \ + Serializable.h \ Shape.h \ Shapes.h \ ShapeControlPainter.h \ @@ -67,6 +68,7 @@ SOURCES = \ PreferencesDialog.cpp \ ProjectReader.cpp \ ProjectWriter.cpp \ + Serializable.cpp \ Shape.cpp \ ShapeControlPainter.cpp \ ShapeGraphicsItem.cpp \