From 114ae6de637b7bf533badbb8eabbe2ac9d0c2e93 Mon Sep 17 00:00:00 2001
From: Dmitry Yurov <d.yurov@fz-juelich.de>
Date: Thu, 6 Dec 2018 09:22:36 +0100
Subject: [PATCH] Update wavelength on Axis type switch in SpecularBeamItem

Redmine: #2217
---
 GUI/coregui/Models/BeamItems.cpp         | 26 ++++++++++++++++--------
 GUI/coregui/Models/BeamItems.h           |  3 +++
 GUI/coregui/Models/PointwiseAxisItem.cpp |  1 -
 3 files changed, 21 insertions(+), 9 deletions(-)

diff --git a/GUI/coregui/Models/BeamItems.cpp b/GUI/coregui/Models/BeamItems.cpp
index 60b028f5e68..cf1da288dc0 100644
--- a/GUI/coregui/Models/BeamItems.cpp
+++ b/GUI/coregui/Models/BeamItems.cpp
@@ -157,6 +157,8 @@ SpecularBeamItem::SpecularBeamItem() : BeamItem(Constants::SpecularBeamType)
                     axis_item->updateIndicators();
             },
             this);
+
+    inclinationAxisGroup()->mapper()->setOnValueChange([this]() { updateWavelength(); }, this);
 }
 
 SpecularBeamItem::~SpecularBeamItem() = default;
@@ -203,19 +205,27 @@ void SpecularBeamItem::updateToData(const IAxis& axis, QString units)
         inclinationAxisGroup()->setCurrentType(Constants::BasicAxisType);
         auto axis_item = currentInclinationAxisItem();
         axis_item->setItemValue(BasicAxisItem::P_NBINS, static_cast<int>(axis.size()));
-        auto wl_item = static_cast<SpecularBeamWavelengthItem*>(getItem(P_WAVELENGTH));
-        wl_item->setToRange(RealLimits::positive());
         return;
     }
 
     auto axis_group = inclinationAxisGroup();
-    axis_group->setCurrentType(Constants::PointwiseAxisType);
-    auto axis_item = static_cast<PointwiseAxisItem*>(axis_group->currentItem());
-    if (units == Constants::UnitsQyQz) {
-        auto wl_item = static_cast<SpecularBeamWavelengthItem*>(getItem(P_WAVELENGTH));
-        wl_item->setToRange(getLimits(axis.getMax()));
-    }
+    auto axis_item =
+        static_cast<PointwiseAxisItem*>(axis_group->getChildOfType(Constants::PointwiseAxisType));
     axis_item->init(axis, units);
+    axis_group->setCurrentType(Constants::PointwiseAxisType); // calls updateWavelength()
+    axis_item->updateIndicators();
+}
+
+void SpecularBeamItem::updateWavelength()
+{
+    auto item = inclinationAxisGroup()->currentItem();
+    auto wl_item = static_cast<SpecularBeamWavelengthItem*>(getItem(P_WAVELENGTH));
+    if (auto axis_item = dynamic_cast<PointwiseAxisItem*>(item)) {
+        auto axis = axis_item->getAxis();
+        if (axis && axis_item->getUnitsLabel() == Constants::UnitsQyQz)
+            wl_item->setToRange(getLimits(axis->getMax()));
+    } else
+        wl_item->setToRange(RealLimits::positive());
 }
 
 // GISAS beam item
diff --git a/GUI/coregui/Models/BeamItems.h b/GUI/coregui/Models/BeamItems.h
index 73435a2e409..e3605f48735 100644
--- a/GUI/coregui/Models/BeamItems.h
+++ b/GUI/coregui/Models/BeamItems.h
@@ -72,6 +72,9 @@ public:
 
     void updateFileName(const QString& filename);
     void updateToData(const IAxis& axis, QString units);
+
+private:
+    void updateWavelength();
 };
 
 class BA_CORE_API_ GISASBeamItem : public BeamItem
diff --git a/GUI/coregui/Models/PointwiseAxisItem.cpp b/GUI/coregui/Models/PointwiseAxisItem.cpp
index 49fe97d0147..907e7459daa 100644
--- a/GUI/coregui/Models/PointwiseAxisItem.cpp
+++ b/GUI/coregui/Models/PointwiseAxisItem.cpp
@@ -51,7 +51,6 @@ void PointwiseAxisItem::init(const IAxis& axis, const QString& units_label)
     m_axis = std::unique_ptr<IAxis>(axis.clone());
     setItemValue(P_NATIVE_UNITS, units_label);
     findInstrument();
-    updateIndicators();
 }
 
 const IAxis* PointwiseAxisItem::getAxis() const
-- 
GitLab