From c010b2a54dfb35e8aa4f7c1ba1b4bba0483e63e9 Mon Sep 17 00:00:00 2001
From: Gennady Pospelov <g.pospelov@fz-juelich.de>
Date: Thu, 9 Mar 2017 15:40:01 +0100
Subject: [PATCH] New DetectorItem::setSize to hide axes details from
 ImportDataAssistant.

---
 GUI/coregui/Models/DetectorItems.h            |  2 +
 GUI/coregui/Models/InstrumentItem.cpp         | 11 ++++-
 GUI/coregui/Models/InstrumentItem.h           |  4 +-
 GUI/coregui/Models/JobModelFunctions.cpp      |  2 +-
 .../Models/RectangularDetectorItem.cpp        |  6 +++
 GUI/coregui/Models/RectangularDetectorItem.h  |  1 +
 GUI/coregui/Models/SphericalDetectorItem.cpp  |  6 +++
 GUI/coregui/Models/SphericalDetectorItem.h    |  1 +
 .../ImportDataWidgets/ImportDataAssistant.cpp | 47 +------------------
 .../LinkInstrumentManager.cpp                 |  2 +-
 .../InstrumentEditorWidget.cpp                |  2 +-
 11 files changed, 34 insertions(+), 50 deletions(-)

diff --git a/GUI/coregui/Models/DetectorItems.h b/GUI/coregui/Models/DetectorItems.h
index aae8e2c210e..3b61b8f4367 100644
--- a/GUI/coregui/Models/DetectorItems.h
+++ b/GUI/coregui/Models/DetectorItems.h
@@ -43,6 +43,8 @@ public:
 
     virtual std::unique_ptr<IDetector2D> createDetector() const = 0;
     virtual std::unique_ptr<IResolutionFunction2D> createResolutionFunction() = 0;
+
+    virtual void setSize(int nx, int ny) = 0;
 };
 
 
diff --git a/GUI/coregui/Models/InstrumentItem.cpp b/GUI/coregui/Models/InstrumentItem.cpp
index 9aed4f92fbd..6f0e84a2fa0 100644
--- a/GUI/coregui/Models/InstrumentItem.cpp
+++ b/GUI/coregui/Models/InstrumentItem.cpp
@@ -41,10 +41,19 @@ BeamItem *InstrumentItem::beamItem() const
     return 0;
 }
 
-DetectorContainerItem *InstrumentItem::detectorItem() const
+DetectorContainerItem *InstrumentItem::detectorContainerItem() const
 {
     for(SessionItem *item : childItems())
         if(item->modelType() == Constants::DetectorContainerType)
             return dynamic_cast<DetectorContainerItem *>(item);
     return 0;
 }
+
+DetectorItem* InstrumentItem::detectorItem() const
+{
+    DetectorContainerItem* detectorContainer = detectorContainerItem();
+    DetectorItem* detectorItem = dynamic_cast<DetectorItem*>(
+                detectorContainer->getGroupItem(DetectorContainerItem::P_DETECTOR));
+    Q_ASSERT(detectorItem);
+    return detectorItem;
+}
diff --git a/GUI/coregui/Models/InstrumentItem.h b/GUI/coregui/Models/InstrumentItem.h
index eb2818684e9..21ee1aff494 100644
--- a/GUI/coregui/Models/InstrumentItem.h
+++ b/GUI/coregui/Models/InstrumentItem.h
@@ -21,6 +21,7 @@
 
 class BeamItem;
 class DetectorContainerItem;
+class DetectorItem;
 
 class BA_CORE_API_ InstrumentItem : public SessionItem
 {
@@ -29,7 +30,8 @@ public:
     InstrumentItem();
 
     BeamItem *beamItem() const;
-    DetectorContainerItem *detectorItem() const;
+    DetectorContainerItem *detectorContainerItem() const;
+    DetectorItem *detectorItem() const;
 };
 
 #endif // INSTRUMENTITEM_H
