From 8ad4d93e59e9dddc00e22caa452f87ce10f65e28 Mon Sep 17 00:00:00 2001
From: Matthias Puchner <github@mpuchner.de>
Date: Wed, 1 Dec 2021 07:19:59 +0100
Subject: [PATCH] Simplify MaterialInPlaceForm with new MaterialModel

the materials are not deleted and created any more after closing the material selection dialog => no need to take care of material deletion
---
 .../SampleDesigner/MaterialInplaceForm.cpp    | 60 ++-----------------
 GUI/View/SampleDesigner/MaterialInplaceForm.h |  1 -
 2 files changed, 6 insertions(+), 55 deletions(-)

diff --git a/GUI/View/SampleDesigner/MaterialInplaceForm.cpp b/GUI/View/SampleDesigner/MaterialInplaceForm.cpp
index b5e638a814d..757ee6bff2f 100644
--- a/GUI/View/SampleDesigner/MaterialInplaceForm.cpp
+++ b/GUI/View/SampleDesigner/MaterialInplaceForm.cpp
@@ -77,44 +77,14 @@ void MaterialInplaceForm::selectMaterial()
 
 void MaterialInplaceForm::createWidgets()
 {
-    // We can not use the DoubleDescriptors from the MaterialItem itself, because e.g. when editing
-    // a material in the material editor, the whole material model will be created from scratch.
-    // This means, that all SessionItems will be deleted. If we would use these SessionItems, a
-    // crash will happen once an access takes place.
-    // What not changes is the material identifier (it is not changed when
-    // material is edited in the material editor dialog). Therefore DoubleDescriptors have to be
-    // created which use the material identifier for every access.
-    // In the following, first the descriptors are copied
-    // from the MaterialItem descriptors to get the labels, tooltips etc. Then for set, get &
-    // path the functions are redefined to use the material identifier.
+    auto* material = m_item->materialItem();
 
     // -- Create UI for delta/beta resp. sldRe/sldIm
     DoubleDescriptors values;
-    if (material()->hasRefractiveIndex()) {
-        DoubleDescriptor delta = material()->delta();
-        delta.set = [=](double value) { material()->delta().set(value); };
-        delta.get = [=]() { return material()->delta(); };
-        delta.path = [=] { return GUI::Model::Path::getPathFromItem(m_item) + "/delta"; };
-
-        DoubleDescriptor beta = material()->beta();
-        beta.set = [=](double value) { material()->beta().set(value); };
-        beta.get = [=]() { return material()->beta(); };
-        beta.path = [=] { return GUI::Model::Path::getPathFromItem(m_item) + "/beta"; };
-
-        values << delta << beta;
-    } else {
-        DoubleDescriptor re = material()->sldRe();
-        re.set = [=](double value) { material()->sldRe().set(value); };
-        re.get = [=]() { return material()->sldRe(); };
-        re.path = [=] { return GUI::Model::Path::getPathFromItem(m_item) + "/re"; };
-
-        DoubleDescriptor im = material()->sldIm();
-        im.set = [=](double value) { material()->sldIm().set(value); };
-        im.get = [=]() { return material()->sldIm(); };
-        im.path = [=] { return GUI::Model::Path::getPathFromItem(m_item) + "/im"; };
-
-        values << re << im;
-    }
+    if (material->hasRefractiveIndex())
+        values << material->delta() << material->beta();
+    else
+        values << material->sldRe() << material->sldIm();
 
     int col = 0;
     for (const auto& d : values) {
@@ -130,23 +100,10 @@ void MaterialInplaceForm::createWidgets()
     }
 
     // -- Create UI for magnetization vector
-    VectorDescriptor mag = material()->magnetizationVector();
-    mag.x.set = [=](double value) { material()->magnetizationVector().x.set(value); };
-    mag.x.get = [=]() { return material()->magnetizationVector().x; };
-    mag.x.path = [=] { return GUI::Model::Path::getPathFromItem(m_item) + "/x"; };
-
-    mag.y.set = [=](double value) { material()->magnetizationVector().y.set(value); };
-    mag.y.get = [=]() { return material()->magnetizationVector().y; };
-    mag.y.path = [=] { return GUI::Model::Path::getPathFromItem(m_item) + "/y"; };
-
-    mag.z.set = [=](double value) { material()->magnetizationVector().z.set(value); };
-    mag.z.get = [=]() { return material()->magnetizationVector().z; };
-    mag.z.path = [=] { return GUI::Model::Path::getPathFromItem(m_item) + "/z"; };
-
+    VectorDescriptor mag = material->magnetizationVector();
     const auto setNewValue = [=](double value, DoubleDescriptor d) {
         m_ec->setMaterialValue(m_item, value, d);
     };
-
     LayerEditorUtils::addVectorToGrid(m_layout, col, mag, setNewValue, true, false);
 
     // -- Create UI for material selection button
@@ -158,11 +115,6 @@ void MaterialInplaceForm::createWidgets()
     m_layout->addItem(new QSpacerItem(0, 0, QSizePolicy::Expanding), 0, m_layout->columnCount());
 }
 
-MaterialItem* MaterialInplaceForm::material()
-{
-    return m_item->materialItem();
-}
-
 void MaterialInplaceForm::onMaterialChanged(MaterialItem* materialItem)
 {
     if (materialItem->identifier() == m_item->materialIdentifier())
diff --git a/GUI/View/SampleDesigner/MaterialInplaceForm.h b/GUI/View/SampleDesigner/MaterialInplaceForm.h
index 0d1faa4fc12..bc8325fa351 100644
--- a/GUI/View/SampleDesigner/MaterialInplaceForm.h
+++ b/GUI/View/SampleDesigner/MaterialInplaceForm.h
@@ -34,7 +34,6 @@ public:
 private:
     void selectMaterial();
     void createWidgets();
-    MaterialItem* material();
     void onMaterialChanged(MaterialItem* materialItem);
 
     ItemWithMaterial* m_item;
-- 
GitLab