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