diff --git a/GUI/coregui/Models/JobModelFunctions.cpp b/GUI/coregui/Models/JobModelFunctions.cpp
index 8388bb95ae3..8a1176d77ad 100644
--- a/GUI/coregui/Models/JobModelFunctions.cpp
+++ b/GUI/coregui/Models/JobModelFunctions.cpp
@@ -97,7 +97,7 @@ void JobModelFunctions::processInstrumentLink(JobItem *jobItem)
 void JobModelFunctions::copyMasksToInstrument(JobItem *jobItem)
 {
     IntensityDataItem *intensityItem = jobItem->realDataItem()->intensityDataItem();
-    DetectorContainerItem *detector = jobItem->instrumentItem()->detectorItem();
+    DetectorContainerItem *detector = jobItem->instrumentItem()->detectorContainerItem();
 
     // removing original masks from the detector, if exists
     if(detector->maskContainerItem())
diff --git a/GUI/coregui/Models/RectangularDetectorItem.cpp b/GUI/coregui/Models/RectangularDetectorItem.cpp
index aa7f806791d..5f5df2236e4 100644
--- a/GUI/coregui/Models/RectangularDetectorItem.cpp
+++ b/GUI/coregui/Models/RectangularDetectorItem.cpp
@@ -193,6 +193,12 @@ void RectangularDetectorItem::setDetectorAlignment(const QString& alignment)
     setItemValue(RectangularDetectorItem::P_ALIGNMENT, combo_property.getVariant());
 }
 
+void RectangularDetectorItem::setSize(int nx, int ny)
+{
+    getItem(RectangularDetectorItem::P_X_AXIS)->setItemValue(BasicAxisItem::P_NBINS, nx);
+    getItem(RectangularDetectorItem::P_Y_AXIS)->setItemValue(BasicAxisItem::P_NBINS, ny);
+}
+
 //! updates property tooltips and visibility flags, depending from type of alignment selected
 void RectangularDetectorItem::update_properties_appearance()
 {
diff --git a/GUI/coregui/Models/RectangularDetectorItem.h b/GUI/coregui/Models/RectangularDetectorItem.h
index 50b42618e8c..9d1d2c037b7 100644
--- a/GUI/coregui/Models/RectangularDetectorItem.h
+++ b/GUI/coregui/Models/RectangularDetectorItem.h
@@ -41,6 +41,7 @@ public:
     std::unique_ptr<IResolutionFunction2D> createResolutionFunction();
 
     void setDetectorAlignment(const QString& alignment);
+    void setSize(int nx, int ny);
 
 private:
     void update_properties_appearance();
diff --git a/GUI/coregui/Models/SphericalDetectorItem.cpp b/GUI/coregui/Models/SphericalDetectorItem.cpp
index bacd0a56cdf..25a7369c853 100644
--- a/GUI/coregui/Models/SphericalDetectorItem.cpp
+++ b/GUI/coregui/Models/SphericalDetectorItem.cpp
@@ -72,3 +72,9 @@ std::unique_ptr<IResolutionFunction2D> SphericalDetectorItem::createResolutionFu
 
     return result;
 }
+
+void SphericalDetectorItem::setSize(int nx, int ny)
+{
+    getItem(SphericalDetectorItem::P_PHI_AXIS)->setItemValue(BasicAxisItem::P_NBINS, nx);
+    getItem(SphericalDetectorItem::P_ALPHA_AXIS)->setItemValue(BasicAxisItem::P_NBINS, ny);
+}
diff --git a/GUI/coregui/Models/SphericalDetectorItem.h b/GUI/coregui/Models/SphericalDetectorItem.h
index 6d663e04de6..bf4a0db7a7b 100644
--- a/GUI/coregui/Models/SphericalDetectorItem.h
+++ b/GUI/coregui/Models/SphericalDetectorItem.h
@@ -29,6 +29,7 @@ public:
 
     std::unique_ptr<IDetector2D> createDetector() const;
     std::unique_ptr<IResolutionFunction2D> createResolutionFunction();
+    void setSize(int nx, int ny);
 };
 
 #endif // SPHERICALDETECTORITEM_H
