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