From d4a38bdf66638beb172c1f38cc5fbf9f75a2fabb Mon Sep 17 00:00:00 2001
From: Dmitry Yurov <d.yurov@fz-juelich.de>
Date: Fri, 9 Feb 2018 19:06:02 +0100
Subject: [PATCH] Enable specular view in GUI

Redmine: #1936
---
 GUI/coregui/Models/JobItem.cpp                | 19 +++++++++++++++++++
 GUI/coregui/Models/JobItem.h                  |  1 +
 GUI/coregui/Models/JobModel.cpp               |  2 ++
 GUI/coregui/Models/JobModelFunctions.cpp      |  1 -
 GUI/coregui/Models/item_constants.h           |  1 +
 .../Views/JobWidgets/JobOutputDataWidget.cpp  |  6 +++---
 .../Views/JobWidgets/JobResultsPresenter.cpp  | 15 +++++++++++++--
 .../Views/JobWidgets/JobResultsPresenter.h    |  1 +
 .../SpecularDataWidget.cpp                    | 19 +++++++++----------
 GUI/coregui/Views/TestView.cpp                |  7 +++++--
 10 files changed, 54 insertions(+), 18 deletions(-)

diff --git a/GUI/coregui/Models/JobItem.cpp b/GUI/coregui/Models/JobItem.cpp
index 0ceee6f1a2c..26b081705e4 100644
--- a/GUI/coregui/Models/JobItem.cpp
+++ b/GUI/coregui/Models/JobItem.cpp
@@ -263,6 +263,25 @@ QString JobItem::presentationType()
     return getItemValue(P_PRESENTATION_TYPE).toString();
 }
 
+QString JobItem::defaultPresentationType()
+{
+    auto instrument = instrumentItem();
+    if (!instrument)
+        GUIHelpers::Error("Error in JobItem::defaultPresentationType: default presentation type "
+                          "cannot be determined");
+
+    auto instrument_type = instrument->modelType();
+    if (instrument_type == Constants::SpecularInstrumentType)
+        return Constants::SpecularDataPresentation;
+    else if (instrument_type == Constants::GISASInstrumentType
+             || instrument_type == Constants::OffSpecInstrumentType)
+        return Constants::IntensityDataPresentation;
+    else
+        GUIHelpers::Error("Error in JobItem::defaultPresentationType: unknown type of instrument "
+                          "attached to the job item.");
+    return QString();
+}
+
 //! Updates the name of file to store intensity data.
 
 void JobItem::updateIntensityDataFileName()
diff --git a/GUI/coregui/Models/JobItem.h b/GUI/coregui/Models/JobItem.h
index 927f40f0e57..0620a024703 100644
--- a/GUI/coregui/Models/JobItem.h
+++ b/GUI/coregui/Models/JobItem.h
@@ -98,6 +98,7 @@ public:
     RealDataItem* realDataItem();
 
     QString presentationType();
+    QString defaultPresentationType();
 
 private:
     void updateIntensityDataFileName();
diff --git a/GUI/coregui/Models/JobModel.cpp b/GUI/coregui/Models/JobModel.cpp
index 40e1c75fb09..8bf698d0f42 100644
--- a/GUI/coregui/Models/JobModel.cpp
+++ b/GUI/coregui/Models/JobModel.cpp
@@ -91,6 +91,8 @@ JobItem *JobModel::addJob(const MultiLayerItem *multiLayerItem,
     jobItem->getItem(JobItem::P_SAMPLE_NAME)->setValue(multiLayerItem->itemName());
     jobItem->getItem(JobItem::P_INSTRUMENT_NAME)->setValue(instrumentItem->itemName());
 
+    jobItem->setItemValue(JobItem::P_PRESENTATION_TYPE, jobItem->defaultPresentationType());
+
     ParameterTreeUtils::createParameterTree(jobItem);
 
     JobModelFunctions::setupJobItemOutput(jobItem);
diff --git a/GUI/coregui/Models/JobModelFunctions.cpp b/GUI/coregui/Models/JobModelFunctions.cpp
index 727a40ec8ac..e4ef5af0c73 100644
--- a/GUI/coregui/Models/JobModelFunctions.cpp
+++ b/GUI/coregui/Models/JobModelFunctions.cpp
@@ -62,7 +62,6 @@ void JobModelFunctions::setupJobItemOutput(JobItem* jobItem)
 
 }
 
