From 51a128efa4b2b7749dd9fe365d11bcc25d8ccd0f Mon Sep 17 00:00:00 2001
From: Tobias Knopff <t.knopff@fz-juelich.de>
Date: Wed, 2 Jun 2021 12:44:55 +0200
Subject: [PATCH] Make JobItem::T_OUTPUT private

---
 GUI/Models/DataItemUtils.cpp                    |  3 ++-
 GUI/Models/JobItem.cpp                          |  5 +++++
 GUI/Models/JobItem.h                            | 14 +++++++++++++-
 GUI/Models/JobModel.cpp                         |  2 +-
 GUI/Models/JobModelFunctions.cpp                |  4 ++--
 GUI/Views/TestView.cpp                          |  2 +-
 Tests/UnitTests/GUI/TestOutputDataIOService.cpp |  5 ++---
 Tests/UnitTests/GUI/TestSavingSpecularData.cpp  |  3 +--
 8 files changed, 27 insertions(+), 11 deletions(-)

diff --git a/GUI/Models/DataItemUtils.cpp b/GUI/Models/DataItemUtils.cpp
index 38ad5b63137..81c8206b929 100644
--- a/GUI/Models/DataItemUtils.cpp
+++ b/GUI/Models/DataItemUtils.cpp
@@ -25,7 +25,8 @@ template <class DataItemType> DataItemType* dataItem(SessionItem* parent)
     ASSERT(parent && "Assertion failed in DataItemUtils::dataItem: nullptr passed.");
 
     if (parent->modelType() == "JobItem")
-        return dynamic_cast<DataItemType*>(parent->getItem(JobItem::T_OUTPUT));
+        return dynamic_cast<DataItemType*>
+            (dynamic_cast<JobItem*>(parent)->dataItem());
     else if (auto real_data = dynamic_cast<RealDataItem*>(parent))
         return dynamic_cast<DataItemType*>(real_data->dataItem());
     else if (auto self = dynamic_cast<DataItemType*>(parent))
diff --git a/GUI/Models/JobItem.cpp b/GUI/Models/JobItem.cpp
index ba852bf2afc..d43d2e48d44 100644
--- a/GUI/Models/JobItem.cpp
+++ b/GUI/Models/JobItem.cpp
@@ -118,6 +118,11 @@ DataItem* JobItem::dataItem()
     return dynamic_cast<DataItem*>(getItem(T_OUTPUT));
 }
 
+void JobItem::addDataItem(DataItem* data)
+{
+    insertItem(-1, data, T_OUTPUT);
+}
+
 QString JobItem::getStatus() const
 {
     return getItemValue(P_STATUS).toString();
diff --git a/GUI/Models/JobItem.h b/GUI/Models/JobItem.h
index be60f0130aa..77e72ae693c 100644
--- a/GUI/Models/JobItem.h
+++ b/GUI/Models/JobItem.h
@@ -16,6 +16,7 @@
 #define BORNAGAIN_GUI_MODELS_JOBITEM_H
 
 #include "GUI/Models/SessionItem.h"
+#include "GUI/Models/SessionModel.h"
 
 class DataItem;
 class Data1DViewItem;
@@ -47,9 +48,9 @@ private:
     static const QString T_SAMPLE;
     static const QString T_MATERIAL_CONTAINER;
     static const QString T_INSTRUMENT;
+    static const QString T_OUTPUT;
 
 public:
-    static const QString T_OUTPUT;
     static const QString T_REALDATA;
     static const QString T_DATAVIEW;
     static const QString T_PARAMETER_TREE;
@@ -63,6 +64,8 @@ public:
 
     IntensityDataItem* intensityDataItem();
     DataItem* dataItem();
+    template <typename T> T* setDataType();
+    void addDataItem(DataItem* data);
 
     QString getStatus() const;
     void setStatus(const QString& status);
@@ -125,4 +128,13 @@ private:
     const SimulationOptionsItem* simulationOptionsItem() const;
 };
 
+template <typename T> T* JobItem::setDataType()
+{
+    static_assert(std::is_base_of<DataItem,T>::value,
+                  "Class must be derived from DataItem");
+    
+    return model()->insertItem<T>(this, -1, T_OUTPUT);
+}
+
+
 #endif // BORNAGAIN_GUI_MODELS_JOBITEM_H
