Moved base read/write functions to Serializable class (to give functionality to MShape).

This commit is contained in:
Tats
2016-01-21 21:57:01 -05:00
parent b9f2c80a19
commit 21cceff534
5 changed files with 161 additions and 95 deletions
-87
View File
@@ -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<QString> attributeNames = _propertiesAttributes();
// Fill up properties.
int count = metaObject()->propertyCount();
for (int i=0; i<count; ++i) {
// Get property/tag.
QMetaProperty property = metaObject()->property(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<QString> attributeNames = _propertiesAttributes();
// Write up classname.
obj.setAttribute("className", metaObject()->className());
// Fill up properties.
int count = metaObject()->propertyCount();
for (int i=0; i<count; ++i) {
// Get property/tag.
QMetaProperty property = metaObject()->property(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<QString> Element::_propertiesAttributes() const
{
return QList<QString>() << "name" << "locked";
}
+4 -8
View File
@@ -24,14 +24,12 @@
#include <QObject>
#include <QIcon>
#include <QDomDocument>
#include <QMetaProperty>
#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<QString> _propertiesAttributes() const;
virtual QList<QString> _propertiesAttributes() const
{ return Serializable::_propertiesAttributes() << "name" << "locked"; }
private:
uid _id;
+110
View File
@@ -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 <http://www.gnu.org/licenses/>.
*/
#include "Serializable.h"
void Serializable::read(const QDomElement& obj)
{
QList<QString> attributeNames = _propertiesAttributes();
// Fill up properties.
int count = metaObject()->propertyCount();
for (int i=0; i<count; ++i) {
// Get property/tag.
QMetaProperty property = metaObject()->property(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<QString> attributeNames = _propertiesAttributes();
// Write up classname.
obj.setAttribute("className", metaObject()->className());
// Fill up properties.
int count = metaObject()->propertyCount();
for (int i=0; i<count; ++i) {
// Get property/tag.
QMetaProperty property = metaObject()->property(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);
}
}
}
}
+45
View File
@@ -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 <http://www.gnu.org/licenses/>.
*/
#ifndef SERIALIZABLE_H_
#define SERIALIZABLE_H_
#include <QObject>
#include <QDomDocument>
#include <QMetaProperty>
#include <QDebug>
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<QString> _propertiesAttributes() const { return QList<QString>(); }
};
#endif /* SERIALIZABLE_H_ */
+2
View File
@@ -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 \