-
 //! Setups JobItem for fit.
 
 void JobModelFunctions::setupJobItemForFit(JobItem *jobItem, const RealDataItem *realDataItem)
diff --git a/GUI/coregui/Models/item_constants.h b/GUI/coregui/Models/item_constants.h
index 6fae1f0802f..85985474602 100644
--- a/GUI/coregui/Models/item_constants.h
+++ b/GUI/coregui/Models/item_constants.h
@@ -263,6 +263,7 @@ const ModelType AVERAGE_LAYER_MATERIAL = "Average Layer Material";
 // --- Presentation types ----------------------------------------------------------
 
 const QString IntensityDataPresentation = "Color Map";
+const QString SpecularDataPresentation = "Reflectometry";
 const QString IntensityProjectionsPresentation = "Projections";
 const QString FitComparisonPresentation = "Fit Data";
 const QString MaskEditorPresentation = "Mask Editor";
diff --git a/GUI/coregui/Views/JobWidgets/JobOutputDataWidget.cpp b/GUI/coregui/Views/JobWidgets/JobOutputDataWidget.cpp
index 063275eb403..e9639061d27 100644
--- a/GUI/coregui/Views/JobWidgets/JobOutputDataWidget.cpp
+++ b/GUI/coregui/Views/JobWidgets/JobOutputDataWidget.cpp
@@ -61,9 +61,9 @@ void JobOutputDataWidget::onActivityChanged(int activity)
         if (activity == JobViewFlags::FITTING_ACTIVITY) {
             widget->setPresentation(Constants::FitComparisonPresentation);
         } else if (activity == JobViewFlags::REAL_TIME_ACTIVITY) {
-            widget->setPresentation(Constants::IntensityDataPresentation);
+            widget->setDefaultPresentation();
         } else if (activity == JobViewFlags::JOB_VIEW_ACTIVITY) {
-            widget->setPresentation(Constants::IntensityDataPresentation);
+            widget->setDefaultPresentation();
         }
     }
 }
@@ -74,5 +74,5 @@ bool JobOutputDataWidget::isValidJobItem(JobItem *item)
         return false;
 
     // do not show running job items, the rest (canceled, fitted, etc) are shown
-    return item->isRunning() ? false: true;
+    return !item->isRunning();
 }
diff --git a/GUI/coregui/Views/JobWidgets/JobResultsPresenter.cpp b/GUI/coregui/Views/JobWidgets/JobResultsPresenter.cpp
index ddff3db8ae1..662224c08d0 100644
--- a/GUI/coregui/Views/JobWidgets/JobResultsPresenter.cpp
+++ b/GUI/coregui/Views/JobWidgets/JobResultsPresenter.cpp
@@ -13,10 +13,11 @@
 // ************************************************************************** //
 
 #include "JobResultsPresenter.h"
-#include "IntensityDataProjectionsWidget.h"
 #include "FitComparisonWidget.h"
-#include "JobItem.h"
+#include "IntensityDataProjectionsWidget.h"
 #include "IntensityDataWidget.h"
+#include "JobItem.h"
+#include "SpecularDataWidget.h"
 
 namespace {
 // Will switch to the presentation which was used before for given item
@@ -32,6 +33,8 @@ JobResultsPresenter::JobResultsPresenter(QWidget* parent)
                    create_new<IntensityDataProjectionsWidget>);
 
     registerWidget(Constants::FitComparisonPresentation, create_new<FitComparisonWidget>);
+
+    registerWidget(Constants::SpecularDataPresentation, create_new<SpecularDataWidget>);
 }
 
 QString JobResultsPresenter::itemPresentation() const
@@ -48,6 +51,13 @@ void JobResultsPresenter::setPresentation(const QString& presentationType)
     currentItem()->setItemValue(JobItem::P_PRESENTATION_TYPE, presentationType);
 }
 
+void JobResultsPresenter::setDefaultPresentation()
+{
+    auto job_item = dynamic_cast<JobItem*>(currentItem());
+    Q_ASSERT(job_item);
+    setPresentation(job_item->defaultPresentationType());
+}
+
 //! Returns list of presentation types, available for given item. JobItem with fitting abilities
 //! is valid for IntensityDataWidget and FitComparisonWidget.
 
