diff --git a/GUI/Model/Material/MaterialModel.cpp b/GUI/Model/Material/MaterialModel.cpp index b70ba9e0bb899afbf24b3081da0870f90ec766e6..b0ccfbb5aa025183f7322bd0527bb833118f38fa 100644 --- a/GUI/Model/Material/MaterialModel.cpp +++ b/GUI/Model/Material/MaterialModel.cpp @@ -62,12 +62,28 @@ void MaterialModel::clear() m_materialItems.clear(); } +void MaterialModel::addMaterial(MaterialItem* material) +{ + addMaterial(material, true); +} + +void MaterialModel::addMaterial(MaterialItem* material, bool signalAdding) +{ + ASSERT(material); + material->disconnect(this); + m_materialItems << material; + connect(material, &MaterialItem::dataChanged, this, [=] { emit materialChanged(material); }); + + if (signalAdding) + emit materialAddedOrRemoved(); +} + MaterialModel* MaterialModel::createCopy() const { auto* result = new MaterialModel(); for (const auto* m : m_materialItems) - result->m_materialItems << new MaterialItem(*m); + result->addMaterial(new MaterialItem(*m)); return result; } @@ -78,8 +94,7 @@ MaterialItem* MaterialModel::addRefractiveMaterial(const QString& name, double d materialItem->setMaterialName(name); materialItem->setColor(suggestMaterialColor(name)); materialItem->setRefractiveIndex(delta, beta); - m_materialItems << materialItem; - emit materialAddedOrRemoved(); + addMaterial(materialItem); return materialItem; } @@ -90,8 +105,7 @@ MaterialItem* MaterialModel::addSLDMaterial(const QString& name, double sld, dou materialItem->setMaterialName(name); materialItem->setColor(suggestMaterialColor(name)); materialItem->setScatteringLengthDensity(complex_t(sld, abs_term)); - m_materialItems << materialItem; - emit materialAddedOrRemoved(); + addMaterial(materialItem); return materialItem; } @@ -119,8 +133,7 @@ MaterialItem* MaterialModel::insertCopy(const MaterialItem& material) auto* newMaterial = new MaterialItem(material); newMaterial->createNewIdentifier(); newMaterial->setMaterialName(material.materialName() + " (copy)"); - m_materialItems << newMaterial; - emit materialAddedOrRemoved(); + addMaterial(newMaterial); return newMaterial; } @@ -181,7 +194,7 @@ void MaterialModel::readContentFrom(QXmlStreamReader* reader) if (reader->name() == "Material") { MaterialItem* m = new MaterialItem; m->readContentFrom(reader); - m_materialItems << m; + addMaterial(m, false); reader->skipCurrentElement(); } } @@ -209,7 +222,7 @@ void MaterialModel::initFrom(const MaterialModel& from) // copy new ones for (const auto* m : from.materialItems()) if (!findMaterialItem(m->identifier())) { - m_materialItems << new MaterialItem(*m); + addMaterial(new MaterialItem(*m), false); anyAddedOrRemoved = true; } diff --git a/GUI/Model/Material/MaterialModel.h b/GUI/Model/Material/MaterialModel.h index 1156e4a4dfa2e97f456ec90017b8fc849c8620f2..96ff5b68f7214ef40b3364750463dab798b2a696 100644 --- a/GUI/Model/Material/MaterialModel.h +++ b/GUI/Model/Material/MaterialModel.h @@ -31,6 +31,9 @@ public: void clear(); + //! Add the material and take ownership of it. + void addMaterial(MaterialItem* material); + MaterialModel* createCopy() const; MaterialItem* addRefractiveMaterial(const QString& name, double delta, double beta); @@ -67,7 +70,13 @@ signals: void materialChanged(MaterialItem* materialItem); private: - QVector<MaterialItem*> m_materialItems; + //! Add the material and take ownership of it. + //! + //! In the given flag the signal "materialAddedOrRemoved" can be suppressed. + void addMaterial(MaterialItem* material, bool signalAdding); + +private: + QVector<MaterialItem*> m_materialItems; //!< all materials (owned by this class) }; #endif // BORNAGAIN_GUI_MODEL_MATERIAL_MATERIALMODEL_H diff --git a/GUI/View/SampleDesigner/LayerForm.cpp b/GUI/View/SampleDesigner/LayerForm.cpp index 8d424affb24ef23aec8ba8b49000e59ae2836f3b..32237a2958fc4ee52c893e6a77ae6b3094ff06e3 100644 --- a/GUI/View/SampleDesigner/LayerForm.cpp +++ b/GUI/View/SampleDesigner/LayerForm.cpp @@ -13,6 +13,8 @@ // ************************************************************************************************ #include "GUI/View/SampleDesigner/LayerForm.h" +#include "GUI/Model/Material/MaterialItem.h" +#include "GUI/Model/Material/MaterialModel.h" #include "GUI/Model/Sample/LayerItem.h" #include "GUI/Model/Sample/MultiLayerItem.h" #include "GUI/Model/Types/UIntDescriptor.h" @@ -90,6 +92,10 @@ LayerForm::LayerForm(QWidget* parent, LayerItem* layer, SampleEditorController* m_structureEditingWidgets << btn; m_layouter->addStructureEditingRow(btn); + // listen to changes in materials to update the title (contains the material name). Necessary + // to reflect e.g. a name change done in the material editor. + connect(ec->materialModel(), &MaterialModel::materialChanged, this, &LayerForm::updateTitle); + updateLayerPositionDependentElements(); } diff --git a/GUI/View/SampleDesigner/MaterialInplaceForm.cpp b/GUI/View/SampleDesigner/MaterialInplaceForm.cpp index 20d18d4951907f23235c8539004db1d63155dcc3..7a123f8a54c847645211b4f0e3f6a284c5077ab9 100644 --- a/GUI/View/SampleDesigner/MaterialInplaceForm.cpp +++ b/GUI/View/SampleDesigner/MaterialInplaceForm.cpp @@ -39,7 +39,7 @@ MaterialInplaceForm::MaterialInplaceForm(QWidget* parent, ItemWithMaterial* item m_layout->setContentsMargins(0, 0, 0, 0); createWidgets(); - connect(ec->materialModel(), &MaterialModel::materialChanged, this, + connect(itemWithMaterial()->materialItem(), &MaterialItem::dataChanged, this, &MaterialInplaceForm::onMaterialChanged); } @@ -66,9 +66,12 @@ void MaterialInplaceForm::selectMaterial() baWin, m_ec->projectDocument(), m_item->materialIdentifier()); if (!newMaterialIdentifier.isEmpty() && newMaterialIdentifier != m_item->materialIdentifier()) { + itemWithMaterial()->materialItem()->disconnect(this); GUI::Util::Layout::clearLayout(m_layout, true); m_ec->selectMaterial(m_item, newMaterialIdentifier); createWidgets(); + connect(itemWithMaterial()->materialItem(), &MaterialItem::dataChanged, this, + &MaterialInplaceForm::onMaterialChanged); } else updateValues(); // necessary, since in the material editor the values could have been // changed without selecting a different material @@ -115,8 +118,7 @@ void MaterialInplaceForm::createWidgets() m_layout->addItem(new QSpacerItem(0, 0, QSizePolicy::Expanding), 0, m_layout->columnCount()); } -void MaterialInplaceForm::onMaterialChanged(MaterialItem* materialItem) +void MaterialInplaceForm::onMaterialChanged() { - if (materialItem->identifier() == m_item->materialIdentifier()) - updateValues(); + updateValues(); } diff --git a/GUI/View/SampleDesigner/MaterialInplaceForm.h b/GUI/View/SampleDesigner/MaterialInplaceForm.h index bc8325fa3514d4bb931b99295c2f20bc4619ed9c..db0fd6b063cc45b1df8c457018ff5e2b668b4272 100644 --- a/GUI/View/SampleDesigner/MaterialInplaceForm.h +++ b/GUI/View/SampleDesigner/MaterialInplaceForm.h @@ -34,7 +34,7 @@ public: private: void selectMaterial(); void createWidgets(); - void onMaterialChanged(MaterialItem* materialItem); + void onMaterialChanged(); ItemWithMaterial* m_item; SampleEditorController* m_ec;