diff --git a/GUI/Model/Sample/ItemWithMaterial.cpp b/GUI/Model/Sample/ItemWithMaterial.cpp index 2e80fb5ee34435d830cd725c970d75a33daf02c8..db14395fa6dc64d6a32cc9ee30cdef159ba30b75 100644 --- a/GUI/Model/Sample/ItemWithMaterial.cpp +++ b/GUI/Model/Sample/ItemWithMaterial.cpp @@ -16,6 +16,15 @@ #include "Base/Util/Assert.h" #include "GUI/Model/Sample/MaterialItem.h" #include "GUI/Model/Sample/MaterialModel.h" +#include "GUI/Support/XML/UtilXML.h" + +namespace { +namespace Tag { + +const QString MaterialId("MaterialId"); + +} // namespace Tag +} ItemWithMaterial::ItemWithMaterial(const MaterialModel* materialModel) : m_materialModel(materialModel) @@ -58,3 +67,31 @@ MaterialItem* ItemWithMaterial::materialItem() const return m_materialModel->materialFromIdentifier(materialIdentifier()); } + +void ItemWithMaterial::writeTo(QXmlStreamWriter *w) const +{ + XML::writeAttribute(w, XML::Attrib::version, uint(1)); + + // material id + w->writeStartElement(Tag::MaterialId); + XML::writeAttribute(w, XML::Attrib::value, m_materialIdentifier); + w->writeEndElement(); +} + +void ItemWithMaterial::readFrom(QXmlStreamReader *r) +{ + const uint version = XML::readUIntAttribute(r, XML::Attrib::version); + Q_UNUSED(version) + + while (r->readNextStartElement()) { + QString tag = r->name().toString(); + + // material id + if (tag == Tag::MaterialId) { + XML::readAttribute(r, XML::Attrib::value, &m_materialIdentifier); + XML::gotoEndElementOfTag(r, tag); + + } else + r->skipCurrentElement(); + } +} diff --git a/GUI/Model/Sample/ItemWithMaterial.h b/GUI/Model/Sample/ItemWithMaterial.h index 1b238c0179f481c2a42889fd458d64b4dccec810..24d309d6b5c149e5092cd6b4c4c425a6390baaae 100644 --- a/GUI/Model/Sample/ItemWithMaterial.h +++ b/GUI/Model/Sample/ItemWithMaterial.h @@ -15,13 +15,14 @@ #ifndef BORNAGAIN_GUI_MODEL_SAMPLE_ITEMWITHMATERIAL_H #define BORNAGAIN_GUI_MODEL_SAMPLE_ITEMWITHMATERIAL_H +#include <QColor> #include <QString> +#include <QXmlStreamWriter> #include <functional> class Material; class MaterialItem; class MaterialModel; -class QColor; class ItemWithMaterial { public: @@ -43,6 +44,9 @@ public: //! Returns the material item this item links to. MaterialItem* materialItem() const; + virtual void writeTo(QXmlStreamWriter* w) const; + virtual void readFrom(QXmlStreamReader* r); + protected: const MaterialModel* m_materialModel; QString m_materialIdentifier; diff --git a/GUI/Model/Sample/LayerItem.cpp b/GUI/Model/Sample/LayerItem.cpp index cf29ae4345e88a0258fbfdf67398a3adaa60533e..460215d49d75a3883fc482fc0a328358635f2772 100644 --- a/GUI/Model/Sample/LayerItem.cpp +++ b/GUI/Model/Sample/LayerItem.cpp @@ -28,7 +28,7 @@ namespace Tag { const QString Name("Name"); const QString Color("Color"); -const QString MaterialId("MaterialId"); +const QString MaterialData("MaterialData"); const QString NumSlices("NumSlices"); const QString Thickness("Thickness"); const QString Roughness("Roughness"); @@ -125,6 +125,11 @@ void LayerItem::writeTo(QXmlStreamWriter* w) const { XML::writeAttribute(w, XML::Attrib::version, uint(1)); + // material data + w->writeStartElement(Tag::MaterialData); + ItemWithMaterial::writeTo(w); + w->writeEndElement(); + // name w->writeStartElement(Tag::Name); XML::writeAttribute(w, XML::Attrib::value, m_name); @@ -135,11 +140,6 @@ void LayerItem::writeTo(QXmlStreamWriter* w) const XML::writeAttribute(w, XML::Attrib::value, m_color); w->writeEndElement(); - // material id - w->writeStartElement(Tag::MaterialId); - XML::writeAttribute(w, XML::Attrib::value, m_materialIdentifier); - w->writeEndElement(); - // number of slices w->writeStartElement(Tag::NumSlices); XML::writeAttribute(w, XML::Attrib::value, m_numSlices); @@ -173,8 +173,13 @@ void LayerItem::readFrom(QXmlStreamReader* r) while (r->readNextStartElement()) { QString tag = r->name().toString(); + // material data + if (tag == Tag::MaterialData) { + ItemWithMaterial::readFrom(r); + XML::gotoEndElementOfTag(r, tag); + // name - if (tag == Tag::Name) { + } else if (tag == Tag::Name) { XML::readAttribute(r, XML::Attrib::value, &m_name); XML::gotoEndElementOfTag(r, tag); @@ -183,11 +188,6 @@ void LayerItem::readFrom(QXmlStreamReader* r) XML::readAttribute(r, XML::Attrib::value, &m_color); XML::gotoEndElementOfTag(r, tag); - // material id - } else if (tag == Tag::MaterialId) { - XML::readAttribute(r, XML::Attrib::value, &m_materialIdentifier); - XML::gotoEndElementOfTag(r, tag); - // number of slices } else if (tag == Tag::NumSlices) { XML::readAttribute(r, XML::Attrib::value, &m_numSlices); diff --git a/GUI/Model/Sample/ParticleItem.cpp b/GUI/Model/Sample/ParticleItem.cpp index aa7ae2c9a14d17b579366a5ba5fb1f97e818de5f..08ee3602365e945e1bcb0398a7dc99fafbafac38 100644 --- a/GUI/Model/Sample/ParticleItem.cpp +++ b/GUI/Model/Sample/ParticleItem.cpp @@ -26,7 +26,7 @@ namespace { namespace Tag { const QString FormFactor("FormFactor"); -const QString MaterialId("MaterialId"); +const QString MaterialData("MaterialData"); const QString BaseData("BaseData"); } // namespace Tag @@ -72,9 +72,9 @@ void ParticleItem::writeTo(QXmlStreamWriter *w) const ItemWithParticles::writeTo(w); w->writeEndElement(); - // material id - w->writeStartElement(Tag::MaterialId); - XML::writeAttribute(w, XML::Attrib::value, m_materialIdentifier); + // material data + w->writeStartElement(Tag::MaterialData); + ItemWithMaterial::writeTo(w); w->writeEndElement(); // form factor @@ -96,9 +96,9 @@ void ParticleItem::readFrom(QXmlStreamReader *r) ItemWithParticles::readFrom(r); XML::gotoEndElementOfTag(r, tag); - // material id - } else if (tag == Tag::MaterialId) { - XML::readAttribute(r, XML::Attrib::value, &m_materialIdentifier); + // material data + } else if (tag == Tag::MaterialData) { + ItemWithMaterial::readFrom(r); XML::gotoEndElementOfTag(r, tag); // form factor