diff --git a/GUI/coregui/Views/ImportDataWidgets/ImportDataAssistant.cpp b/GUI/coregui/Views/ImportDataWidgets/ImportDataAssistant.cpp
index dd526f00741..2137cf720ef 100644
--- a/GUI/coregui/Views/ImportDataWidgets/ImportDataAssistant.cpp
+++ b/GUI/coregui/Views/ImportDataWidgets/ImportDataAssistant.cpp
@@ -162,25 +162,7 @@ void ImportDataAssistant::realDataShape(const RealDataItem *realData, int &nx, i
 
 void ImportDataAssistant::detectorShape(const InstrumentItem *instrumentItem, int &nx, int &ny)
 {
-    nx = ny = 0;
-    DetectorContainerItem *detectorItem = instrumentItem ->detectorItem();
-    Q_ASSERT(detectorItem);
-
-    // FIXME Refactor subDetector
-    auto subDetector = detectorItem->getGroupItem(DetectorContainerItem::P_DETECTOR);
-    Q_ASSERT(subDetector);
-
-    std::unique_ptr<IDetector2D> detector;
-
-    if(auto sphericalDetector = dynamic_cast<SphericalDetectorItem *>(subDetector)) {
-        detector = sphericalDetector->createDetector();
-    }
-
-    else if(auto rectangularDetector = dynamic_cast<RectangularDetectorItem *>(subDetector)) {
-        detector = rectangularDetector->createDetector();
-    }
-
-    Q_ASSERT(detector.get());
+    std::unique_ptr<IDetector2D> detector = instrumentItem ->detectorItem()->createDetector();
     nx = detector->getAxis(0).size();
     ny = detector->getAxis(1).size();
 }
@@ -190,30 +172,5 @@ void ImportDataAssistant::setInstrumentShapeToData(InstrumentItem *instrumentIte
 {
     int nxData(0), nyData(0);
     realDataShape(realDataItemItem, nxData, nyData);
-
-    DetectorContainerItem *detectorItem = instrumentItem ->detectorItem();
-    Q_ASSERT(detectorItem);
-
-    // FIXME Refactor subDetector
-    auto subDetector = detectorItem->getGroupItem(DetectorContainerItem::P_DETECTOR);
-    Q_ASSERT(subDetector);
-
-    if (subDetector->modelType() == Constants::SphericalDetectorType) {
-      subDetector->getItem(SphericalDetectorItem::P_PHI_AXIS)
-          ->setItemValue(BasicAxisItem::P_NBINS, nxData);
-      subDetector->getItem(SphericalDetectorItem::P_ALPHA_AXIS)
-          ->setItemValue(BasicAxisItem::P_NBINS, nyData);
-    }
-
-    else if (subDetector->modelType() == Constants::RectangularDetectorType) {
-        subDetector->getItem(RectangularDetectorItem::P_X_AXIS)
-            ->setItemValue(BasicAxisItem::P_NBINS, nxData);
-        subDetector->getItem(RectangularDetectorItem::P_Y_AXIS)
-            ->setItemValue(BasicAxisItem::P_NBINS, nyData);
-    }
-
-    else {
-        throw GUIHelpers::Error("ImportDataAssistant::setInstrumentShapeToData() -> Error.");
-    }
-
+    instrumentItem->detectorItem()->setSize(nxData, nyData);
 }
diff --git a/GUI/coregui/Views/ImportDataWidgets/LinkInstrumentManager.cpp b/GUI/coregui/Views/ImportDataWidgets/LinkInstrumentManager.cpp
index 9286aaa0693..5279d2a458c 100644
--- a/GUI/coregui/Views/ImportDataWidgets/LinkInstrumentManager.cpp
+++ b/GUI/coregui/Views/ImportDataWidgets/LinkInstrumentManager.cpp
@@ -108,7 +108,7 @@ bool LinkInstrumentManager::canLinkDataToInstrument(const RealDataItem *realData
         return true;
 
     // FIXME temporary hack to get rid from Instrument's own masks and ROI
-    DetectorContainerItem *detectorItem = instrumentItem->detectorItem();
+    DetectorContainerItem *detectorItem = instrumentItem->detectorContainerItem();
     if(SessionItem *maskContainer = detectorItem->maskContainerItem()) {
         SessionItem *item = detectorItem->takeRow(detectorItem->rowOfChild(maskContainer));
         delete item;
diff --git a/GUI/coregui/Views/InstrumentWidgets/InstrumentEditorWidget.cpp b/GUI/coregui/Views/InstrumentWidgets/InstrumentEditorWidget.cpp
index 11eca1dd7cb..c569cbadc88 100644
--- a/GUI/coregui/Views/InstrumentWidgets/InstrumentEditorWidget.cpp
+++ b/GUI/coregui/Views/InstrumentWidgets/InstrumentEditorWidget.cpp
@@ -140,7 +140,7 @@ void InstrumentEditorWidget::setInstrumentItem(SessionItem *instrument)
     InstrumentItem *instrumentItem = dynamic_cast<InstrumentItem *>(instrument);
 
     m_instrumentComponents->setBeamItem(instrumentItem->beamItem());
-    m_instrumentComponents->setDetectorItem(instrumentItem->detectorItem());
+    m_instrumentComponents->setDetectorItem(instrumentItem->detectorContainerItem());
 }
 
 void InstrumentEditorWidget::onChangedEditor(const QString &)
-- 
GitLab