From d30949d8f288a626f5b82e208cf9115aa428a7f6 Mon Sep 17 00:00:00 2001
From: Dmitry Yurov <d.yurov@fz-juelich.de>
Date: Tue, 6 Nov 2018 13:44:49 +0100
Subject: [PATCH] MaterialItemContainer implementation

Redmine: #2142
---
 GUI/coregui/Models/ItemCatalogue.cpp         |  2 +
 GUI/coregui/Models/MaterialItemContainer.cpp | 53 ++++++++++++++++++++
 GUI/coregui/Models/MaterialItemContainer.h   | 37 ++++++++++++++
 GUI/coregui/Models/item_constants.h          |  1 +
 4 files changed, 93 insertions(+)
 create mode 100644 GUI/coregui/Models/MaterialItemContainer.cpp
 create mode 100644 GUI/coregui/Models/MaterialItemContainer.h

diff --git a/GUI/coregui/Models/ItemCatalogue.cpp b/GUI/coregui/Models/ItemCatalogue.cpp
index 3f29a648dc5..90fac32bf07 100644
--- a/GUI/coregui/Models/ItemCatalogue.cpp
+++ b/GUI/coregui/Models/ItemCatalogue.cpp
@@ -39,6 +39,7 @@
 #include "LayerRoughnessItems.h"
 #include "MaskItems.h"
 #include "MaterialDataItems.h"
+#include "MaterialItemContainer.h"
 #include "MaterialItem.h"
 #include "MesoCrystalItem.h"
 #include "MinimizerItem.h"
@@ -170,6 +171,7 @@ ItemCatalogue::ItemCatalogue()
     add(Constants::HexagonalLatticeType, create_new<HexagonalLatticeItem>);
 
     add(Constants::MaterialType, create_new<MaterialItem>);
+    add(Constants::MaterialContainerType, create_new<MaterialItemContainer>);
 
     add(Constants::MaterialRefractiveDataType, create_new<MaterialRefractiveDataItem>);
     add(Constants::MaterialSLDDataType, create_new<MaterialSLDDataItem>);
diff --git a/GUI/coregui/Models/MaterialItemContainer.cpp b/GUI/coregui/Models/MaterialItemContainer.cpp
new file mode 100644
index 00000000000..f6b2661a4fb
--- /dev/null
+++ b/GUI/coregui/Models/MaterialItemContainer.cpp
@@ -0,0 +1,53 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/MaterialItemContainer.cpp
+//! @brief     Implements class MaterialItemContainer
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2018
+//! @authors   Scientific Computing Group at MLZ (see CITATION, AUTHORS)
+//
+// ************************************************************************** //
+
+#include "MaterialItemContainer.h"
+#include "GUIHelpers.h"
+#include "MaterialItem.h"
+#include "SessionModel.h"
+
+const QString MaterialItemContainer::T_MATERIALS = "MaterialVector";
+
+MaterialItemContainer::MaterialItemContainer()
+    :SessionItem(Constants::MaterialContainerType)
+{
+    setItemName("Materials");
+    registerTag(T_MATERIALS, 0, -1, QStringList{Constants::MaterialType});
+}
+
+MaterialItem* MaterialItemContainer::insertCopy(MaterialItem* material_item)
+{
+    MaterialItem* item_copy =
+        dynamic_cast<MaterialItem*>(model()->copyItem(material_item, this, T_MATERIALS));
+    item_copy->setItemValue(MaterialItem::P_IDENTIFIER, GUIHelpers::createUuid());
+
+    return item_copy;
+}
+
+MaterialItem* MaterialItemContainer::findMaterialById(QString id)
+{
+    return const_cast<MaterialItem*>(
+        static_cast<const MaterialItemContainer*>(this)->findMaterialById(id));
+}
+
+const MaterialItem* MaterialItemContainer::findMaterialById(QString id) const
+{
+    auto materials = getItems(T_MATERIALS);
+    for (auto item: materials) {
+        auto material = dynamic_cast<MaterialItem*>(item);
+        if (material->identifier() == id)
+            return material;
+    }
+    return nullptr;
+}
diff --git a/GUI/coregui/Models/MaterialItemContainer.h b/GUI/coregui/Models/MaterialItemContainer.h
new file mode 100644
index 00000000000..2f3c906da22
--- /dev/null
+++ b/GUI/coregui/Models/MaterialItemContainer.h
@@ -0,0 +1,37 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/MaterialItemContainer.h
+//! @brief     Defines class MaterialItemContainer
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2018
+//! @authors   Scientific Computing Group at MLZ (see CITATION, AUTHORS)
+//
+// ************************************************************************** //
+
+#ifndef MATERIALITEMCONTAINER_H
+#define MATERIALITEMCONTAINER_H
+
+#include "SessionItem.h"
+
+class MaterialItem;
+
+class MaterialItemContainer : public SessionItem
+{
+public:
+    static const QString T_MATERIALS;
+
+    MaterialItemContainer();
+
+    //! Copies MaterialItem, inserts it into the container
+    //! and returns a pointer to the copy.
+    MaterialItem* insertCopy(MaterialItem* material_item);
+
+    const MaterialItem* findMaterialById(QString id) const;
+    MaterialItem* findMaterialById(QString id);
+};
+
+#endif // MATERIALITEMCONTAINER_H
diff --git a/GUI/coregui/Models/item_constants.h b/GUI/coregui/Models/item_constants.h
index 56993f769c7..5976956d294 100644
--- a/GUI/coregui/Models/item_constants.h
+++ b/GUI/coregui/Models/item_constants.h
@@ -122,6 +122,7 @@ const ModelType SquareLatticeType = "SquareLattice";
 const ModelType HexagonalLatticeType = "HexagonalLattice";
 
 const ModelType MaterialType = "Material";
+const ModelType MaterialContainerType = "MaterialContainer";
 
 const ModelType MaterialRefractiveDataType = "MaterialRefractiveData";
 const ModelType MaterialSLDDataType = "MaterialSLDData";
-- 
GitLab