diff --git a/GUI/Models/JobModel.cpp b/GUI/Models/JobModel.cpp
index 77aaec9c058..3199cdf847e 100644
--- a/GUI/Models/JobModel.cpp
+++ b/GUI/Models/JobModel.cpp
@@ -138,7 +138,7 @@ QVector<SessionItem*> JobModel::nonXMLItems() const
     QVector<SessionItem*> result;
 
     for (auto jobItem : topItems<JobItem>()) {
-        if (auto intensityItem = jobItem->getItem(JobItem::T_OUTPUT))
+        if (auto intensityItem = jobItem->dataItem())
             result.push_back(intensityItem);
 
         if (auto real_data = dynamic_cast<RealDataItem*>(jobItem->getItem(JobItem::T_REALDATA))) {
diff --git a/GUI/Models/JobModelFunctions.cpp b/GUI/Models/JobModelFunctions.cpp
index 60efe22a852..dd32df09127 100644
--- a/GUI/Models/JobModelFunctions.cpp
+++ b/GUI/Models/JobModelFunctions.cpp
@@ -144,9 +144,9 @@ void JobModelFunctions::setupJobItemOutput(JobItem* jobItem)
     ASSERT(isSpecularInstrument || isIntensityInstrument);
 
     if (isSpecularInstrument)
-        jobItem->model()->insertItem<SpecularDataItem>(jobItem, -1, JobItem::T_OUTPUT);
+        jobItem->setDataType<SpecularDataItem>();
     else if (isIntensityInstrument)
-        jobItem->model()->insertItem<IntensityDataItem>(jobItem, -1, JobItem::T_OUTPUT);
+        jobItem->setDataType<IntensityDataItem>();
     else
         throw Error("JobModelFunctions::setupJobItemOutput() -> Error. "
                     "Unsupported instrument type");
diff --git a/GUI/Views/TestView.cpp b/GUI/Views/TestView.cpp
index 6dc7b2c20d8..3ef8feda460 100644
--- a/GUI/Views/TestView.cpp
+++ b/GUI/Views/TestView.cpp
@@ -184,7 +184,7 @@ void TestView::test_specular_data_widget()
 
     // creating "simulation" data
     auto data_item = new SpecularDataItem();
-    job_item->insertItem(-1, data_item, JobItem::T_OUTPUT);
+    job_item->addDataItem(data_item);
     fillTestItem(data_item, 1.0);
 
     // creating "real" data
diff --git a/Tests/UnitTests/GUI/TestOutputDataIOService.cpp b/Tests/UnitTests/GUI/TestOutputDataIOService.cpp
index ed23685ce3c..11231fc3774 100644
--- a/Tests/UnitTests/GUI/TestOutputDataIOService.cpp
+++ b/Tests/UnitTests/GUI/TestOutputDataIOService.cpp
@@ -50,8 +50,7 @@ TEST_F(TestOutputDataIOService, test_nonXMLData)
 
     // adding JobItem
     auto jobItem = models.jobModel()->insertItem<JobItem>();
-    auto dataItem =
-        models.jobModel()->insertItem<IntensityDataItem>(jobItem, -1, JobItem::T_OUTPUT);
+    auto dataItem = jobItem->setDataType<IntensityDataItem>();
     EXPECT_EQ(models.jobModel()->nonXMLItems().size(), 1);
 
     // adding RealDataItem to jobItem
@@ -264,7 +263,7 @@ TEST_F(TestOutputDataIOService, test_RealDataItemWithNativeData)
     // adding JobItem
     auto jobItem = models.jobModel()->insertItem<JobItem>();
     jobItem->setIdentifier(GUIHelpers::createUuid());
-    models.jobModel()->insertItem<IntensityDataItem>(jobItem, -1, JobItem::T_OUTPUT);
+    jobItem->setDataType<IntensityDataItem>();
     EXPECT_EQ(models.jobModel()->nonXMLItems().size(), 1);
 
     // copying RealDataItem to JobItem
diff --git a/Tests/UnitTests/GUI/TestSavingSpecularData.cpp b/Tests/UnitTests/GUI/TestSavingSpecularData.cpp
index fdc16c8cbd3..efc2328c6a9 100644
--- a/Tests/UnitTests/GUI/TestSavingSpecularData.cpp
+++ b/Tests/UnitTests/GUI/TestSavingSpecularData.cpp
@@ -100,8 +100,7 @@ TEST_F(TestSavingSpecularData, test_InstrumentInJobItem)
 
     // adding JobItem
     auto jobItem = models.jobModel()->insertItem<JobItem>();
-    auto dataItem =
-        models.jobModel()->insertItem<IntensityDataItem>(jobItem, -1, JobItem::T_OUTPUT);
+    auto dataItem = jobItem->setDataType<IntensityDataItem>();
     EXPECT_EQ(models.jobModel()->nonXMLItems().size(), 1);
 
     // adding instrument
-- 
GitLab