From 05366e9889a9f2d08d55a502ebf2195ba670a452 Mon Sep 17 00:00:00 2001
From: Mikhail Svechnikov <m.svechnikov@fz-juelich.de>
Date: Tue, 14 Feb 2023 18:05:54 +0100
Subject: [PATCH 1/8] add defaultParticleMaterialItem()

---
 GUI/Model/Sample/MaterialModel.cpp | 9 +++++++++
 GUI/Model/Sample/MaterialModel.h   | 1 +
 2 files changed, 10 insertions(+)

diff --git a/GUI/Model/Sample/MaterialModel.cpp b/GUI/Model/Sample/MaterialModel.cpp
index 5a9b12330a2..d632600c026 100644
--- a/GUI/Model/Sample/MaterialModel.cpp
+++ b/GUI/Model/Sample/MaterialModel.cpp
@@ -147,6 +147,15 @@ MaterialItem* MaterialModel::defaultMaterialItem() const
     return materialItems().front();
 }
 
+MaterialItem *MaterialModel::defaultParticleMaterialItem() const
+{
+    for(auto* material : materialItems())
+        if(material->matItemName() == "Particle")
+            return material;
+
+    return defaultMaterialItem();
+}
+
 void MaterialModel::removeMaterialItem(MaterialItem* materialItem)
 {
     m_materials.removeAll(materialItem);
diff --git a/GUI/Model/Sample/MaterialModel.h b/GUI/Model/Sample/MaterialModel.h
index 638d1424f16..4645bc2e951 100644
--- a/GUI/Model/Sample/MaterialModel.h
+++ b/GUI/Model/Sample/MaterialModel.h
@@ -47,6 +47,7 @@ public:
     const QVector<MaterialItem*>& materialItems() const;
 
     MaterialItem* defaultMaterialItem() const;
+    MaterialItem* defaultParticleMaterialItem() const;
 
     void removeMaterialItem(MaterialItem* materialItem);
 
-- 
GitLab


From 8f88b4fd3a6a5ffdda0af15a18eb23463f139f28 Mon Sep 17 00:00:00 2001
From: Mikhail Svechnikov <m.svechnikov@fz-juelich.de>
Date: Tue, 14 Feb 2023 18:07:46 +0100
Subject: [PATCH 2/8] use defaultParticleMaterialItem()

---
 GUI/View/SampleDesigner/SampleEditorController.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/GUI/View/SampleDesigner/SampleEditorController.cpp b/GUI/View/SampleDesigner/SampleEditorController.cpp
index 39dd711fb37..13f32e84c85 100644
--- a/GUI/View/SampleDesigner/SampleEditorController.cpp
+++ b/GUI/View/SampleDesigner/SampleEditorController.cpp
@@ -228,7 +228,7 @@ SampleEditorController::createAndInitItem(FormFactorItemCatalog::Type formFactor
 {
     auto* newParticle = new ParticleItem(materialModel());
     newParticle->setFormFactor(FormFactorItemCatalog::create(formFactorType));
-    newParticle->setMaterial(materialModel()->defaultMaterialItem());
+    newParticle->setMaterial(materialModel()->defaultParticleMaterialItem());
     return newParticle;
 }
 
-- 
GitLab


From 07a82edf85b780a444cc6b51cb41d35152b51da5 Mon Sep 17 00:00:00 2001
From: Mikhail Svechnikov <svechnikovmv@gmail.com>
Date: Tue, 14 Feb 2023 19:27:14 +0100
Subject: [PATCH 3/8] add defaultCoreMaterialItem()

---
 GUI/Model/Sample/MaterialModel.cpp | 11 ++++++++++-
 GUI/Model/Sample/MaterialModel.h   |  1 +
 2 files changed, 11 insertions(+), 1 deletion(-)

diff --git a/GUI/Model/Sample/MaterialModel.cpp b/GUI/Model/Sample/MaterialModel.cpp
index d632600c026..97e3b58263d 100644
--- a/GUI/Model/Sample/MaterialModel.cpp
+++ b/GUI/Model/Sample/MaterialModel.cpp
@@ -147,10 +147,19 @@ MaterialItem* MaterialModel::defaultMaterialItem() const
     return materialItems().front();
 }
 
+MaterialItem *MaterialModel::defaultCoreMaterialItem() const
+{
+    for(auto* material : materialItems())
+        if(material->matItemName() == material_name_map.key(DefaultMaterials::Particle_Core))
+            return material;
+
+    return defaultMaterialItem();
+}
+
 MaterialItem *MaterialModel::defaultParticleMaterialItem() const
 {
     for(auto* material : materialItems())
-        if(material->matItemName() == "Particle")
+        if(material->matItemName() == material_name_map.key(DefaultMaterials::Particle))
             return material;
 
     return defaultMaterialItem();
diff --git a/GUI/Model/Sample/MaterialModel.h b/GUI/Model/Sample/MaterialModel.h
index 4645bc2e951..72ae838d3ec 100644
--- a/GUI/Model/Sample/MaterialModel.h
+++ b/GUI/Model/Sample/MaterialModel.h
@@ -47,6 +47,7 @@ public:
     const QVector<MaterialItem*>& materialItems() const;
 
     MaterialItem* defaultMaterialItem() const;
+    MaterialItem* defaultCoreMaterialItem() const;
     MaterialItem* defaultParticleMaterialItem() const;
 
     void removeMaterialItem(MaterialItem* materialItem);
-- 
GitLab


From ab8e4d794a7d64a708c1f1d1faef1428ebc69539 Mon Sep 17 00:00:00 2001
From: Mikhail Svechnikov <svechnikovmv@gmail.com>
Date: Tue, 14 Feb 2023 19:27:59 +0100
Subject: [PATCH 4/8] set default materials for core and shell

---
 GUI/Model/Sample/CoreAndShellItem.cpp | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/GUI/Model/Sample/CoreAndShellItem.cpp b/GUI/Model/Sample/CoreAndShellItem.cpp
index dbd512cd702..74053181a0e 100644
--- a/GUI/Model/Sample/CoreAndShellItem.cpp
+++ b/GUI/Model/Sample/CoreAndShellItem.cpp
@@ -157,7 +157,7 @@ ParticleItem* CoreAndShellItem::coreItem() const
 ParticleItem* CoreAndShellItem::createCoreItem(const MaterialModel* materials)
 {
     m_core.reset(new ParticleItem(materials));
-    m_core->setMaterial(materials->defaultMaterialItem());
+    m_core->setMaterial(materials->defaultCoreMaterialItem());
     return m_core.get();
 }
 
@@ -169,7 +169,7 @@ ParticleItem* CoreAndShellItem::shellItem() const
 ParticleItem* CoreAndShellItem::createShellItem(const MaterialModel* materials)
 {
     m_shell.reset(new ParticleItem(materials));
-    m_shell->setMaterial(materials->defaultMaterialItem());
+    m_shell->setMaterial(materials->defaultParticleMaterialItem());
 
     // position is not used for shell item
     m_shell->setPosition({});
-- 
GitLab


From 757060555c24a4afeb9b31bd68046893b91a977f Mon Sep 17 00:00:00 2001
From: Mikhail Svechnikov <svechnikovmv@gmail.com>
Date: Tue, 14 Feb 2023 19:29:18 +0100
Subject: [PATCH 5/8] create map of material names

---
 GUI/Model/Sample/MaterialModel.cpp | 18 +++++++++++++-----
 GUI/Model/Sample/MaterialModel.h   |  5 +++++
 2 files changed, 18 insertions(+), 5 deletions(-)

diff --git a/GUI/Model/Sample/MaterialModel.cpp b/GUI/Model/Sample/MaterialModel.cpp
index 97e3b58263d..18402167175 100644
--- a/GUI/Model/Sample/MaterialModel.cpp
+++ b/GUI/Model/Sample/MaterialModel.cpp
@@ -29,13 +29,15 @@ const QString Material("Material");
 
 QColor suggestMaterialColor(const QString& name)
 {
-    if (name.contains("Vacuum"))
+    if (name.contains(material_name_map.key(DefaultMaterials::Vacuum)))
         return QColor(179, 242, 255);
-    if (name.contains("Substrate"))
+    if (name.contains(material_name_map.key(DefaultMaterials::Substrate)))
         return QColor(205, 102, 0);
-    if (name.contains("Default"))
+    if (name.contains(material_name_map.key(DefaultMaterials::Default)))
         return QColor(Qt::green);
-    if (name.contains("Particle"))
+    if (name.contains(material_name_map.key(DefaultMaterials::Core)))
+        return QColor(220, 140, 220);
+    if (name.contains(material_name_map.key(DefaultMaterials::Particle)))
         return QColor(146, 198, 255);
 
     // return a random color
@@ -48,6 +50,12 @@ QColor suggestMaterialColor(const QString& name)
 
 } // namespace
 
+QMap<QString, DefaultMaterials> material_name_map = {
+    {"Default", DefaultMaterials::Default},
+    {"Vacuum", DefaultMaterials::Vacuum},
+    {"Particle", DefaultMaterials::Particle},
+    {"Core", DefaultMaterials::Core},
+    {"Substrate", DefaultMaterials::Substrate}};
 
 MaterialModel::MaterialModel() {}
 
@@ -150,7 +158,7 @@ MaterialItem* MaterialModel::defaultMaterialItem() const
 MaterialItem *MaterialModel::defaultCoreMaterialItem() const
 {
     for(auto* material : materialItems())
-        if(material->matItemName() == material_name_map.key(DefaultMaterials::Particle_Core))
+        if(material->matItemName() == material_name_map.key(DefaultMaterials::Core))
             return material;
 
     return defaultMaterialItem();
diff --git a/GUI/Model/Sample/MaterialModel.h b/GUI/Model/Sample/MaterialModel.h
index 72ae838d3ec..059c6bdaccf 100644
--- a/GUI/Model/Sample/MaterialModel.h
+++ b/GUI/Model/Sample/MaterialModel.h
@@ -19,6 +19,11 @@
 #include <QVector>
 #include <QXmlStreamReader>
 
+//! Materials created by default
+enum class DefaultMaterials { Default, Vacuum, Particle, Core, Substrate };
+
+extern QMap<QString, DefaultMaterials> material_name_map;
+
 class MaterialItem;
 
 class MaterialModel : public QObject {
-- 
GitLab


From 9186107b3b5b4de9ac2c218d5b78e892b344dc10 Mon Sep 17 00:00:00 2001
From: Mikhail Svechnikov <svechnikovmv@gmail.com>
Date: Wed, 15 Feb 2023 12:25:58 +0100
Subject: [PATCH 6/8] upd standard materials

---
 GUI/Model/Sample/SampleItem.cpp | 24 ++++++++++++++++++++----
 1 file changed, 20 insertions(+), 4 deletions(-)

diff --git a/GUI/Model/Sample/SampleItem.cpp b/GUI/Model/Sample/SampleItem.cpp
index 3f0430e51cc..98331bab1d4 100644
--- a/GUI/Model/Sample/SampleItem.cpp
+++ b/GUI/Model/Sample/SampleItem.cpp
@@ -58,10 +58,26 @@ QVector<ItemWithMaterial*> SampleItem::itemsWithMaterial() const
 
 void SampleItem::addStandardMaterials()
 {
-    m_materials.addRefractiveMaterialItem("Default", 1e-3, 1e-5);
-    m_materials.addRefractiveMaterialItem("Vacuum", 0.0, 0.0);
-    m_materials.addRefractiveMaterialItem("Particle", 6e-4, 2e-8);
-    m_materials.addRefractiveMaterialItem("Substrate", 6e-6, 2e-8);
+    // add only non-existing materials
+    QString name = materialMap.key(DefaultMaterials::Default);
+    if (!m_materials.materialItemFromName(name))
+        m_materials.addRefractiveMaterialItem(name, 1e-3, 1e-5);
+
+    name = materialMap.key(DefaultMaterials::Vacuum);
+    if (!m_materials.materialItemFromName(name))
+        m_materials.addRefractiveMaterialItem(name, 0.0, 0.0);
+
+    name = materialMap.key(DefaultMaterials::Particle);
+    if (!m_materials.materialItemFromName(name))
+        m_materials.addRefractiveMaterialItem(name, 6e-4, 2e-8);
+
+    name = materialMap.key(DefaultMaterials::Core);
+    if (!m_materials.materialItemFromName(name))
+        m_materials.addRefractiveMaterialItem(name, 2e-4, 1e-8);
+
+    name = materialMap.key(DefaultMaterials::Substrate);
+    if (!m_materials.materialItemFromName(name))
+        m_materials.addRefractiveMaterialItem(name, 6e-6, 2e-8);
 }
 
 QVector<LayerItem*> SampleItem::layerItems() const
-- 
GitLab


From 1a67dd0a844778378af66250ef73e1c8911d83bd Mon Sep 17 00:00:00 2001
From: Mikhail Svechnikov <m.svechnikov@fz-juelich.de>
Date: Wed, 15 Feb 2023 12:14:10 +0100
Subject: [PATCH 7/8] add standard materials to examples

---
 GUI/Model/FromCore/ItemizeSample.cpp | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/GUI/Model/FromCore/ItemizeSample.cpp b/GUI/Model/FromCore/ItemizeSample.cpp
index c9cb63d14e5..201658ff173 100644
--- a/GUI/Model/FromCore/ItemizeSample.cpp
+++ b/GUI/Model/FromCore/ItemizeSample.cpp
@@ -667,6 +667,9 @@ SampleItem* itemizeSample(const MultiLayer& sample, const QString& nodeName)
         }
     }
 
+    // append standard materials to the example-specific ones
+    result->addStandardMaterials();
+
     return result;
 }
 
-- 
GitLab


From dee03b163b00a09da61649987cf23be82c1c3836 Mon Sep 17 00:00:00 2001
From: Mikhail Svechnikov <svechnikovmv@gmail.com>
Date: Tue, 14 Feb 2023 19:38:32 +0100
Subject: [PATCH 8/8] clang-format

---
 GUI/Model/Sample/MaterialModel.cpp | 33 +++++++++++++++---------------
 GUI/Model/Sample/MaterialModel.h   |  2 +-
 2 files changed, 17 insertions(+), 18 deletions(-)

diff --git a/GUI/Model/Sample/MaterialModel.cpp b/GUI/Model/Sample/MaterialModel.cpp
index 18402167175..8fae8c67196 100644
--- a/GUI/Model/Sample/MaterialModel.cpp
+++ b/GUI/Model/Sample/MaterialModel.cpp
@@ -29,15 +29,15 @@ const QString Material("Material");
 
 QColor suggestMaterialColor(const QString& name)
 {
-    if (name.contains(material_name_map.key(DefaultMaterials::Vacuum)))
+    if (name.contains(materialMap.key(DefaultMaterials::Vacuum)))
         return QColor(179, 242, 255);
-    if (name.contains(material_name_map.key(DefaultMaterials::Substrate)))
+    if (name.contains(materialMap.key(DefaultMaterials::Substrate)))
         return QColor(205, 102, 0);
-    if (name.contains(material_name_map.key(DefaultMaterials::Default)))
+    if (name.contains(materialMap.key(DefaultMaterials::Default)))
         return QColor(Qt::green);
-    if (name.contains(material_name_map.key(DefaultMaterials::Core)))
+    if (name.contains(materialMap.key(DefaultMaterials::Core)))
         return QColor(220, 140, 220);
-    if (name.contains(material_name_map.key(DefaultMaterials::Particle)))
+    if (name.contains(materialMap.key(DefaultMaterials::Particle)))
         return QColor(146, 198, 255);
 
     // return a random color
@@ -50,12 +50,11 @@ QColor suggestMaterialColor(const QString& name)
 
 } // namespace
 
-QMap<QString, DefaultMaterials> material_name_map = {
-    {"Default", DefaultMaterials::Default},
-    {"Vacuum", DefaultMaterials::Vacuum},
-    {"Particle", DefaultMaterials::Particle},
-    {"Core", DefaultMaterials::Core},
-    {"Substrate", DefaultMaterials::Substrate}};
+QMap<QString, DefaultMaterials> materialMap = {{"Default", DefaultMaterials::Default},
+                                               {"Vacuum", DefaultMaterials::Vacuum},
+                                               {"Particle", DefaultMaterials::Particle},
+                                               {"Core", DefaultMaterials::Core},
+                                               {"Substrate", DefaultMaterials::Substrate}};
 
 MaterialModel::MaterialModel() {}
 
@@ -155,19 +154,19 @@ MaterialItem* MaterialModel::defaultMaterialItem() const
     return materialItems().front();
 }
 
-MaterialItem *MaterialModel::defaultCoreMaterialItem() const
+MaterialItem* MaterialModel::defaultCoreMaterialItem() const
 {
-    for(auto* material : materialItems())
-        if(material->matItemName() == material_name_map.key(DefaultMaterials::Core))
+    for (auto* material : materialItems())
+        if (material->matItemName() == materialMap.key(DefaultMaterials::Core))
             return material;
 
     return defaultMaterialItem();
 }
 
-MaterialItem *MaterialModel::defaultParticleMaterialItem() const
+MaterialItem* MaterialModel::defaultParticleMaterialItem() const
 {
-    for(auto* material : materialItems())
-        if(material->matItemName() == material_name_map.key(DefaultMaterials::Particle))
+    for (auto* material : materialItems())
+        if (material->matItemName() == materialMap.key(DefaultMaterials::Particle))
             return material;
 
     return defaultMaterialItem();
diff --git a/GUI/Model/Sample/MaterialModel.h b/GUI/Model/Sample/MaterialModel.h
index 059c6bdaccf..5119a3c6a02 100644
--- a/GUI/Model/Sample/MaterialModel.h
+++ b/GUI/Model/Sample/MaterialModel.h
@@ -22,7 +22,7 @@
 //! Materials created by default
 enum class DefaultMaterials { Default, Vacuum, Particle, Core, Substrate };
 
-extern QMap<QString, DefaultMaterials> material_name_map;
+extern QMap<QString, DefaultMaterials> materialMap;
 
 class MaterialItem;
 
-- 
GitLab