Skip to content
Snippets Groups Projects
Commit 65a9fdf1 authored by Matthias Puchner's avatar Matthias Puchner
Browse files

improve signaling of material changes

parent 4269007b
No related branches found
No related tags found
1 merge request!494Remove SessionModel/SessionItem from MaterialModel/MaterialItem
......@@ -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;
}
......
......@@ -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
......@@ -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();
}
......
......@@ -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();
}
......@@ -34,7 +34,7 @@ public:
private:
void selectMaterial();
void createWidgets();
void onMaterialChanged(MaterialItem* materialItem);
void onMaterialChanged();
ItemWithMaterial* m_item;
SampleEditorController* m_ec;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment