diff --git a/GUI/Model/Group/SelectionDescriptor.h b/GUI/Model/Group/SelectionDescriptor.h index 483dba1042e4babd72a9eeebaa7717b6bebc4fba..1f81a82c7717ae047d281230a9b6c83d72aeb3a6 100644 --- a/GUI/Model/Group/SelectionDescriptor.h +++ b/GUI/Model/Group/SelectionDescriptor.h @@ -86,15 +86,17 @@ public: currentItem = [=] { return item->value().value<ComboProperty>().getValue(); }; } - template <typename Catalog> - void init(const QString& _label, const QString& _tooltip, const T* itemPtr) + template <typename Catalog, typename... ArgsForConstructor> + void init(const QString& _label, const QString& _tooltip, const T* itemPtr, + ArgsForConstructor... argsForConstructor) { - init<Catalog>(_label, _tooltip, Catalog::types(), itemPtr); + init<Catalog>(_label, _tooltip, Catalog::types(), itemPtr, argsForConstructor...); } - template <typename Catalog> + template <typename Catalog, typename... ArgsForConstructor> void init(const QString& _label, const QString& _tooltip, - const QVector<typename Catalog::Type>& types, const T* itemPtr) + const QVector<typename Catalog::Type>& types, const T* itemPtr, + ArgsForConstructor... argsForConstructor) { label = _label; tooltip = _tooltip; @@ -103,7 +105,7 @@ public: currentIndexSetter = [=](int current) { auto newCurrentType = types[current]; - *const_cast<T*>(itemPtr) = Catalog::create(newCurrentType); + *const_cast<T*>(itemPtr) = Catalog::create(newCurrentType, argsForConstructor...); }; currentIndexGetter = [=]() { return types.indexOf(Catalog::type(*itemPtr)); }; diff --git a/GUI/Model/Group/SelectionProperty.h b/GUI/Model/Group/SelectionProperty.h index f8cfab0e91b5fdc82a08aa123fd9683fb276d5d1..58797867152c7a518174148c88268b105818881b 100644 --- a/GUI/Model/Group/SelectionProperty.h +++ b/GUI/Model/Group/SelectionProperty.h @@ -24,19 +24,21 @@ public: //! Initializes the selection with the first type in the catalog types. //! For initializing a newly created item when creating via Catalog - template <typename Catalog> - void init(const QString& label, const QString& tooltip, const QString& persistentTag) + template <typename Catalog, typename... ArgsForCreation> + void init(const QString& label, const QString& tooltip, const QString& persistentTag, + ArgsForCreation... argsForCreation) { m_persistentTag = persistentTag; - m_descriptor.template init<Catalog>(label, tooltip, &m_p); - m_p = Catalog::create(Catalog::types()[0]); + m_descriptor.template init<Catalog>(label, tooltip, &m_p, argsForCreation...); + m_p = Catalog::create(Catalog::types()[0], argsForCreation...); } //! Initializes the selection with the first type in the catalog types. //! For initializing a newly created item in a separate initializer method template <typename Catalog> - void init(const QString& label, const QString& tooltip, const QString& persistentTag, - std::function<void(T, const T)> initializer) + void initWithInitializer(const QString& label, const QString& tooltip, + const QString& persistentTag, + std::function<void(T, const T)> initializer) { m_initializer = initializer; m_persistentTag = persistentTag; @@ -51,9 +53,10 @@ public: //! For initializing a newly created item in a separate initializer method. //! Only a subset of types shall be used template <typename Catalog> - void init(const QString& label, const QString& tooltip, const QString& persistentTag, - const QVector<typename Catalog::Type>& types, - std::function<void(T, const T)> initializer) + void initWithInitializer(const QString& label, const QString& tooltip, + const QString& persistentTag, + const QVector<typename Catalog::Type>& types, + std::function<void(T, const T)> initializer) { m_initializer = initializer; m_persistentTag = persistentTag; @@ -78,9 +81,10 @@ public: m_p = t; } - template <typename S> S* set() + template <typename S, typename... ArgsForConstructor> + S* set(ArgsForConstructor... argsForConstructor) { - S* s = new S(); + S* s = new S(argsForConstructor...); if (s != nullptr && m_initializer) m_initializer(s, m_p); m_p = s; @@ -97,6 +101,7 @@ private: T m_p = nullptr; std::function<void(T, const T)> m_initializer; + std::function<T*()> m_creator; }; diff --git a/GUI/Model/Item/BeamAngleItems.cpp b/GUI/Model/Item/BeamAngleItems.cpp index 253b6e3892d92080705b999073394d892151a788..95d7de8034a7e51d19e4d2f5798e855970d3a07e 100644 --- a/GUI/Model/Item/BeamAngleItems.cpp +++ b/GUI/Model/Item/BeamAngleItems.cpp @@ -19,7 +19,7 @@ BeamAzimuthalAngleItem::BeamAzimuthalAngleItem() { - m_distribution.init<DistributionItemCatalog>( + m_distribution.initWithInitializer<DistributionItemCatalog>( "Distribution", "", "distribution", DistributionItemCatalog::types(), initDistribution); } @@ -66,7 +66,7 @@ double BeamAzimuthalAngleItem::scaleFactor() const BeamInclinationAngleItem::BeamInclinationAngleItem() { - m_distribution.init<DistributionItemCatalog>( + m_distribution.initWithInitializer<DistributionItemCatalog>( "Distribution", "", "distribution", DistributionItemCatalog::types(), initDistribution); } diff --git a/GUI/Model/Item/BeamWavelengthItem.cpp b/GUI/Model/Item/BeamWavelengthItem.cpp index a3b8f92ea0d399edffb9730650961ba40a1c5372..dce0068caa31d5233dced2aa24dc0d65c0febd0d 100644 --- a/GUI/Model/Item/BeamWavelengthItem.cpp +++ b/GUI/Model/Item/BeamWavelengthItem.cpp @@ -47,11 +47,11 @@ BeamWavelengthItem::BeamWavelengthItem() BeamWavelengthItem::BeamWavelengthItem(bool onlySymmetricDistributions) { - m_distribution.init<DistributionItemCatalog>("Distribution", "", "distribution", - onlySymmetricDistributions - ? DistributionItemCatalog::symmetricTypes() - : DistributionItemCatalog::types(), - initDistribution); + m_distribution.initWithInitializer<DistributionItemCatalog>( + "Distribution", "", "distribution", + onlySymmetricDistributions ? DistributionItemCatalog::symmetricTypes() + : DistributionItemCatalog::types(), + initDistribution); } void BeamWavelengthItem::serialize(Serializer& s) diff --git a/GUI/Model/Item/ItemWithMaterial.cpp b/GUI/Model/Item/ItemWithMaterial.cpp index 3d51a02f084eb8075127dd2e725ed72a24986194..d04f8a3f8e9315dadb599964b27308bdbdd1a35e 100644 --- a/GUI/Model/Item/ItemWithMaterial.cpp +++ b/GUI/Model/Item/ItemWithMaterial.cpp @@ -27,11 +27,11 @@ void ItemWithMaterial::setMaterial(const QString& materialIdentifier) m_materialIdentifier = materialIdentifier; } -void ItemWithMaterial::setMaterialModel(const MaterialModel* materialModel) + +ItemWithMaterial::ItemWithMaterial(const MaterialModel* materials) + : m_materialItems(materials) { - m_fnFindMaterialById = [=](const QString& id) { - return materialModel->materialFromIdentifier(id); - }; + ASSERT(m_materialItems); } void ItemWithMaterial::setMaterialUndefined() @@ -61,6 +61,5 @@ MaterialItem* ItemWithMaterial::materialItem() const if (materialIdentifier().isEmpty()) return nullptr; - ASSERT(m_fnFindMaterialById); - return m_fnFindMaterialById(materialIdentifier()); + return m_materialItems->materialFromIdentifier(materialIdentifier()); } diff --git a/GUI/Model/Item/ItemWithMaterial.h b/GUI/Model/Item/ItemWithMaterial.h index d14d144f903174dcf2bd1b6c427e4e9737678887..2fe7f23b2eb737ba6fe2507030c81ef2e8c6109a 100644 --- a/GUI/Model/Item/ItemWithMaterial.h +++ b/GUI/Model/Item/ItemWithMaterial.h @@ -25,8 +25,8 @@ class QColor; class ItemWithMaterial { public: - //! Define the material container where to find the linked material. - void setMaterialModel(const MaterialModel* materialModel); + //! Overhand the material list where the current material has to be searched for. + ItemWithMaterial(const MaterialModel* materials); //! Set the material this item shall use. //! Stores the identifier, not the pointer! @@ -47,7 +47,7 @@ public: MaterialItem* materialItem() const; protected: - std::function<MaterialItem*(const QString&)> m_fnFindMaterialById; + const MaterialModel* m_materialItems; QString m_materialIdentifier; }; diff --git a/GUI/Model/Item/LayerItem.cpp b/GUI/Model/Item/LayerItem.cpp index d0502c471d1ed3cef857375c6dce1f32d6b68061..a8c918c07b32b0b1abee257966b2ef3332951db1 100644 --- a/GUI/Model/Item/LayerItem.cpp +++ b/GUI/Model/Item/LayerItem.cpp @@ -52,7 +52,8 @@ QVector<ItemWithMaterial*> layoutItemsWithMaterial(ParticleLayoutItem* layout) } // namespace -LayerItem::LayerItem() +LayerItem::LayerItem(const MaterialModel* materials) + : ItemWithMaterial(materials) { m_thickness.init("Thickness", "Thickness of the layer", 0.0, Unit::nanometer, 3, RealLimits::lowerLimited(0.0), "thickness"); @@ -139,7 +140,7 @@ QVector<ParticleLayoutItem*> LayerItem::layouts() const ParticleLayoutItem* LayerItem::addLayout() { - m_layouts << new ParticleLayoutItem(); + m_layouts << new ParticleLayoutItem(m_materialItems); return m_layouts.back(); } @@ -188,5 +189,5 @@ void LayerItem::serialize(Serializer& s) s.rw(m_numSlices); s.rw(m_thickness); s.rw("Roughness", m_topRoughness); - s.rw("Layouts", m_layouts); + s.rw("Layouts", m_layouts, m_materialItems); } diff --git a/GUI/Model/Item/LayerItem.h b/GUI/Model/Item/LayerItem.h index 5d21ba10e3c3bde38cb679766e7c9512f75ad6da..cfd802f722d7f04345aea62a3fb71ca5f9deff5d 100644 --- a/GUI/Model/Item/LayerItem.h +++ b/GUI/Model/Item/LayerItem.h @@ -35,7 +35,7 @@ class Serializer; class LayerItem : public ItemWithMaterial { public: - LayerItem(); + LayerItem(const MaterialModel* materials); void setLayerName(const QString& name); QString layerName() const; diff --git a/GUI/Model/Item/MesoCrystalItem.cpp b/GUI/Model/Item/MesoCrystalItem.cpp index f58cf465186440410dad32d0ffcddfd587bba06b..17fd8905743a5453b253a451b5d4a441ce062d23 100644 --- a/GUI/Model/Item/MesoCrystalItem.cpp +++ b/GUI/Model/Item/MesoCrystalItem.cpp @@ -39,8 +39,9 @@ const QString position_tooltip = "Relative position of the mesocrystal's referen } // namespace -MesoCrystalItem::MesoCrystalItem() +MesoCrystalItem::MesoCrystalItem(const MaterialModel* materials) : ItemWithParticles(abundance_tooltip, position_tooltip) + , m_materials(materials) { m_vectorA.init("First lattice vector", "Coordinates of the first lattice vector", Unit::nanometer, "vectorA"); @@ -50,7 +51,7 @@ MesoCrystalItem::MesoCrystalItem() Unit::nanometer, "vectorC"); m_outerShape.init<FormFactorItemCatalog>("Outer Shape", "", "outerShape"); - m_basisParticle.init<ItemWithParticlesCatalog>("Basis", "", "basis"); + m_basisParticle.init<ItemWithParticlesCatalog>("Basis", "", "basis", materials); } void MesoCrystalItem::serialize(Serializer& s) @@ -63,7 +64,7 @@ void MesoCrystalItem::serialize(Serializer& s) s.rw(m_vectorB); s.rw(m_vectorC); s.rw<FormFactorItemCatalog>(m_outerShape); - s.rw<ItemWithParticlesCatalog>(m_basisParticle); + s.rw<ItemWithParticlesCatalog>(m_basisParticle, m_materials); } std::unique_ptr<MesoCrystal> MesoCrystalItem::createMesoCrystal() const diff --git a/GUI/Model/Item/MesoCrystalItem.h b/GUI/Model/Item/MesoCrystalItem.h index a13b229f83d7ad4993fe984ee342d5d18f6b2728..c90a62e26dcfb71546fed561a3686a260b2adc54 100644 --- a/GUI/Model/Item/MesoCrystalItem.h +++ b/GUI/Model/Item/MesoCrystalItem.h @@ -25,10 +25,11 @@ class IBornFF; class IParticle; class MesoCrystal; +class MaterialModel; class MesoCrystalItem : public ItemWithParticles { public: - MesoCrystalItem(); + MesoCrystalItem(const MaterialModel* materials); void serialize(Serializer& s) override; std::unique_ptr<MesoCrystal> createMesoCrystal() const; @@ -61,6 +62,7 @@ private: VectorProperty m_vectorC; SelectionProperty<FormFactorItem*> m_outerShape; SelectionProperty<ItemWithParticles*> m_basisParticle; + const MaterialModel* m_materials; }; template <typename T> T* MesoCrystalItem::setOuterShapeType() diff --git a/GUI/Model/Item/MultiLayerItem.cpp b/GUI/Model/Item/MultiLayerItem.cpp index b51dcd8b38beb0fdf3590c229062defeb9daef40..d975d6a8a8293da75aa9cda0ae480a5c298efab0 100644 --- a/GUI/Model/Item/MultiLayerItem.cpp +++ b/GUI/Model/Item/MultiLayerItem.cpp @@ -98,7 +98,7 @@ LayerItem* MultiLayerItem::addLayer(int index) if (index < 0) index = m_layers.size(); - auto* layer = new LayerItem(); + auto* layer = new LayerItem(&m_materials); m_layers.insert(index, layer); layer->setIsTopLayer(m_layers.first() == layer); layer->setIsBottomLayer(m_layers.last() == layer); @@ -148,8 +148,8 @@ void MultiLayerItem::serialize(Serializer& s) s.rw("Description", m_description); s.rw(m_crossCorrelationLength); s.rw(m_externalField); - s.rw("Layers", m_layers); s.rw("Materials", m_materials); + s.rw("Layers", m_layers, &m_materials); if (s.isReading()) { // set non-stored infos @@ -157,10 +157,6 @@ void MultiLayerItem::serialize(Serializer& s) l->setIsTopLayer(m_layers.first() == l); l->setIsBottomLayer(m_layers.last() == l); } - - // initialize all items with materials to find the materials - for (auto* itemWithMaterial : itemsWithMaterial()) - itemWithMaterial->setMaterialModel(&m_materials); } } diff --git a/GUI/Model/Item/ParticleCompositionItem.cpp b/GUI/Model/Item/ParticleCompositionItem.cpp index 732ac9924be318a4795dae04e1151f2cebe9c9b9..98230acb009da99e5bf48c9a590583efe368e680 100644 --- a/GUI/Model/Item/ParticleCompositionItem.cpp +++ b/GUI/Model/Item/ParticleCompositionItem.cpp @@ -35,9 +35,11 @@ const QString position_tooltip = "Relative position of the particle's reference } // namespace -ParticleCompositionItem::ParticleCompositionItem() +ParticleCompositionItem::ParticleCompositionItem(const MaterialModel* materials) : ItemWithParticles(abundance_tooltip, position_tooltip) + , m_materials(materials) { + ASSERT(m_materials); } void ParticleCompositionItem::serialize(Serializer& s) @@ -46,7 +48,7 @@ void ParticleCompositionItem::serialize(Serializer& s) s.rw(m_abundance); s.rw(m_position); s.rw<RotationItemCatalog>(m_rotation); - s.rw<ItemWithParticlesCatalog>("Particles", m_particles); + s.rw<ItemWithParticlesCatalog>("Particles", m_particles, m_materials); } std::unique_ptr<ParticleComposition> ParticleCompositionItem::createParticleComposition() const diff --git a/GUI/Model/Item/ParticleCompositionItem.h b/GUI/Model/Item/ParticleCompositionItem.h index 552e5c93dadf5c6462918b6efb51070926ee9571..31fbb765811fe3b0932d009bb798cbacd1268034 100644 --- a/GUI/Model/Item/ParticleCompositionItem.h +++ b/GUI/Model/Item/ParticleCompositionItem.h @@ -19,9 +19,11 @@ #include "Sample/Particle/ParticleComposition.h" #include <memory> +class MaterialModel; + class ParticleCompositionItem : public ItemWithParticles { public: - ParticleCompositionItem(); + ParticleCompositionItem(const MaterialModel* materials); void serialize(Serializer& s) override; std::unique_ptr<ParticleComposition> createParticleComposition() const; @@ -34,6 +36,7 @@ public: private: QVector<ItemWithParticles*> m_particles; + const MaterialModel* m_materials; }; #endif // BORNAGAIN_GUI_MODEL_ITEM_PARTICLECOMPOSITIONITEM_H diff --git a/GUI/Model/Item/ParticleCoreShellItem.cpp b/GUI/Model/Item/ParticleCoreShellItem.cpp index 9f2a7a81aae955807c499eb4e894aa319f31d4d7..09f827586efb961db30e57dafca60785030b9a9e 100644 --- a/GUI/Model/Item/ParticleCoreShellItem.cpp +++ b/GUI/Model/Item/ParticleCoreShellItem.cpp @@ -32,8 +32,9 @@ const QString position_tooltip = "Relative position of the particle's reference } // namespace -ParticleCoreShellItem::ParticleCoreShellItem() +ParticleCoreShellItem::ParticleCoreShellItem(const MaterialModel* materials) : ItemWithParticles(abundance_tooltip, position_tooltip) + , m_materials(materials) { } @@ -42,8 +43,8 @@ void ParticleCoreShellItem::serialize(Serializer& s) s.assertVersion(0); s.rw(m_abundance); s.rw(m_position); - s.rw("core", m_core); - s.rw("shell", m_shell); + s.rw("core", m_core, m_materials); + s.rw("shell", m_shell, m_materials); } std::unique_ptr<ParticleCoreShell> ParticleCoreShellItem::createParticleCoreShell() const @@ -78,8 +79,7 @@ void ParticleCoreShellItem::clearCore() ParticleItem* ParticleCoreShellItem::createCore(MaterialModel* materials) { - m_core.reset(new ParticleItem()); - m_core->setMaterialModel(materials); + m_core.reset(new ParticleItem(materials)); m_core->setMaterial(materials->defaultMaterial()); return m_core.get(); } @@ -96,8 +96,7 @@ void ParticleCoreShellItem::clearShell() ParticleItem* ParticleCoreShellItem::createShell(MaterialModel* materials) { - m_shell.reset(new ParticleItem()); - m_shell->setMaterialModel(materials); + m_shell.reset(new ParticleItem(materials)); m_shell->setMaterial(materials->defaultMaterial()); // position is not used for shell item diff --git a/GUI/Model/Item/ParticleCoreShellItem.h b/GUI/Model/Item/ParticleCoreShellItem.h index 6b2bedd563a347be2f6c3b2945e21d7833c2cd47..2302f1f7a77ad9fc2613bfb8c202a57eb6aee49e 100644 --- a/GUI/Model/Item/ParticleCoreShellItem.h +++ b/GUI/Model/Item/ParticleCoreShellItem.h @@ -24,7 +24,7 @@ class MaterialModel; class ParticleCoreShellItem : public ItemWithParticles { public: - ParticleCoreShellItem(); + ParticleCoreShellItem(const MaterialModel* materials); void serialize(Serializer& s) override; std::unique_ptr<ParticleCoreShell> createParticleCoreShell() const; @@ -42,6 +42,7 @@ public: private: std::unique_ptr<ParticleItem> m_core; std::unique_ptr<ParticleItem> m_shell; + const MaterialModel* m_materials; }; #endif // BORNAGAIN_GUI_MODEL_ITEM_PARTICLECORESHELLITEM_H diff --git a/GUI/Model/Item/ParticleItem.cpp b/GUI/Model/Item/ParticleItem.cpp index 19883f6a362ffcf3f453f04c929624620eeabb4c..3cab652190cadce0ceb8f3dc8c66b1e5b9842e5e 100644 --- a/GUI/Model/Item/ParticleItem.cpp +++ b/GUI/Model/Item/ParticleItem.cpp @@ -32,8 +32,9 @@ const QString position_tooltip = "Relative position of the particle's reference } // namespace -ParticleItem::ParticleItem() - : ItemWithParticles(abundance_tooltip, position_tooltip) +ParticleItem::ParticleItem(const MaterialModel* materials) + : ItemWithMaterial(materials) + , ItemWithParticles(abundance_tooltip, position_tooltip) { m_formFactor.init<FormFactorItemCatalog>("Form Factor", "", "formFactor"); m_formFactor.set(new CylinderItem()); diff --git a/GUI/Model/Item/ParticleItem.h b/GUI/Model/Item/ParticleItem.h index 954318bfcc27a1b3279f13c3654988416d00bce0..1127740b62545c8b4fd8f6721a413c641f8f3b35 100644 --- a/GUI/Model/Item/ParticleItem.h +++ b/GUI/Model/Item/ParticleItem.h @@ -25,7 +25,7 @@ class Particle; class ParticleItem : public ItemWithMaterial, public ItemWithParticles { public: - ParticleItem(); + ParticleItem(const MaterialModel* materials); void serialize(Serializer& s) override; std::unique_ptr<Particle> createParticle() const; diff --git a/GUI/Model/Item/ParticleLayoutItem.cpp b/GUI/Model/Item/ParticleLayoutItem.cpp index e1586325f7e75545609b4fbfb36ecc4f1a18950d..bc360853860b24c79e44bf3585f96784ecd35c5d 100644 --- a/GUI/Model/Item/ParticleLayoutItem.cpp +++ b/GUI/Model/Item/ParticleLayoutItem.cpp @@ -22,7 +22,8 @@ #include "GUI/Model/MakeItem/ItemWithParticlesCatalog.h" #include "GUI/Model/XML/Serializer.h" -ParticleLayoutItem::ParticleLayoutItem() +ParticleLayoutItem::ParticleLayoutItem(const MaterialModel* materials) + : m_materials(materials) { m_ownDensity.init("Total particle density", "Number of particles per area (particle surface density).\n " @@ -135,5 +136,5 @@ void ParticleLayoutItem::serialize(Serializer& s) s.rw(m_ownDensity); s.rw(m_weight); s.rw<InterferenceItemCatalog>(m_interference); - s.rw<ItemWithParticlesCatalog>("Particles", m_particles); + s.rw<ItemWithParticlesCatalog>("Particles", m_particles, m_materials); } diff --git a/GUI/Model/Item/ParticleLayoutItem.h b/GUI/Model/Item/ParticleLayoutItem.h index 56d22de885a06118dfc2725f6816a4f64858e73e..69d12348868259d1b7b10b0ca10540997674664c 100644 --- a/GUI/Model/Item/ParticleLayoutItem.h +++ b/GUI/Model/Item/ParticleLayoutItem.h @@ -21,15 +21,13 @@ #include <QUuid> #include <memory> - class ItemWithParticles; -class QXmlStreamReader; -class QXmlStreamWriter; class Serializer; +class MaterialModel; class ParticleLayoutItem { public: - ParticleLayoutItem(); + ParticleLayoutItem(const MaterialModel* materials); //! The density value which belonging only to the layout. //! @@ -76,6 +74,7 @@ private: DoubleProperty m_weight; SelectionProperty<InterferenceItem*> m_interference; QVector<ItemWithParticles*> m_particles; + const MaterialModel* m_materials; }; #endif // BORNAGAIN_GUI_MODEL_ITEM_PARTICLELAYOUTITEM_H diff --git a/GUI/Model/Item/RectangularDetectorItem.cpp b/GUI/Model/Item/RectangularDetectorItem.cpp index e236f2c62a4554f95aab40e3ea0de57d458d81f8..041d50fb8a356c222cd4bbaaea20d7f277af6bd0 100644 --- a/GUI/Model/Item/RectangularDetectorItem.cpp +++ b/GUI/Model/Item/RectangularDetectorItem.cpp @@ -64,7 +64,7 @@ void initResolutionFunction(ResolutionFunctionItem* newFunc, const ResolutionFun RectangularDetectorItem::RectangularDetectorItem() { - m_resolutionFunction.init<ResolutionFunctionItemCatalog>( + m_resolutionFunction.initWithInitializer<ResolutionFunctionItemCatalog>( "Resolution function", "Detector resolution function", "resolutionFunction", initResolutionFunction); diff --git a/GUI/Model/Item/SpecularBeamInclinationItem.cpp b/GUI/Model/Item/SpecularBeamInclinationItem.cpp index fa561d849c32c3853ec159deb1260286ef9d698c..99e467a81665e3e2d13194a0bf141d7ae68b215c 100644 --- a/GUI/Model/Item/SpecularBeamInclinationItem.cpp +++ b/GUI/Model/Item/SpecularBeamInclinationItem.cpp @@ -64,9 +64,9 @@ SpecularBeamInclinationItem::SpecularBeamInclinationItem(const InstrumentItem* o : BeamDistributionItem() , m_owningInstrument(owningInstrument) { - m_distribution.init<DistributionItemCatalog>("Distribution", "", "distribution", - DistributionItemCatalog::symmetricTypes(), - initDistribution); + m_distribution.initWithInitializer<DistributionItemCatalog>( + "Distribution", "", "distribution", DistributionItemCatalog::symmetricTypes(), + initDistribution); m_uniformAlphaAxis.reset(new BasicAxisItem()); setAxisPresentationDefaults(m_uniformAlphaAxis.get()); @@ -78,8 +78,9 @@ void SpecularBeamInclinationItem::serialize(Serializer& s) s.assertVersion(0); s.rw<DistributionItemCatalog>(m_distribution); s.rw("currentAxisIsUniformAxis", m_currentAxisIsUniformAxis); - s.rw<BasicAxisItem>("uniformAxis", m_uniformAlphaAxis, setAxisPresentationDefaults); - s.rw<PointwiseAxisItem>("pointwiseAxis", m_pointwiseAlphaAxis, setAxisPresentationDefaults); + s.rwWithInit<BasicAxisItem>("uniformAxis", m_uniformAlphaAxis, setAxisPresentationDefaults); + s.rwWithInit<PointwiseAxisItem>("pointwiseAxis", m_pointwiseAlphaAxis, + setAxisPresentationDefaults); if (s.isReading()) { m_distribution->setLimits(RealLimits::limited(-90.0, 90.0)); diff --git a/GUI/Model/Item/SphericalDetectorItem.cpp b/GUI/Model/Item/SphericalDetectorItem.cpp index e53599806328e169d8c7c033d0fab040c83a2c6d..912250017b259acf00f34088bce1b63178b71034 100644 --- a/GUI/Model/Item/SphericalDetectorItem.cpp +++ b/GUI/Model/Item/SphericalDetectorItem.cpp @@ -28,7 +28,7 @@ void initResolutionFunction(ResolutionFunctionItem* newFunc, const ResolutionFun SphericalDetectorItem::SphericalDetectorItem() { - m_resolutionFunction.init<ResolutionFunctionItemCatalog>( + m_resolutionFunction.initWithInitializer<ResolutionFunctionItemCatalog>( "Resolution function", "Detector resolution function", "resolutionFunction", initResolutionFunction); diff --git a/GUI/Model/MakeItem/ItemWithParticlesCatalog.cpp b/GUI/Model/MakeItem/ItemWithParticlesCatalog.cpp index 3c901f656f565a5a8baa8f40815a2dc68255de51..622fa0027890f5b94cdb5495fdbceef18296914f 100644 --- a/GUI/Model/MakeItem/ItemWithParticlesCatalog.cpp +++ b/GUI/Model/MakeItem/ItemWithParticlesCatalog.cpp @@ -18,17 +18,17 @@ #include "GUI/Model/Item/ParticleCoreShellItem.h" #include "GUI/Model/Item/ParticleItem.h" -ItemWithParticles* ItemWithParticlesCatalog::create(Type type) +ItemWithParticles* ItemWithParticlesCatalog::create(Type type, const MaterialModel* materials) { switch (type) { case Type::Particle: - return new ParticleItem(); + return new ParticleItem(materials); case Type::Composition: - return new ParticleCompositionItem(); + return new ParticleCompositionItem(materials); case Type::CoreShell: - return new ParticleCoreShellItem(); + return new ParticleCoreShellItem(materials); case Type::MesoCrystal: - return new MesoCrystalItem(); + return new MesoCrystalItem(materials); default: ASSERT(false); } diff --git a/GUI/Model/MakeItem/ItemWithParticlesCatalog.h b/GUI/Model/MakeItem/ItemWithParticlesCatalog.h index 60d14f1ddd5b8b8c2e5358301abcc95027733c3c..fa220db0783c69687026670702b9594f3f23a88e 100644 --- a/GUI/Model/MakeItem/ItemWithParticlesCatalog.h +++ b/GUI/Model/MakeItem/ItemWithParticlesCatalog.h @@ -19,6 +19,7 @@ #include <QVector> class ItemWithParticles; +class MaterialModel; class ItemWithParticlesCatalog { public: @@ -36,7 +37,7 @@ public: //! Creates the item of the given type. //! //! If type is "None", a nullptr is returned. - static ItemWithParticles* create(Type type); + static ItemWithParticles* create(Type type, const MaterialModel* materials); //! Available types of items, sorted as expected in the UI (e.g. in combo box) static QVector<Type> types(); diff --git a/GUI/Model/MakeItem/ResolutionFunctionItemCatalog.cpp b/GUI/Model/MakeItem/ResolutionFunctionItemCatalog.cpp index 23fcb58e6427d52ac629be7781839b2ad07a8237..6d0315dc22c296fbb5376c892f08872215240088 100644 --- a/GUI/Model/MakeItem/ResolutionFunctionItemCatalog.cpp +++ b/GUI/Model/MakeItem/ResolutionFunctionItemCatalog.cpp @@ -16,13 +16,20 @@ #include "Base/Util/Assert.h" #include "GUI/Model/Item/ResolutionFunctionItems.h" -ResolutionFunctionItem* ResolutionFunctionItemCatalog::create(Type type) +ResolutionFunctionItem* +ResolutionFunctionItemCatalog::create(Type type, const std::variant<QString, Unit>& unit) { switch (type) { - case Type::None: - return new ResolutionFunctionNoneItem(); - case Type::Gaussian: - return new ResolutionFunction2DGaussianItem(); + case Type::None: { + auto* p = new ResolutionFunctionNoneItem(); + p->setUnit(unit); + return p; + } + case Type::Gaussian: { + auto* p = new ResolutionFunction2DGaussianItem(); + p->setUnit(unit); + return p; + } } ASSERT(false); } diff --git a/GUI/Model/MakeItem/ResolutionFunctionItemCatalog.h b/GUI/Model/MakeItem/ResolutionFunctionItemCatalog.h index cd4cd2d9806f57fba4b6bcb01ce79b4529d5bb45..c7648a5ba1329edd297fe934d535c6d77c2a3437 100644 --- a/GUI/Model/MakeItem/ResolutionFunctionItemCatalog.h +++ b/GUI/Model/MakeItem/ResolutionFunctionItemCatalog.h @@ -15,8 +15,10 @@ #ifndef BORNAGAIN_GUI_MODEL_MAKEITEM_RESOLUTIONFUNCTIONITEMCATALOG_H #define BORNAGAIN_GUI_MODEL_MAKEITEM_RESOLUTIONFUNCTIONITEMCATALOG_H +#include "GUI/Model/Types/Unit.h" #include <QString> #include <QVector> +#include <variant> class ResolutionFunctionItem; @@ -33,7 +35,8 @@ public: }; //! Creates the item of the given type. - static ResolutionFunctionItem* create(Type type); + static ResolutionFunctionItem* create(Type type, + const std::variant<QString, Unit>& unit = Unit::unitless); //! Available types of items. //! diff --git a/GUI/Model/Model/MaterialModel.cpp b/GUI/Model/Model/MaterialModel.cpp index c377d6c4850e32f1d3a8ef8383415c10d32946e4..a5671ac3bd4a11e2f767c132df02c0542e3f9ddf 100644 --- a/GUI/Model/Model/MaterialModel.cpp +++ b/GUI/Model/Model/MaterialModel.cpp @@ -144,15 +144,6 @@ const QVector<MaterialItem*>& MaterialModel::materialItems() const return m_materialItems; } -MaterialItem* MaterialModel::findMaterialItem(const QString& identifier) const -{ - for (auto* m : m_materialItems) - if (m->identifier() == identifier) - return m; - - return nullptr; -} - MaterialItem* MaterialModel::defaultMaterial() const { ASSERT(!materialItems().isEmpty()); @@ -207,14 +198,14 @@ void MaterialModel::serialize(Serializer& s) if (s.isReading()) clear(); s.assertVersion(0); - s.rw("Materials", m_materialItems); + s.rw("MaterialItems", m_materialItems); } void MaterialModel::initFrom(const MaterialModel& from) { // update existing to new contents (do not delete and recreate to keep references valid) for (auto* destItem : m_materialItems) - if (auto* fromItem = from.findMaterialItem(destItem->identifier())) + if (auto* fromItem = from.materialFromIdentifier(destItem->identifier())) destItem->updateFrom(*fromItem); bool anyAddedOrRemoved = false; @@ -222,7 +213,7 @@ void MaterialModel::initFrom(const MaterialModel& from) // remove non-existing auto* iter = m_materialItems.begin(); while (iter != m_materialItems.end()) - if (!from.findMaterialItem((*iter)->identifier())) { + if (!from.materialFromIdentifier((*iter)->identifier())) { delete *iter; iter = m_materialItems.erase(iter); anyAddedOrRemoved = true; @@ -231,7 +222,7 @@ void MaterialModel::initFrom(const MaterialModel& from) // copy new ones for (const auto* m : from.materialItems()) - if (!findMaterialItem(m->identifier())) { + if (!materialFromIdentifier(m->identifier())) { addMaterial(new MaterialItem(*m), false); anyAddedOrRemoved = true; } @@ -239,7 +230,7 @@ void MaterialModel::initFrom(const MaterialModel& from) // copy order QVector<MaterialItem*> tmp; for (const auto* m : from.materialItems()) - tmp << findMaterialItem(m->identifier()); + tmp << materialFromIdentifier(m->identifier()); m_materialItems = tmp; if (anyAddedOrRemoved) diff --git a/GUI/Model/Model/MaterialModel.h b/GUI/Model/Model/MaterialModel.h index d179a8a5d98c34ce3e440fba35800d8f18161dfd..5ddbdcf71fb6523168bc40246ee6c53bfe93d901 100644 --- a/GUI/Model/Model/MaterialModel.h +++ b/GUI/Model/Model/MaterialModel.h @@ -49,7 +49,6 @@ public: MaterialItem* insertCopy(const MaterialItem& material); const QVector<MaterialItem*>& materialItems() const; - MaterialItem* findMaterialItem(const QString& identifier) const; MaterialItem* defaultMaterial() const; diff --git a/GUI/Model/XML/Serializer.h b/GUI/Model/XML/Serializer.h index 785a1407988496adeab1aada6a61e1893bdab2c0..33b444971f6a59f72ee26ac28cd52f14aaf45f83 100644 --- a/GUI/Model/XML/Serializer.h +++ b/GUI/Model/XML/Serializer.h @@ -60,7 +60,8 @@ public: void rw(const QString& tag, AxisProperty& d); //! serialize a list with a known and fixed type which is not a base class, but the real class - template <typename T> void rw(const QString& tag, QVector<T>& vec) + template <typename T, typename... Args> + void rw(const QString& tag, QVector<T>& vec, Args... argsForConstructor) { if (m_w) { m_w->writeStartElement(tag); @@ -78,7 +79,7 @@ public: const int n = m_r->attributes().value("n").toInt(); for (int i = 0; i < n; i++) { goToStartElementOfTag("E" + QString::number(i)); - vec << new typename std::remove_pointer<T>::type(); + vec << new typename std::remove_pointer<T>::type(argsForConstructor...); vec.last()->serialize(*this); gotoEndElementOfTag("E" + QString::number(i)); } @@ -89,8 +90,9 @@ public: //! serialize a list with a base class type, which can contain derived types. For this we need //! the catalog of possible classes/types to identify the current type and to re-create this //! type after serialization - template <typename Catalog> - void rw(const QString& tag, QVector<typename Catalog::CatalogedType*>& vec) + template <typename Catalog, typename... Args> + void rw(const QString& tag, QVector<typename Catalog::CatalogedType*>& vec, + Args... argsForConstructor) { if (m_w) { m_w->writeStartElement(tag); @@ -106,21 +108,23 @@ public: const int n = m_r->attributes().value("n").toInt(); for (int i = 0; i < n; i++) { typename Catalog::CatalogedType* p = nullptr; - read<Catalog>("E" + QString::number(i), p); + read<Catalog>("E" + QString::number(i), p, argsForConstructor...); vec << p; } gotoEndElementOfTag(tag); } } - template <typename Catalog> void rw(SelectionProperty<typename Catalog::CatalogedType*>& d) + template <typename Catalog, typename... ArgsForCreation> + void rw(SelectionProperty<typename Catalog::CatalogedType*>& d, + ArgsForCreation... argsForCreation) { if (m_w) { typename Catalog::CatalogedType* p = d.get(); write<Catalog>(d.persistentTag(), p); } else { typename Catalog::CatalogedType* p = nullptr; - read<Catalog>(d.persistentTag(), p); + read<Catalog>(d.persistentTag(), p, argsForCreation...); d.set(p); } } @@ -146,10 +150,35 @@ public: //! serialize item which has only one exact class, and can be present or not. //! - //! If initializer is given, it will be called after creation and before de-serialization - template <typename ItemClass> + //! argsForConstructor will be handed to the constructor when creating ItemClass. + template <typename ItemClass, typename... ArgsForConstructor> void rw(const QString& tag, std::unique_ptr<ItemClass>& up, - std::function<void(ItemClass*)> initializer = nullptr) + ArgsForConstructor... argsForConstructor) + { + if (m_w) { + m_w->writeStartElement(tag); + m_w->writeAttribute("valid", up ? "1" : "0"); + if (up) + up->serialize(*this); + m_w->writeEndElement(); + } else { + goToStartElementOfTag(tag); + const bool valid = m_r->attributes().value("valid").toUInt() > 0; + if (valid) { + up.reset(new ItemClass(argsForConstructor...)); + up->serialize(*this); + } else + up.reset(); + gotoEndElementOfTag(tag); + } + } + + //! serialize item which has only one exact class, and can be present or not. + //! + //! The given initializer will be called after creation and before de-serialization + template <typename ItemClass> + void rwWithInit(const QString& tag, std::unique_ptr<ItemClass>& up, + const std::function<void(ItemClass*)>& initializer) { if (m_w) { m_w->writeStartElement(tag); @@ -181,13 +210,14 @@ public: m_w->writeEndElement(); } - template <typename Catalog> void read(const QString& tag, typename Catalog::CatalogedType*& p) + template <typename Catalog, typename... Args> + void read(const QString& tag, typename Catalog::CatalogedType*& p, Args... argsForConstructor) { ASSERT(m_r); goToStartElementOfTag(tag); const auto type = static_cast<typename Catalog::Type>(m_r->attributes().value("type").toUInt()); - p = Catalog::create(type); + p = Catalog::create(type, argsForConstructor...); if (p != nullptr) p->serialize(*this); gotoEndElementOfTag(tag); diff --git a/GUI/View/FromDomain/GUISampleBuilder.cpp b/GUI/View/FromDomain/GUISampleBuilder.cpp index 739c1d5fe9d5bc0f71d3676e1b883f3af72916f2..4f9165258057643fdc3fba8670423565c9de55dc 100644 --- a/GUI/View/FromDomain/GUISampleBuilder.cpp +++ b/GUI/View/FromDomain/GUISampleBuilder.cpp @@ -71,10 +71,6 @@ MultiLayerItem* GUISampleBuilder::createMultiLayerItem(const MultiLayer& multiLa } } - // initialize all items with materials to find the materials - for (auto* itemWithMaterial : m_multilayerItem->itemsWithMaterial()) - itemWithMaterial->setMaterialModel(&m_multilayerItem->materialItems()); - return m_multilayerItem; } @@ -113,7 +109,7 @@ void GUISampleBuilder::copyParticle(const IParticle* iparticle, std::function<void(ItemWithParticles*)> addToParent) { if (const auto* particle = dynamic_cast<const Particle*>(iparticle)) { - auto* particle_item = new ParticleItem(); + auto* particle_item = new ParticleItem(&m_multilayerItem->materialItems()); copyParticle(particle_item, particle); addToParent(particle_item); } else if (const auto* coreshell = dynamic_cast<const ParticleCoreShell*>(iparticle)) { @@ -122,7 +118,7 @@ void GUISampleBuilder::copyParticle(const IParticle* iparticle, if (!coreshell->shellParticle()) throw Exception("Core/shell particle has no shell particle."); - auto* coreShellItem = new ParticleCoreShellItem(); + auto* coreShellItem = new ParticleCoreShellItem(&m_multilayerItem->materialItems()); coreShellItem->setAbundance(coreshell->abundance()); coreShellItem->setPosition(coreshell->particlePosition()); FromDomain::setRotation(coreShellItem, coreshell->rotation()); @@ -141,7 +137,7 @@ void GUISampleBuilder::copyParticle(const IParticle* iparticle, if (!meso->particleStructure().basis()) throw Exception("Meso crystal has no basis."); - auto* mesoItem = new MesoCrystalItem(); + auto* mesoItem = new MesoCrystalItem(&m_multilayerItem->materialItems()); mesoItem->setAbundance(meso->abundance()); mesoItem->setPosition(meso->particlePosition()); FromDomain::setFormFactor(mesoItem, meso->outerShape()); @@ -158,7 +154,8 @@ void GUISampleBuilder::copyParticle(const IParticle* iparticle, } else if (const auto* particleComposition = dynamic_cast<const ParticleComposition*>(iparticle)) { - auto* particleCompositionItem = new ParticleCompositionItem(); + auto* particleCompositionItem = + new ParticleCompositionItem(&m_multilayerItem->materialItems()); particleCompositionItem->setAbundance(particleComposition->abundance()); particleCompositionItem->setPosition(particleComposition->particlePosition()); diff --git a/GUI/View/SampleDesigner/SampleEditorCommands.cpp b/GUI/View/SampleDesigner/SampleEditorCommands.cpp index e457a8d293f7cccba0c244d1ea246e32c548335f..956d0b78af95dff6f43e4bca68411b974f52cd3d 100644 --- a/GUI/View/SampleDesigner/SampleEditorCommands.cpp +++ b/GUI/View/SampleDesigner/SampleEditorCommands.cpp @@ -73,7 +73,6 @@ void CommandRemoveLayer::undo() { LayerItem* restoredLayer = m_ec->multiLayerItem()->addLayer(m_indexOfLayer); deserialize(restoredLayer, m_layerItemBackup); - restoredLayer->setMaterialModel(m_ec->materialModel()); m_ec->multiLayerForm()->onLayerAdded(restoredLayer); emit m_ec->modified(); } diff --git a/GUI/View/SampleDesigner/SampleEditorController.cpp b/GUI/View/SampleDesigner/SampleEditorController.cpp index efb48f72d8c166cd304cc2a4c3da6a6051f4da3c..7a6384320c84f713a88076b56825646899aa5f0a 100644 --- a/GUI/View/SampleDesigner/SampleEditorController.cpp +++ b/GUI/View/SampleDesigner/SampleEditorController.cpp @@ -101,7 +101,6 @@ void SampleEditorController::addLayer(LayerItem* before) // - create new layer LayerItem* layer = m_multiLayerItem->addLayer(rowInMultiLayer); - layer->setMaterialModel(materialModel()); layer->setMaterial(materialModel()->defaultMaterial()); layer->setColor(color); @@ -213,8 +212,7 @@ void SampleEditorController::addParticle(ParticleCompositionItem* compositionIte ItemWithParticles* SampleEditorController::createAndInitParticle(FormFactorItemCatalog::Type formFactorType) const { - auto* newParticle = new ParticleItem(); - newParticle->setMaterialModel(materialModel()); + auto* newParticle = new ParticleItem(materialModel()); newParticle->setFormFactor(FormFactorItemCatalog::create(formFactorType)); newParticle->setMaterial(materialModel()->defaultMaterial()); return newParticle; @@ -223,12 +221,10 @@ SampleEditorController::createAndInitParticle(FormFactorItemCatalog::Type formFa ItemWithParticles* SampleEditorController::createAndInitParticle(ItemWithParticlesCatalog::Type itemType) const { - auto* newItem = ItemWithParticlesCatalog::create(itemType); + auto* newItem = ItemWithParticlesCatalog::create(itemType, materialModel()); - if (auto* p = dynamic_cast<ItemWithMaterial*>(newItem)) { - p->setMaterialModel(materialModel()); + if (auto* p = dynamic_cast<ItemWithMaterial*>(newItem)) p->setMaterial(materialModel()->defaultMaterial()); - } if (auto* cs = dynamic_cast<ParticleCoreShellItem*>(newItem)) { cs->createCore(materialModel()); @@ -238,10 +234,8 @@ SampleEditorController::createAndInitParticle(ItemWithParticlesCatalog::Type ite } if (auto* meso = dynamic_cast<MesoCrystalItem*>(newItem); meso && meso->basisParticle()) - if (auto* p = dynamic_cast<ItemWithMaterial*>(meso->basisParticle())) { - p->setMaterialModel(materialModel()); + if (auto* p = dynamic_cast<ItemWithMaterial*>(meso->basisParticle())) p->setMaterial(materialModel()->defaultMaterial()); - } return newItem; } diff --git a/Tests/Unit/GUI/TestRealSpaceBuilderUtils.cpp b/Tests/Unit/GUI/TestRealSpaceBuilderUtils.cpp index 4f2329da43b45cde0246a2e94d3c40d7ef18209c..c7f4b3c6029c7dfcaea8633727ab27b2dac11e9a 100644 --- a/Tests/Unit/GUI/TestRealSpaceBuilderUtils.cpp +++ b/Tests/Unit/GUI/TestRealSpaceBuilderUtils.cpp @@ -35,11 +35,11 @@ TEST_F(TestRealSpaceBuilderUtils, RealSpaceModelandParticle) TEST_F(TestRealSpaceBuilderUtils, computeCumulativeAbundances) { MaterialModel materialModel; - auto* layout = new ParticleLayoutItem(); + auto* layout = new ParticleLayoutItem(&materialModel); - auto* particle1 = new ParticleItem(); + auto* particle1 = new ParticleItem(&materialModel); layout->addParticle(particle1); - auto* particle2 = new ParticleItem(); + auto* particle2 = new ParticleItem(&materialModel); layout->addParticle(particle2); particle1->setAbundance(8.0); @@ -154,9 +154,8 @@ TEST_F(TestRealSpaceBuilderUtils, singleParticle3DContainer) MaterialModel materialModel; materialModel.addRefractiveMaterial("Default", 1e-3, 1e-5); - auto particleItem = std::make_unique<ParticleItem>(); + auto particleItem = std::make_unique<ParticleItem>(&materialModel); particleItem->setMaterial(materialModel.defaultMaterial()); - particleItem->setMaterialModel(&materialModel); EXPECT_EQ(particleItem->abundance(), 1.0); EXPECT_TRUE(dynamic_cast<CylinderItem*>(particleItem->formfactor_at_bottom())); @@ -183,16 +182,13 @@ TEST_F(TestRealSpaceBuilderUtils, particle3DContainerVector) MaterialModel materialModel; materialModel.addRefractiveMaterial("Default", 1e-3, 1e-5); - auto layout = std::make_unique<ParticleLayoutItem>(); - auto* particle1 = new ParticleItem(); - auto* particle2 = new ParticleItem(); - auto* particle3 = new ParticleItem(); + auto layout = std::make_unique<ParticleLayoutItem>(&materialModel); + auto* particle1 = new ParticleItem(&materialModel); + auto* particle2 = new ParticleItem(&materialModel); + auto* particle3 = new ParticleItem(&materialModel); particle1->setMaterial(materialModel.defaultMaterial()); particle2->setMaterial(materialModel.defaultMaterial()); particle3->setMaterial(materialModel.defaultMaterial()); - particle1->setMaterialModel(&materialModel); - particle2->setMaterialModel(&materialModel); - particle3->setMaterialModel(&materialModel); layout->addParticle(particle1); layout->addParticle(particle2); diff --git a/Tests/Unit/GUI/TestSessionModel.cpp b/Tests/Unit/GUI/TestSessionModel.cpp index 0a79f2e4723e2476fa05ee01c5f708bbdfa3fb95..7cb9b69371a302629c9cac4e233d98c3a6cf5815 100644 --- a/Tests/Unit/GUI/TestSessionModel.cpp +++ b/Tests/Unit/GUI/TestSessionModel.cpp @@ -52,6 +52,7 @@ TEST_F(TestSessionModel, copyItem) auto multilayer1 = std::make_unique<MultiLayerItem>(); multilayer1->setSampleName("multilayer1"); + multilayer1->addStandardMaterials(); InstrumentItems instrumentItems; auto* instrument1 = instrumentItems.addInstrument<GISASInstrumentItem>(); diff --git a/Tests/Unit/GUI/TestSessionXML.cpp b/Tests/Unit/GUI/TestSessionXML.cpp index 0a4d985c8d3b526a4198dd89ced13b3bb472960e..f4b003b07ffd03f6090541cab25cb34882a6fba3 100644 --- a/Tests/Unit/GUI/TestSessionXML.cpp +++ b/Tests/Unit/GUI/TestSessionXML.cpp @@ -192,10 +192,11 @@ TEST_F(TestSessionXML, emptyMultiLayer) TEST_F(TestSessionXML, Layer) { - LayerItem source; + MaterialModel materials; + LayerItem source(&materials); const auto a1 = serialize(source); - LayerItem target; + LayerItem target(&materials); deserialize(target, a1); // final XML comparison @@ -204,10 +205,11 @@ TEST_F(TestSessionXML, Layer) TEST_F(TestSessionXML, Particle) { - ParticleItem source; + MaterialModel materials; + ParticleItem source(&materials); const auto a1 = serialize(source); - ParticleItem target; + ParticleItem target(&materials); deserialize(target, a1); // final XML comparison @@ -216,11 +218,12 @@ TEST_F(TestSessionXML, Particle) TEST_F(TestSessionXML, ParticleWithFF) { - ParticleItem source; + MaterialModel materials; + ParticleItem source(&materials); source.setFormFactorType<Pyramid2Item>(); const auto a1 = serialize(source); - ParticleItem target; + ParticleItem target(&materials); deserialize(target, a1); // final XML comparison