diff --git a/GUI/Models/DataItemUtils.cpp b/GUI/Models/DataItemUtils.cpp index 38ad5b63137f5cc2fc0fd6ae47fc47af950ef3ab..81c8206b929b9400ded27e2dc1e92f60ce445cf2 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 ba852bf2afc3e15dd80dc9ad6f6799d470269e69..d43d2e48d440a92793822d08a372324a199038b3 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 be60f0130aa4a00c68e5380dd3034c4428769c47..77e72ae693c7f5f93f67ab300d1f1be75a17d053 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 77aaec9c05853bd1d811bb113fc1fb47a919c903..3199cdf847eef5f07d034975f52e446c08ac87ea 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 60efe22a8523e3d86cb8ccd9063bbe9f30730c30..dd32df09127827ec413d520bd895201905b5ad34 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 6dc7b2c20d8a6ac6bc740173b63662398f76d31b..3ef8feda4600ccb524f72bef348c509732a9a0d9 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 ed23685ce3cf1ecd8bfc159d95aa5ed12f473fe8..11231fc3774e883b2b08d858f69fa23d823c7584 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 fdc16c8cbd3d9944a73d8a89c908d98cf42230f5..efc2328c6a91cd512d91e8a46ae7ab55f850f704 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