diff --git a/GUI/Model/Item/ItemWithMaterial.cpp b/GUI/Model/Item/ItemWithMaterial.cpp index cb1e1099033d1d06e17e4da00468b445c1a303ab..3d51a02f084eb8075127dd2e725ed72a24986194 100644 --- a/GUI/Model/Item/ItemWithMaterial.cpp +++ b/GUI/Model/Item/ItemWithMaterial.cpp @@ -15,6 +15,7 @@ #include "GUI/Model/Item/ItemWithMaterial.h" #include "Base/Util/Assert.h" #include "GUI/Model/Item/MaterialItem.h" +#include "GUI/Model/Model/MaterialModel.h" void ItemWithMaterial::setMaterial(const MaterialItem* materialItem) { @@ -26,10 +27,11 @@ void ItemWithMaterial::setMaterial(const QString& materialIdentifier) m_materialIdentifier = materialIdentifier; } -void ItemWithMaterial::setMaterialFinder( - const std::function<MaterialItem*(const QString&)> fnFindMaterialById) +void ItemWithMaterial::setMaterialModel(const MaterialModel* materialModel) { - m_fnFindMaterialById = fnFindMaterialById; + m_fnFindMaterialById = [=](const QString& id) { + return materialModel->materialFromIdentifier(id); + }; } void ItemWithMaterial::setMaterialUndefined() diff --git a/GUI/Model/Item/ItemWithMaterial.h b/GUI/Model/Item/ItemWithMaterial.h index b16f6cdbe5e6f18bdea8f494be3c4897615bff7c..d14d144f903174dcf2bd1b6c427e4e9737678887 100644 --- a/GUI/Model/Item/ItemWithMaterial.h +++ b/GUI/Model/Item/ItemWithMaterial.h @@ -20,12 +20,13 @@ class Material; class MaterialItem; +class MaterialModel; class QColor; class ItemWithMaterial { public: - //! Define the function that finds the linked material. - void setMaterialFinder(const std::function<MaterialItem*(const QString&)> fnFindMaterialById); + //! Define the material container where to find the linked material. + void setMaterialModel(const MaterialModel* materialModel); //! Set the material this item shall use. //! Stores the identifier, not the pointer! diff --git a/GUI/Model/Item/JobFunctions.cpp b/GUI/Model/Item/JobFunctions.cpp index 2f2d643f4d9a199b0c653ad24d8114d9d14acafb..065a95ea58ce9b26e3993d8e26ce838bf08400b6 100644 --- a/GUI/Model/Item/JobFunctions.cpp +++ b/GUI/Model/Item/JobFunctions.cpp @@ -122,8 +122,8 @@ void GUI::Model::JobFunctions::setupJobItemSampleData(JobItem* jobItem, // copy used materials into material container for (auto* itemWithMaterial : sampleItem->itemsWithMaterial()) { auto* material = itemWithMaterial->materialItem(); - if (!jobItem->materialModel().findMaterialItem(material->identifier())) - jobItem->materialModel().addMaterial(new MaterialItem(*material)); + if (!jobItem->materialItems().findMaterialItem(material->identifier())) + jobItem->materialItems().addMaterial(new MaterialItem(*material)); } } diff --git a/GUI/Model/Item/JobItem.cpp b/GUI/Model/Item/JobItem.cpp index 18125315748a9890cbadac9c5c4a9dd14184d8de..5efecc384a38c9fd30684fbf849ea48121e55664 100644 --- a/GUI/Model/Item/JobItem.cpp +++ b/GUI/Model/Item/JobItem.cpp @@ -18,6 +18,7 @@ #include "GUI/Model/Item/FitSuiteItem.h" #include "GUI/Model/Item/InstrumentItems.h" #include "GUI/Model/Item/IntensityDataItem.h" +#include "GUI/Model/Item/ItemWithMaterial.h" #include "GUI/Model/Item/JobItemUtils.h" #include "GUI/Model/Item/RealDataItem.h" #include "GUI/Model/Item/SpecularDataItem.h" @@ -248,7 +249,7 @@ MultiLayerItem* JobItem::copySampleIntoJob(const MultiLayerItem* sample) // initialize material container of items with material for (auto* itemWithMaterial : sampleItem()->itemsWithMaterial()) - m_materialModel.setFinderForItem(*itemWithMaterial); + itemWithMaterial->setMaterialModel(&m_materials); return &m_multiLayerItem; } @@ -381,7 +382,7 @@ void JobItem::writeNonSessionItems(QXmlStreamWriter* writer) const Serializer(writer).write<InstrumentItemCatalog>(Tags::Instrument, m_instrument.get()); writer->writeStartElement(Tags::Materials); - m_materialModel.writeContentTo(writer); + m_materials.writeContentTo(writer); writer->writeEndElement(); writer->writeStartElement(Tags::Sample); @@ -412,7 +413,7 @@ void JobItem::readNonSessionItems(QXmlStreamReader* reader) Serializer(reader).read<InstrumentItemCatalog>(Tags::Instrument, p); m_instrument.reset(p); } else if (reader->name() == Tags::Materials) { - m_materialModel.readContentFrom(reader); + m_materials.readContentFrom(reader); GUI::Session::XML::gotoEndElementOfTag(reader, Tags::Materials); } else if (reader->name() == Tags::ParameterContainer) { m_parameterContainer.readContentFrom(reader); @@ -424,14 +425,14 @@ void JobItem::readNonSessionItems(QXmlStreamReader* reader) } } -const MaterialModel& JobItem::materialModel() const +const MaterialModel& JobItem::materialItems() const { - return m_materialModel; + return m_materials; } -MaterialModel& JobItem::materialModel() +MaterialModel& JobItem::materialItems() { - return m_materialModel; + return m_materials; } bool JobItem::isSpecularJob() const diff --git a/GUI/Model/Item/JobItem.h b/GUI/Model/Item/JobItem.h index 407fef4b79469881449154301d708ef966b8b8d7..7d99adfc6129bc0072ceadd04d97eae853df85cc 100644 --- a/GUI/Model/Item/JobItem.h +++ b/GUI/Model/Item/JobItem.h @@ -142,15 +142,17 @@ public: void writeNonSessionItems(QXmlStreamWriter* writer) const override; void readNonSessionItems(QXmlStreamReader* reader) override; - const MaterialModel& materialModel() const; - MaterialModel& materialModel(); + const MaterialModel& materialItems() const; + MaterialModel& materialItems(); bool isSpecularJob() const; + friend class JobModel; + private: void updateIntensityDataFileName(); SimulationOptionsItem m_simulationOptionsItem; - MaterialModel m_materialModel; + MaterialModel m_materials; ParameterContainerItem m_parameterContainer; MultiLayerItem m_multiLayerItem; std::unique_ptr<InstrumentItem> m_instrument; diff --git a/GUI/Model/Item/ParameterTreeItems.cpp b/GUI/Model/Item/ParameterTreeItems.cpp index ab6c3ad208d22a61f1ce83d94fc9aa6d9034fcf0..2127bb2a96ddd1630dc52491146f417094723995 100644 --- a/GUI/Model/Item/ParameterTreeItems.cpp +++ b/GUI/Model/Item/ParameterTreeItems.cpp @@ -15,6 +15,7 @@ #include "GUI/Model/Item/ParameterTreeItems.h" #include "GUI/Model/Item/JobItem.h" #include "GUI/Model/Item/MaterialItem.h" +#include "GUI/Model/Model/MaterialModel.h" #include "GUI/Model/Types/VectorDescriptor.h" #include "GUI/Support/Data/XML.h" #include "GUI/Util/DeserializationException.h" diff --git a/GUI/Model/Item/ParticleCoreShellItem.cpp b/GUI/Model/Item/ParticleCoreShellItem.cpp index 7f55f80e8418f5bae07c7b65828788b579c62538..9f2a7a81aae955807c499eb4e894aa319f31d4d7 100644 --- a/GUI/Model/Item/ParticleCoreShellItem.cpp +++ b/GUI/Model/Item/ParticleCoreShellItem.cpp @@ -79,7 +79,7 @@ void ParticleCoreShellItem::clearCore() ParticleItem* ParticleCoreShellItem::createCore(MaterialModel* materials) { m_core.reset(new ParticleItem()); - materials->setFinderForItem(*m_core); + m_core->setMaterialModel(materials); m_core->setMaterial(materials->defaultMaterial()); return m_core.get(); } @@ -97,7 +97,7 @@ void ParticleCoreShellItem::clearShell() ParticleItem* ParticleCoreShellItem::createShell(MaterialModel* materials) { m_shell.reset(new ParticleItem()); - materials->setFinderForItem(*m_shell); + m_shell->setMaterialModel(materials); m_shell->setMaterial(materials->defaultMaterial()); // position is not used for shell item diff --git a/GUI/Model/Model/JobModel.cpp b/GUI/Model/Model/JobModel.cpp index a5b23b1f9e7f0cc6f40d664ffbeb14e693904e41..0020e0d8be4db230c8864faa95dddbf11fb80414 100644 --- a/GUI/Model/Model/JobModel.cpp +++ b/GUI/Model/Model/JobModel.cpp @@ -141,7 +141,7 @@ void JobModel::readFrom(QXmlStreamReader* reader, MessageService* messageService // initialize the material finder functions // #baSerialize this should be moved into jobItem's serialization method for (auto* itemWithMaterial : jobItem->sampleItem()->itemsWithMaterial()) - jobItem->materialModel().setFinderForItem(*itemWithMaterial); + itemWithMaterial->setMaterialModel(&jobItem->m_materials); // Create the not stored parameter tuning tree ParameterTreeBuilder(jobItem, false).build(); diff --git a/GUI/Model/Model/MaterialModel.cpp b/GUI/Model/Model/MaterialModel.cpp index e8c01df1e420f9d30ad34b8be2c44868e4cb3ef1..e1297626aee177e832d5dd493d38dd680b521f56 100644 --- a/GUI/Model/Model/MaterialModel.cpp +++ b/GUI/Model/Model/MaterialModel.cpp @@ -15,7 +15,6 @@ #include "GUI/Model/Model/MaterialModel.h" #include "Base/Util/Assert.h" #include "GUI/Model/Item/MaterialItem.h" -#include "GUI/Model/Item/ItemWithMaterial.h" #include "GUI/Support/Data/XML.h" #include "GUI/Util/DeserializationException.h" #include <QColor> @@ -153,13 +152,6 @@ MaterialItem* MaterialModel::findMaterialItem(const QString& identifier) const return nullptr; } -void MaterialModel::setFinderForItem(ItemWithMaterial& item) -{ - item.setMaterialFinder([=](const QString& id) { - return this->materialFromIdentifier(id); - }); -} - MaterialItem* MaterialModel::defaultMaterial() const { ASSERT(!materialItems().isEmpty()); diff --git a/GUI/Model/Model/MaterialModel.h b/GUI/Model/Model/MaterialModel.h index dc627605beebcd2cfd86950630807b916c3ede86..491efd791f556ec00285dacf8148f3eedc61178c 100644 --- a/GUI/Model/Model/MaterialModel.h +++ b/GUI/Model/Model/MaterialModel.h @@ -18,7 +18,6 @@ #include <QObject> #include <QVector> -class ItemWithMaterial; class MaterialItem; class QXmlStreamReader; class QXmlStreamWriter; @@ -51,8 +50,6 @@ public: const QVector<MaterialItem*>& materialItems() const; MaterialItem* findMaterialItem(const QString& identifier) const; - void setFinderForItem(ItemWithMaterial& item); - MaterialItem* defaultMaterial() const; void removeMaterial(const QString& identifier); diff --git a/GUI/Model/OfItem/ParameterTreeUtils.cpp b/GUI/Model/OfItem/ParameterTreeUtils.cpp index 1cd553b4c1a3472171834bcb5fe7353d0aafd928..646747da04cc9d29bf58367fd526c63894d1d2d4 100644 --- a/GUI/Model/OfItem/ParameterTreeUtils.cpp +++ b/GUI/Model/OfItem/ParameterTreeUtils.cpp @@ -89,7 +89,7 @@ void ParameterTreeBuilder::addMaterials() { auto* materialTopLabel = new ParameterLabelItem("Materials", parameterContainer()->parameterTreeRoot()); - for (auto* material : m_jobItem->materialModel().materialItems()) { + for (auto* material : m_jobItem->materialItems().materialItems()) { auto* materialLabel = new ParameterLabelItem(material->materialName(), materialTopLabel); if (material->hasRefractiveIndex()) { addParameterItem(materialLabel, material->delta()); diff --git a/GUI/Model/Project/ProjectDocument.cpp b/GUI/Model/Project/ProjectDocument.cpp index f53a19acd2791667b0f8c6ea4cc0e181a525d8c8..cac814cb11299c5773e778b44fb1df2b06620274 100644 --- a/GUI/Model/Project/ProjectDocument.cpp +++ b/GUI/Model/Project/ProjectDocument.cpp @@ -401,7 +401,7 @@ ProjectDocument::ReadResult ProjectDocument::readProject(QIODevice* device, // initialize all items with materials to find the materials for (auto* multiLayerItem : m_samples.multiLayerItems()) for (auto* itemWithMaterial : multiLayerItem->itemsWithMaterial()) - materialModel()->setFinderForItem(*itemWithMaterial); + itemWithMaterial->setMaterialModel(materialModel()); // make a sanity check whether all materials are present for (const auto* multiLayerItem : m_samples.multiLayerItems()) diff --git a/GUI/View/FromDomain/GUISampleBuilder.cpp b/GUI/View/FromDomain/GUISampleBuilder.cpp index 2f0da9341a78022f1218f4b93c0aaebd8818310b..171f90512be27f225d8cb245dd063e729d932a03 100644 --- a/GUI/View/FromDomain/GUISampleBuilder.cpp +++ b/GUI/View/FromDomain/GUISampleBuilder.cpp @@ -80,7 +80,7 @@ MultiLayerItem* GUISampleBuilder::createMultiLayerItem(MaterialModel* materialMo // initialize all items with materials to find the materials for (auto* itemWithMaterial : multilayerItem->itemsWithMaterial()) - materialModel->setFinderForItem(*itemWithMaterial); + itemWithMaterial->setMaterialModel(materialModel); return multilayerItem; } diff --git a/GUI/View/SampleDesigner/SampleEditorCommands.cpp b/GUI/View/SampleDesigner/SampleEditorCommands.cpp index db135020cd307d1a2bcf33964f9399167c535059..e457a8d293f7cccba0c244d1ea246e32c548335f 100644 --- a/GUI/View/SampleDesigner/SampleEditorCommands.cpp +++ b/GUI/View/SampleDesigner/SampleEditorCommands.cpp @@ -16,7 +16,6 @@ #include "GUI/Model/Item/LayerItem.h" #include "GUI/Model/Item/MultiLayerItem.h" -#include "GUI/Model/Model/MaterialModel.h" #include "GUI/Model/XML/Serializer.h" #include "GUI/View/SampleDesigner/MultiLayerForm.h" #include "GUI/View/SampleDesigner/SampleEditorController.h" @@ -74,7 +73,7 @@ void CommandRemoveLayer::undo() { LayerItem* restoredLayer = m_ec->multiLayerItem()->addLayer(m_indexOfLayer); deserialize(restoredLayer, m_layerItemBackup); - m_ec->materialModel()->setFinderForItem(*restoredLayer); + 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 52e34c90f0f38fad6d7d0672f67a191589177a5e..b10490892346c93719e59b98f2f6da87326083d2 100644 --- a/GUI/View/SampleDesigner/SampleEditorController.cpp +++ b/GUI/View/SampleDesigner/SampleEditorController.cpp @@ -101,7 +101,7 @@ void SampleEditorController::addLayer(LayerItem* before) // - create new layer LayerItem* layer = m_multiLayerItem->addLayer(rowInMultiLayer); - materialModel()->setFinderForItem(*layer); + layer->setMaterialModel(materialModel()); layer->setMaterial(materialModel()->defaultMaterial()); layer->setColor(color); @@ -214,7 +214,7 @@ ItemWithParticles* SampleEditorController::createAndInitParticle(FormFactorItemCatalog::Type formFactorType) const { auto* newParticle = new ParticleItem(); - materialModel()->setFinderForItem(*newParticle); + newParticle->setMaterialModel(materialModel()); newParticle->setFormFactor(FormFactorItemCatalog::create(formFactorType)); newParticle->setMaterial(materialModel()->defaultMaterial()); return newParticle; @@ -226,7 +226,7 @@ SampleEditorController::createAndInitParticle(ItemWithParticlesCatalog::Type ite auto* newItem = ItemWithParticlesCatalog::create(itemType); if (auto* p = dynamic_cast<ItemWithMaterial*>(newItem)) { - materialModel()->setFinderForItem(*p); + p->setMaterialModel(materialModel()); p->setMaterial(materialModel()->defaultMaterial()); } @@ -239,7 +239,7 @@ SampleEditorController::createAndInitParticle(ItemWithParticlesCatalog::Type ite if (auto* meso = dynamic_cast<MesoCrystalItem*>(newItem); meso && meso->basisParticle()) if (auto* p = dynamic_cast<ItemWithMaterial*>(meso->basisParticle())) { - materialModel()->setFinderForItem(*p); + p->setMaterialModel(materialModel()); p->setMaterial(materialModel()->defaultMaterial()); } diff --git a/Tests/Unit/GUI/TestRealSpaceBuilderUtils.cpp b/Tests/Unit/GUI/TestRealSpaceBuilderUtils.cpp index 3fe924cb2ca70c02fbd924c21f0c4bdfb8d1b5f7..0b8c202be6f56fdbf3b852846c00bf777b4f7b23 100644 --- a/Tests/Unit/GUI/TestRealSpaceBuilderUtils.cpp +++ b/Tests/Unit/GUI/TestRealSpaceBuilderUtils.cpp @@ -153,7 +153,7 @@ TEST_F(TestRealSpaceBuilderUtils, singleParticle3DContainer) auto particleItem = std::make_unique<ParticleItem>(); particleItem->setMaterial(materialModel.defaultMaterial()); - materialModel.setFinderForItem(*particleItem); + particleItem->setMaterialModel(&materialModel); EXPECT_EQ(particleItem->abundance(), 1.0); EXPECT_TRUE(dynamic_cast<CylinderItem*>(particleItem->formfactor_at_bottom())); @@ -186,9 +186,9 @@ TEST_F(TestRealSpaceBuilderUtils, particle3DContainerVector) particle1->setMaterial(materialModel.defaultMaterial()); particle2->setMaterial(materialModel.defaultMaterial()); particle3->setMaterial(materialModel.defaultMaterial()); - materialModel.setFinderForItem(*particle1); - materialModel.setFinderForItem(*particle2); - materialModel.setFinderForItem(*particle3); + particle1->setMaterialModel(&materialModel); + particle2->setMaterialModel(&materialModel); + particle3->setMaterialModel(&materialModel); layout->addParticle(particle1); layout->addParticle(particle2);