From 3d918e88efc61442a4ccbe509f3130af3a75bccd Mon Sep 17 00:00:00 2001
From: Tobias Knopff <t.knopff@fz-juelich.de>
Date: Fri, 30 Apr 2021 15:29:19 +0200
Subject: [PATCH] Make BeamItem::P_WAVELENGTH private

---
 GUI/coregui/Models/BeamItems.cpp              | 21 +++++++++++++++----
 GUI/coregui/Models/BeamItems.h                |  8 +++++--
 GUI/coregui/Models/InstrumentItems.cpp        |  4 ++--
 GUI/coregui/Models/TransformFromDomain.cpp    | 21 ++++++++++++++++---
 GUI/coregui/Models/TransformToDomain.cpp      |  8 +++----
 GUI/coregui/Models/TransformToDomain.h        |  5 +++--
 .../DepthProbeInstrumentEditor.cpp            |  5 +++--
 .../InstrumentWidgets/GISASBeamEditor.cpp     |  3 ++-
 .../OffSpecularBeamEditor.cpp                 |  3 ++-
 .../InstrumentWidgets/SpecularBeamEditor.cpp  |  3 ++-
 10 files changed, 59 insertions(+), 22 deletions(-)

diff --git a/GUI/coregui/Models/BeamItems.cpp b/GUI/coregui/Models/BeamItems.cpp
index 1f3423e65df..8990ee82384 100644
--- a/GUI/coregui/Models/BeamItems.cpp
+++ b/GUI/coregui/Models/BeamItems.cpp
@@ -78,6 +78,11 @@ void BeamItem::setWavelength(double value)
     item<BeamWavelengthItem>(P_WAVELENGTH)->resetToValue(value);
 }
 
+BeamWavelengthItem* BeamItem::wavelengthItem() const
+{
+    return item<BeamWavelengthItem>(P_WAVELENGTH);
+}
+
 void BeamItem::setInclinationAngle(double value)
 {
     item<BeamDistributionItem>(P_INCLINATION_ANGLE)->resetToValue(value);
@@ -107,6 +112,14 @@ std::unique_ptr<Beam> BeamItem::createBeam() const
     return result;
 }
 
+template<typename T> void BeamItem::initWavelength()
+{
+    static_assert(std::is_base_of<BeamWavelengthItem,T>::value,
+                  "Class must be derived from BeamWavelengthItem");
+
+    addProperty<T>(P_WAVELENGTH);
+}
+
 // Specular beam item
 /* ------------------------------------------------------------------------- */
 
