diff options
Diffstat (limited to 'src/diagramitem.cpp')
-rw-r--r-- | src/diagramitem.cpp | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/src/diagramitem.cpp b/src/diagramitem.cpp index ddb6269..bcb5e24 100644 --- a/src/diagramitem.cpp +++ b/src/diagramitem.cpp @@ -14,9 +14,98 @@ // with this program; if not, write to the Free Software Foundation, Inc., // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +#include <QMimeData> +#include <QDomProcessingInstruction> +#include <QDebug> +#include "diagramdocument.h" #include "diagramitem.h" +#include "diagramitemregistry.h" DiagramItem::DiagramItem(DiagramItem *parent) : QGraphicsItem(parent) { } + +void +DiagramItem::setId(QUuid id) +{ + m_id = id; +} + +void +DiagramItem::createId() +{ + m_id = QUuid::createUuid(); +} + +DiagramDocument * +DiagramItem::document() const +{ + return qobject_cast<DiagramDocument *>(scene()); +} + +void +DiagramItem::loadFromXml(QDomElement element, DiagramDocument *) +{ + setId(element.attribute("id", QUuid())); + QDomElement positionElement = element.firstChildElement("position"); + if (!positionElement.isNull()) { + QPoint pos; + pos.setX(positionElement.attribute("x", "0").toInt()); + pos.setY(positionElement.attribute("y", "0").toInt()); + setPos(pos); + } +} + +void +DiagramItem::saveToXml(QDomDocument doc, QDomElement element) +{ + element.setAttribute("type", typeName()); + element.setAttribute("id", id()); + QDomElement positionElement = doc.createElement("position"); + positionElement.setAttribute("x", pos().x()); + positionElement.setAttribute("y", pos().y()); + element.appendChild(positionElement); +} + +QMimeData * +DiagramItem::toMimeData() +{ + QDomDocument doc; + QDomProcessingInstruction xml = doc.createProcessingInstruction("xml", "version=\"1.0\" encoding=\"UTF-8\""); + doc.appendChild(xml); + QDomElement element = doc.createElement("item"); + doc.appendChild(element); + saveToXml(doc, element); + + QByteArray data; + QTextStream stream(&data); + doc.save(stream, 0); + + QMimeData *mimeData = new QMimeData(); + mimeData->setData("application/dbmodel.item", data); + return mimeData; +} + +DiagramItem * +DiagramItem::fromMimeData(const QMimeData *mimeData) +{ + QByteArray data = mimeData->data("application/dbmodel.item"); + if (data.isNull()) + return 0; + + QDomDocument doc; + doc.setContent(data); + + QDomElement element = doc.firstChildElement("item"); + if (element.isNull()) + return 0; + + DiagramItem *item = DiagramItemRegistry::createItem(element.attribute("type")); + if (item == NULL) + return 0; + + item->loadFromXml(element); + item->createId(); + return item; +} |