From c049e96bdb8bc03409965d967deda564c37839b1 Mon Sep 17 00:00:00 2001
From: Tobias Knopff <t.knopff@fz-juelich.de>
Date: Mon, 10 May 2021 09:06:31 +0200
Subject: [PATCH] Add templated add function to ItemCatalog for types which
 implement the Item::M_TYPE protocol

---
 GUI/Models/ItemCatalog.cpp | 22 ++++++++++++++--------
 GUI/Models/ItemCatalog.h   |  2 ++
 2 files changed, 16 insertions(+), 8 deletions(-)

diff --git a/GUI/Models/ItemCatalog.cpp b/GUI/Models/ItemCatalog.cpp
index 2b4a41fcd5d..c890517c3e2 100644
--- a/GUI/Models/ItemCatalog.cpp
+++ b/GUI/Models/ItemCatalog.cpp
@@ -80,8 +80,8 @@ ItemCatalog::ItemCatalog()
     add("GISASInstrument", create_new<GISASInstrumentItem>);
     add("OffSpecularInstrument", create_new<OffSpecularInstrumentItem>);
     add("SpecularInstrument", create_new<SpecularInstrumentItem>);
-    add(GISASBeamItem::M_TYPE, create_new<GISASBeamItem>);
-    add(SpecularBeamItem::M_TYPE, create_new<SpecularBeamItem>);
+    addItem<GISASBeamItem>();
+    addItem<SpecularBeamItem>();
     add("NoBackground", create_new<BackgroundNoneItem>);
     add("ConstantBackground", create_new<ConstantBackgroundItem>);
     add("PoissonNoiseBackground", create_new<PoissonNoiseBackgroundItem>);
@@ -165,16 +165,16 @@ ItemCatalog::ItemCatalog()
     add("SquareLattice2D", create_new<SquareLattice2DItem>);
     add("HexagonalLattice2D", create_new<HexagonalLattice2DItem>);
 
-    add(MaterialItem::M_TYPE, create_new<MaterialItem>);
-    add(MaterialItemContainer::M_TYPE, create_new<MaterialItemContainer>);
+    addItem<MaterialItem>();
+    addItem<MaterialItemContainer>();
 
-    add(MaterialRefractiveDataItem::M_TYPE, create_new<MaterialRefractiveDataItem>);
-    add(MaterialSLDDataItem::M_TYPE, create_new<MaterialSLDDataItem>);
+    addItem<MaterialRefractiveDataItem>();
+    addItem<MaterialSLDDataItem>();
 
     add("JobItem", create_new<JobItem>);
 
-    add(IntensityDataItem::M_TYPE, create_new<IntensityDataItem>);
-    add(SpecularDataItem::M_TYPE, create_new<SpecularDataItem>);
+    addItem<IntensityDataItem>();
+    addItem<SpecularDataItem>();
     add("Data1DViewItem", create_new<Data1DViewItem>);
     add("DataPropertyContainer", create_new<DataPropertyContainer>);
     add("DataItem1DProperties", create_new<Data1DProperties>);
@@ -269,3 +269,9 @@ void ItemCatalog::add(const QString& modelType, std::function<SessionItem*()> f)
 {
     m_data.registerItem(modelType, f);
 }
+
+template<typename T>
+void ItemCatalog::addItem()
+{
+    m_data.registerItem(T::M_TYPE, create_new<T>);
+}
diff --git a/GUI/Models/ItemCatalog.h b/GUI/Models/ItemCatalog.h
index f1b36f8bc2b..b995c3ea53c 100644
--- a/GUI/Models/ItemCatalog.h
+++ b/GUI/Models/ItemCatalog.h
@@ -34,6 +34,8 @@ public:
 private:
     void add(const QString& modelType, std::function<SessionItem*()> f);
 
+    template <typename T> void addItem();
+    
     IFactory<QString, SessionItem> m_data;
 };
 
-- 
GitLab