@@ -117,7 +130,7 @@ const QString footprint_group_label("Type");
 SpecularBeamItem::SpecularBeamItem() : BeamItem("SpecularBeam")
 {
     addProperty<SpecularBeamInclinationItem>(P_INCLINATION_ANGLE);
-    addProperty<SpecularBeamWavelengthItem>(P_WAVELENGTH);
+    initWavelength<SpecularBeamWavelengthItem>();
 
     getItem(P_AZIMUTHAL_ANGLE)->setVisible(false);
     getItem(P_POLARIZATION)->setVisible(false);
@@ -126,7 +139,7 @@ SpecularBeamItem::SpecularBeamItem() : BeamItem("SpecularBeam")
     item->setDisplayName(footprint_group_label);
     item->setToolTip("Footprint type");
 
-    getItem(P_WAVELENGTH)
+    wavelengthItem()
         ->mapper()
         ->setOnChildPropertyChange(
             [this](SessionItem*, QString property) {
@@ -212,7 +225,7 @@ void SpecularBeamItem::updateToData(const IAxis& axis, QString units)
 void SpecularBeamItem::updateWavelength()
 {
     auto item = inclinationAxisGroup()->currentItem();
-    auto wl_item = static_cast<SpecularBeamWavelengthItem*>(getItem(P_WAVELENGTH));
+    auto wl_item = static_cast<SpecularBeamWavelengthItem*>(wavelengthItem());
     if (auto axis_item = dynamic_cast<PointwiseAxisItem*>(item)) {
         auto axis = axis_item->axis();
         if (axis && axis_item->getUnitsLabel() == "q-space")
@@ -227,7 +240,7 @@ void SpecularBeamItem::updateWavelength()
 GISASBeamItem::GISASBeamItem() : BeamItem("GISASBeam")
 {
     addProperty<BeamInclinationAngleItem>(P_INCLINATION_ANGLE);
-    addProperty<BeamWavelengthItem>(P_WAVELENGTH);
+    initWavelength<BeamWavelengthItem>();
 }
 
 GISASBeamItem::~GISASBeamItem() = default;
diff --git a/GUI/coregui/Models/BeamItems.h b/GUI/coregui/Models/BeamItems.h
index 5583c139a05..16ea7315796 100644
--- a/GUI/coregui/Models/BeamItems.h
+++ b/GUI/coregui/Models/BeamItems.h
@@ -19,6 +19,7 @@
 
 class BasicAxisItem;
 class Beam;
+class BeamWavelengthItem;
 class FootprintItem;
 class GroupItem;
 class IAxis;
@@ -26,8 +27,8 @@ class IAxis;
 class BA_CORE_API_ BeamItem : public SessionItem {
 private:
     static const QString P_INTENSITY;
-public:
     static const QString P_WAVELENGTH;
+public:
     static const QString P_INCLINATION_ANGLE;
     static const QString P_AZIMUTHAL_ANGLE;
     static const QString P_POLARIZATION;
@@ -40,7 +41,8 @@ public:
 
     double wavelength() const;
     void setWavelength(double value);
-
+    BeamWavelengthItem* wavelengthItem() const;
+    
     virtual double getInclinationAngle() const = 0;
     virtual void setInclinationAngle(double value);
 
@@ -51,6 +53,8 @@ public:
 
 protected:
     explicit BeamItem(const QString& beam_model);
+
+    template<typename T> void initWavelength();
 };
 
 class BA_CORE_API_ SpecularBeamItem : public BeamItem {
diff --git a/GUI/coregui/Models/InstrumentItems.cpp b/GUI/coregui/Models/InstrumentItems.cpp
index 3f4a84e7d48..a6a274a5d35 100644
--- a/GUI/coregui/Models/InstrumentItems.cpp
+++ b/GUI/coregui/Models/InstrumentItems.cpp
@@ -422,8 +422,8 @@ std::unique_ptr<DepthProbeSimulation> DepthProbeInstrumentItem::createSimulation
     simulation->setZSpan(depthAxis->size(), depthAxis->lowerBound(), depthAxis->upperBound());
 
     TransformToDomain::setBeamDistribution(
-        ParameterDistribution::BeamWavelength,
-        *beamItem()->item<BeamWavelengthItem>(SpecularBeamItem::P_WAVELENGTH), *simulation.get());
+        ParameterDistribution::BeamWavelength, *beamItem()->wavelengthItem(),
+        *simulation.get());
 
     TransformToDomain::setBeamDistribution(
         ParameterDistribution::BeamInclinationAngle,
diff --git a/GUI/coregui/Models/TransformFromDomain.cpp b/GUI/coregui/Models/TransformFromDomain.cpp
index 298d361e5b1..d1228420e06 100644
--- a/GUI/coregui/Models/TransformFromDomain.cpp
+++ b/GUI/coregui/Models/TransformFromDomain.cpp
@@ -35,6 +35,7 @@
 #include "GUI/coregui/Models/AxesItems.h"
 #include "GUI/coregui/Models/BackgroundItems.h"
 #include "GUI/coregui/Models/BeamAngleItems.h"
+#include "GUI/coregui/Models/BeamWavelengthItem.h"
 #include "GUI/coregui/Models/FTDecayFunctionItems.h"
 #include "GUI/coregui/Models/FTDistributionItems.h"
 #include "GUI/coregui/Models/FootprintItems.h"
@@ -77,6 +78,10 @@ void addDistributionToBeamItem(ParameterDistribution::WhichParameter which,
                                const QString& item_name, const ParameterDistribution& distribution,
                                const BeamItem* beam_item);
 
+void addDistributionToBeamItem(ParameterDistribution::WhichParameter which,
+                               BeamDistributionItem* item,
+                               const ParameterDistribution& distribution);
+    
 void addRangedDistributionToItem(SessionItem* item, const IRangedDistribution& ranged, double mean,
                                  double std_dev);
 } // namespace
@@ -222,8 +227,8 @@ void TransformFromDomain::setGISASBeamItem(BeamItem* beam_item, const GISASSimul
     const std::vector<ParameterDistribution> distributions =
         simulation.getDistributionHandler().getDistributions();
     for (size_t i = 0; i < distributions.size(); ++i) {
-        addDistributionToBeamItem(ParameterDistribution::BeamWavelength, BeamItem::P_WAVELENGTH,
-                                  distributions[i], beam_item);
+        addDistributionToBeamItem(ParameterDistribution::BeamWavelength,
+                                  beam_item->wavelengthItem(), distributions[i]);
         addDistributionToBeamItem(ParameterDistribution::BeamInclinationAngle,
                                   BeamItem::P_INCLINATION_ANGLE, distributions[i], beam_item);
         addDistributionToBeamItem(ParameterDistribution::BeamAzimuthalAngle,
@@ -269,7 +274,7 @@ void TransformFromDomain::setSpecularBeamItem(SpecularBeamItem* beam_item,
     if (!resolution->empty()) {
         double mean = scan->wavelength();
         double std_dev = resolution->stdDevs(mean, 1).front();
-        addRangedDistributionToItem(beam_item->getItem(SpecularBeamItem::P_WAVELENGTH),
+        addRangedDistributionToItem(beam_item->wavelengthItem(),
                                     *resolution->distribution(), mean, std_dev);
     }
 
@@ -812,6 +817,16 @@ void addDistributionToBeamItem(ParameterDistribution::WhichParameter which,
     TransformFromDomain::setItemFromSample(beam_parameter, distribution);
 }
 
+void addDistributionToBeamItem(ParameterDistribution::WhichParameter which,
+                               BeamDistributionItem* item,
+                               const ParameterDistribution& distribution)
+{
+    if (distribution.whichParameter() != which)
+        return;
+
+    TransformFromDomain::setItemFromSample(item, distribution);
+}
+
 void addRangedDistributionToItem(SessionItem* item, const IRangedDistribution& ranged, double mean,
                                  double std_dev)
 {
diff --git a/GUI/coregui/Models/TransformToDomain.cpp b/GUI/coregui/Models/TransformToDomain.cpp
index 25b6f2bd5d6..4632cc5d01f 100644
--- a/GUI/coregui/Models/TransformToDomain.cpp
+++ b/GUI/coregui/Models/TransformToDomain.cpp
@@ -134,7 +134,7 @@ std::unique_ptr<IParticle> TransformToDomain::createIParticle(const SessionItem&
 }
 
 //! adds DistributionParameters to the ISimulation
-void TransformToDomain::addDistributionParametersToSimulation(const SessionItem& beam_item,
+void TransformToDomain::addDistributionParametersToSimulation(const BeamItem& beam_item,
                                                               GISASSimulation& simulation)
 {
     if (beam_item.modelType() != "GISASBeam") {
@@ -143,7 +143,7 @@ void TransformToDomain::addDistributionParametersToSimulation(const SessionItem&
     }
 
     setParameterDistributionToSimulation<BeamWavelengthItem>(
-        ParameterDistribution::BeamWavelength, beam_item.getItem(BeamItem::P_WAVELENGTH),
+        ParameterDistribution::BeamWavelength, beam_item.wavelengthItem(),
         simulation);
     setParameterDistributionToSimulation<BeamInclinationAngleItem>(
         ParameterDistribution::BeamInclinationAngle,
@@ -153,7 +153,7 @@ void TransformToDomain::addDistributionParametersToSimulation(const SessionItem&
         simulation);
 }
 
-void TransformToDomain::addBeamDivergencesToScan(const SessionItem& beam_item,
+void TransformToDomain::addBeamDivergencesToScan(const BeamItem& beam_item,
                                                  AngularSpecScan& scan)
 {
     if (beam_item.modelType() != "SpecularBeam") {
@@ -161,7 +161,7 @@ void TransformToDomain::addBeamDivergencesToScan(const SessionItem& beam_item,
         return;
     }
 
-    auto resolution = createScanResolution(beam_item.getItem(SpecularBeamItem::P_WAVELENGTH));
+    auto resolution = createScanResolution(beam_item.wavelengthItem());
     if (resolution)
         scan.setWavelengthResolution(*resolution);
     resolution = createScanResolution(beam_item.getItem(SpecularBeamItem::P_INCLINATION_ANGLE));
diff --git a/GUI/coregui/Models/TransformToDomain.h b/GUI/coregui/Models/TransformToDomain.h
index a741641f388..3c6c84dca7b 100644
--- a/GUI/coregui/Models/TransformToDomain.h
+++ b/GUI/coregui/Models/TransformToDomain.h
@@ -28,6 +28,7 @@
 
 class AngularSpecScan;
 class BeamDistributionItem;
+class BeamItem;
 class GISASSimulation;
 class Material;
 class MaterialItemContainer;
@@ -42,9 +43,9 @@ std::unique_ptr<LayerRoughness> createLayerRoughness(const SessionItem& item);
 std::unique_ptr<MultiLayer> createMultiLayer(const SessionItem& item);
 std::unique_ptr<ParticleLayout> createParticleLayout(const SessionItem& item);
 
-void addDistributionParametersToSimulation(const SessionItem& beam_item,
+void addDistributionParametersToSimulation(const BeamItem& beam_item,
                                            GISASSimulation& simulation);
-void addBeamDivergencesToScan(const SessionItem& beam_item, AngularSpecScan& simulation);
+void addBeamDivergencesToScan(const BeamItem& beam_item, AngularSpecScan& simulation);
 
 void setBeamDistribution(ParameterDistribution::WhichParameter which,
                          const BeamDistributionItem& item, ISimulation& simulation);
diff --git a/GUI/coregui/Views/InstrumentWidgets/DepthProbeInstrumentEditor.cpp b/GUI/coregui/Views/InstrumentWidgets/DepthProbeInstrumentEditor.cpp
index acde70ca746..a0667148ebf 100644
--- a/GUI/coregui/Views/InstrumentWidgets/DepthProbeInstrumentEditor.cpp
+++ b/GUI/coregui/Views/InstrumentWidgets/DepthProbeInstrumentEditor.cpp
@@ -13,6 +13,7 @@
 //  ************************************************************************************************
 
 #include "GUI/coregui/Views/InstrumentWidgets/DepthProbeInstrumentEditor.h"
+#include "GUI/coregui/Models/BeamWavelengthItem.h"
 #include "GUI/coregui/Models/InstrumentItems.h"
 #include "GUI/coregui/Models/SpecularBeamInclinationItem.h"
 #include "GUI/coregui/Views/InfoWidgets/DistributionDialog.h"
@@ -52,9 +53,9 @@ DepthProbeInstrumentEditor::DepthProbeInstrumentEditor(QWidget* parent)
 
 void DepthProbeInstrumentEditor::subscribeToItem()
 {
-    const auto beam_item = instrumentItem()->getItem(DepthProbeInstrumentItem::P_BEAM);
+    const SpecularBeamItem* beam_item = instrumentItem()->beamItem();
 
-    auto wavelengthItem = beam_item->getItem(SpecularBeamItem::P_WAVELENGTH);
+    BeamWavelengthItem* wavelengthItem = beam_item->wavelengthItem();
     m_wavelengthEditor->setItem(wavelengthItem->getItem(BeamDistributionItem::P_DISTRIBUTION));
 
     auto inclinationItem = beam_item->getItem(SpecularBeamItem::P_INCLINATION_ANGLE);
diff --git a/GUI/coregui/Views/InstrumentWidgets/GISASBeamEditor.cpp b/GUI/coregui/Views/InstrumentWidgets/GISASBeamEditor.cpp
index ba3fa70705f..cd6a28d6c3b 100644
--- a/GUI/coregui/Views/InstrumentWidgets/GISASBeamEditor.cpp
+++ b/GUI/coregui/Views/InstrumentWidgets/GISASBeamEditor.cpp
@@ -14,6 +14,7 @@
 
 #include "GUI/coregui/Views/InstrumentWidgets/GISASBeamEditor.h"
 #include "GUI/coregui/Models/BeamDistributionItem.h"
+#include "GUI/coregui/Models/BeamWavelengthItem.h"
 #include "GUI/coregui/Models/InstrumentItems.h"
 #include "GUI/coregui/Views/CommonWidgets/ColumnResizer.h"
 #include "GUI/coregui/Views/InfoWidgets/DistributionDialog.h"
@@ -63,7 +64,7 @@ void GISASBeamEditor::subscribeToItem()
 {
     m_intensityEditor->setItem(beamItem()->intensityItem());
 
-    auto wavelengthItem = beamItem()->getItem(BeamItem::P_WAVELENGTH);
+    auto wavelengthItem = beamItem()->wavelengthItem();
     m_wavelengthEditor->setItem(wavelengthItem->getItem(BeamDistributionItem::P_DISTRIBUTION));
 
     auto inclinationItem = beamItem()->getItem(BeamItem::P_INCLINATION_ANGLE);
diff --git a/GUI/coregui/Views/InstrumentWidgets/OffSpecularBeamEditor.cpp b/GUI/coregui/Views/InstrumentWidgets/OffSpecularBeamEditor.cpp
index 4dcf2324af7..2fad56c6066 100644
--- a/GUI/coregui/Views/InstrumentWidgets/OffSpecularBeamEditor.cpp
+++ b/GUI/coregui/Views/InstrumentWidgets/OffSpecularBeamEditor.cpp
@@ -14,6 +14,7 @@
 
 #include "GUI/coregui/Views/InstrumentWidgets/OffSpecularBeamEditor.h"
 #include "GUI/coregui/Models/BeamDistributionItem.h"
+#include "GUI/coregui/Models/BeamWavelengthItem.h"
 #include "GUI/coregui/Models/InstrumentItems.h"
 #include "GUI/coregui/Views/CommonWidgets/ColumnResizer.h"
 #include "GUI/coregui/Views/InfoWidgets/DistributionDialog.h"
@@ -63,7 +64,7 @@ void OffSpecularBeamEditor::subscribeToItem()
 {
     m_intensityEditor->setItem(beamItem()->intensityItem());
 
-    auto wavelengthItem = beamItem()->getItem(BeamItem::P_WAVELENGTH);
+    auto wavelengthItem = beamItem()->wavelengthItem();
     m_wavelengthEditor->setItem(wavelengthItem->getItem(BeamDistributionItem::P_DISTRIBUTION));
 
     auto inclinationItem = instrumentItem()->getItem(OffSpecularInstrumentItem::P_ALPHA_AXIS);
diff --git a/GUI/coregui/Views/InstrumentWidgets/SpecularBeamEditor.cpp b/GUI/coregui/Views/InstrumentWidgets/SpecularBeamEditor.cpp
index fbcb096d050..b261a4c96ea 100644
--- a/GUI/coregui/Views/InstrumentWidgets/SpecularBeamEditor.cpp
+++ b/GUI/coregui/Views/InstrumentWidgets/SpecularBeamEditor.cpp
@@ -13,6 +13,7 @@
 //  ************************************************************************************************
 
 #include "GUI/coregui/Views/InstrumentWidgets/SpecularBeamEditor.h"
+#include "GUI/coregui/Models/BeamWavelengthItem.h"
 #include "GUI/coregui/Models/InstrumentItems.h"
 #include "GUI/coregui/Models/SpecularBeamInclinationItem.h"
 #include "GUI/coregui/Views/CommonWidgets/ColumnResizer.h"
@@ -66,7 +67,7 @@ void SpecularBeamEditor::subscribeToItem()
 
     m_intensityEditor->setItem(beam_item->intensityItem());
 
-    auto wavelengthItem = beam_item->getItem(SpecularBeamItem::P_WAVELENGTH);
+    auto wavelengthItem = beam_item->wavelengthItem();
     m_wavelengthEditor->setItem(wavelengthItem->getItem(BeamDistributionItem::P_DISTRIBUTION));
 
     auto inclinationItem = beam_item->getItem(SpecularBeamItem::P_INCLINATION_ANGLE);
-- 
GitLab