@@ -68,6 +78,7 @@ QStringList JobResultsPresenter::presentationList(SessionItem* item)
     Q_ASSERT(item->modelType() == Constants::JobItemType);
 
     return QStringList() << Constants::IntensityDataPresentation
+                         << Constants::SpecularDataPresentation
                          << Constants::IntensityProjectionsPresentation
                          << Constants::FitComparisonPresentation;
 }
diff --git a/GUI/coregui/Views/JobWidgets/JobResultsPresenter.h b/GUI/coregui/Views/JobWidgets/JobResultsPresenter.h
index 4a17aec49ee..908dd5e3393 100644
--- a/GUI/coregui/Views/JobWidgets/JobResultsPresenter.h
+++ b/GUI/coregui/Views/JobWidgets/JobResultsPresenter.h
@@ -28,6 +28,7 @@ public:
     explicit JobResultsPresenter(QWidget* parent = 0);
 
     void setPresentation(const QString& presentationType) override;
+    void setDefaultPresentation();
 
 protected:
     QString itemPresentation() const override;
diff --git a/GUI/coregui/Views/SpecularDataWidgets/SpecularDataWidget.cpp b/GUI/coregui/Views/SpecularDataWidgets/SpecularDataWidget.cpp
index bf45393d6af..9ea1ec02f6c 100644
--- a/GUI/coregui/Views/SpecularDataWidgets/SpecularDataWidget.cpp
+++ b/GUI/coregui/Views/SpecularDataWidgets/SpecularDataWidget.cpp
@@ -13,11 +13,12 @@
 // ************************************************************************** //
 
 #include "SpecularDataWidget.h"
-#include "SpecularDataItem.h"
-#include "SpecularDataCanvas.h"
-#include "JobItem.h"
+#include "GUIHelpers.h"
 #include "IntensityDataItemUtils.h"
 #include "IntensityDataPropertyWidget.h"
+#include "JobItem.h"
+#include "SpecularDataItem.h"
+#include "SpecularDataCanvas.h"
 #include <QBoxLayout>
 #include <QMenu>
 
@@ -69,12 +70,10 @@ void SpecularDataWidget::onContextMenuRequest(const QPoint& point)
 
 SpecularDataItem* SpecularDataWidget::specularDataItem()
 {
-    // temporarily commented out
-    // return IntensityDataItemUtils::intensityDataItem(currentItem());
+    auto parent = currentItem();
+    if (!parent || parent->modelType() != Constants::JobItemType)
+        throw GUIHelpers::Error(
+            "Error in SpecularDataWidget::specularDataItem: parent item is of unexpected type");
 
-    // temporary solution, should be removed after starting to use
-    // JobItem
-    SpecularDataItem* result = dynamic_cast<SpecularDataItem*>(currentItem());
-    Q_ASSERT(result);
-    return result;
+    return &parent->item<SpecularDataItem>(JobItem::T_OUTPUT);
 }
diff --git a/GUI/coregui/Views/TestView.cpp b/GUI/coregui/Views/TestView.cpp
index 69f62308b9d..380ef195d38 100644
--- a/GUI/coregui/Views/TestView.cpp
+++ b/GUI/coregui/Views/TestView.cpp
@@ -15,6 +15,7 @@
 #include "TestView.h"
 #include "AccordionWidget.h"
 #include "JobModel.h"
+#include "JobItem.h"
 #include "MaskEditor.h"
 #include "MaterialEditor.h"
 #include "MinimizerItem.h"
@@ -184,13 +185,15 @@ void TestView::test_ba3d()
 void TestView::test_specular_data_widget()
 {
     SessionModel* tempModel = new SessionModel("Test", this);
-    auto data = fillTestItem(tempModel->insertNewItem(Constants::SpecularDataType));
+    auto job_item = dynamic_cast<JobItem*>(tempModel->insertNewItem(Constants::JobItemType));
+    fillTestItem(tempModel->insertNewItem(Constants::SpecularDataType,
+                                          tempModel->indexOfItem(job_item), -1, JobItem::T_OUTPUT));
 
     QVBoxLayout *layout = new QVBoxLayout;
     layout->setMargin(0);
     layout->setSpacing(0);
     auto widget = new SpecularDataWidget(this);
-    widget->setItem(data);
+    widget->setItem(job_item);
     layout->addWidget(widget);
     setLayout(layout);
 }
-- 
GitLab