From 1c9d628efbcfdc29a872368775a0ea7529a0e571 Mon Sep 17 00:00:00 2001
From: Dmitry Yurov <d.yurov@fz-juelich.de>
Date: Thu, 12 Apr 2018 11:22:30 +0200
Subject: [PATCH] DataItem interface expansion

Redmine: #2030
For later convenience while using it in JobItemUtils
---
 GUI/coregui/Models/DataItem.cpp               | 11 +++++
 GUI/coregui/Models/DataItem.h                 |  7 +++
 GUI/coregui/Models/IntensityDataItem.cpp      | 42 +++++++-----------
 GUI/coregui/Models/IntensityDataItem.h        | 10 ++---
 GUI/coregui/Models/JobItem.cpp                |  2 +-
 GUI/coregui/Models/JobItemUtils.cpp           |  2 +-
 GUI/coregui/Models/RealDataItem.cpp           |  6 +--
 GUI/coregui/Models/SpecularDataItem.cpp       | 43 +++++++------------
 GUI/coregui/Models/SpecularDataItem.h         | 10 ++---
 .../Views/FitWidgets/FitComparisonWidget.cpp  |  2 +-
 .../DetectorMaskDelegate.cpp                  |  2 +-
 .../Views/IntensityDataWidgets/ColorMap.cpp   |  2 +-
 .../SpecularDataWidgets/SpecularPlot.cpp      |  2 +-
 13 files changed, 67 insertions(+), 74 deletions(-)

diff --git a/GUI/coregui/Models/DataItem.cpp b/GUI/coregui/Models/DataItem.cpp
index efc99a91159..dc370cb21b1 100644
--- a/GUI/coregui/Models/DataItem.cpp
+++ b/GUI/coregui/Models/DataItem.cpp
@@ -14,9 +14,11 @@
 
 #include "DataItem.h"
 #include "BornAgainNamespace.h"
+#include "ComboProperty.h"
 #include "GUIHelpers.h"
 
 const QString DataItem::P_FILE_NAME = "FileName";
+const QString DataItem::P_AXES_UNITS = "Axes Units";
 
 void DataItem::setOutputData(OutputData<double>* data)
 {
@@ -49,11 +51,20 @@ void DataItem::setLastModified(const QDateTime& dtime)
     m_last_modified = dtime;
 }
 
+QString DataItem::selectedAxesUnits() const
+{
+    ComboProperty combo = getItemValue(DataItem::P_AXES_UNITS).value<ComboProperty>();
+    return combo.getValue();
+}
+
 DataItem::DataItem(const QString& modelType) : SessionItem(modelType)
 {
     // name of the file used to serialize given IntensityDataItem
     addProperty(P_FILE_NAME, QStringLiteral("undefined"))->setVisible(false);
 
+    ComboProperty units = ComboProperty() << Constants::UnitsNbins;
+    addProperty(P_AXES_UNITS, units.variant());
+
     mapper()->setOnPropertyChange([this](const QString& name) {
         if (name == P_FILE_NAME)
             setLastModified(QDateTime::currentDateTime());
diff --git a/GUI/coregui/Models/DataItem.h b/GUI/coregui/Models/DataItem.h
index 627eed28728..b96cfe9bf25 100644
--- a/GUI/coregui/Models/DataItem.h
+++ b/GUI/coregui/Models/DataItem.h
@@ -29,6 +29,7 @@ class BA_CORE_API_ DataItem : public SessionItem
 {
 public:
     static const QString P_FILE_NAME;
+    static const QString P_AXES_UNITS;
 
     OutputData<double>* getOutputData() { return m_data.get(); }
     const OutputData<double>* getOutputData() const { return m_data.get(); }
@@ -40,6 +41,12 @@ public:
     QDateTime lastModified() const;
     void setLastModified(const QDateTime& dtime);
 
+    QString selectedAxesUnits() const;
+
+    virtual void setXaxisTitle(QString xtitle) = 0;
+    virtual void setYaxisTitle(QString ytitle) = 0;
+    virtual void setAxesRangeToData() = 0;
+
 protected:
     DataItem(const QString& modelType);
 
diff --git a/GUI/coregui/Models/IntensityDataItem.cpp b/GUI/coregui/Models/IntensityDataItem.cpp
index a4327ab095d..1fd22074818 100644
--- a/GUI/coregui/Models/IntensityDataItem.cpp
+++ b/GUI/coregui/Models/IntensityDataItem.cpp
@@ -34,7 +34,6 @@ ComboProperty gradientCombo() {
 }
 }
 
-const QString IntensityDataItem::P_AXES_UNITS = "Axes Units";
 const QString IntensityDataItem::P_TITLE = "Title";
 const QString IntensityDataItem::P_PROJECTIONS_FLAG = "Projections";
 const QString IntensityDataItem::P_IS_INTERPOLATED = "Interpolation";
@@ -47,9 +46,6 @@ const QString IntensityDataItem::T_PROJECTIONS = "Projection tag";
 
 IntensityDataItem::IntensityDataItem() : DataItem(Constants::IntensityDataType)
 {
-    ComboProperty units = ComboProperty() << Constants::UnitsNbins;
-    addProperty(P_AXES_UNITS, units.variant());
-
     addProperty(P_TITLE, QString())->setVisible(false);
 
     addProperty(P_PROJECTIONS_FLAG, false)->setVisible(false);
@@ -193,10 +189,23 @@ void IntensityDataItem::setZAxisLocked(bool state)
     return getItem(P_ZAXIS)->setItemValue(AmplitudeAxisItem::P_LOCK_MIN_MAX, state);
 }
 
-QString IntensityDataItem::selectedAxesUnits() const
+void IntensityDataItem::setXaxisTitle(QString xtitle)
+{
+    getItem(P_XAXIS)->setItemValue(BasicAxisItem::P_TITLE, xtitle);
+}
+
+void IntensityDataItem::setYaxisTitle(QString ytitle)
+{
+    getItem(P_YAXIS)->setItemValue(BasicAxisItem::P_TITLE, ytitle);
+}
+
+//! set zoom range of x,y axes to axes of input data
+void IntensityDataItem::setAxesRangeToData()
 {
-    ComboProperty combo = getItemValue(IntensityDataItem::P_AXES_UNITS).value<ComboProperty>();
-    return combo.getValue();
+    setLowerX(getXmin());
+    setUpperX(getXmax());
+    setLowerY(getYmin());
+    setUpperY(getYmax());
 }
 
 void IntensityDataItem::setLowerX(double xmin)
@@ -248,25 +257,6 @@ void IntensityDataItem::setInterpolated(bool interp)
     setItemValue(P_IS_INTERPOLATED, interp);
 }
 
-void IntensityDataItem::setXaxisTitle(QString xtitle)
-{
-    getItem(P_XAXIS)->setItemValue(BasicAxisItem::P_TITLE, xtitle);
-}
-
-void IntensityDataItem::setYaxisTitle(QString ytitle)
-{
-    getItem(P_YAXIS)->setItemValue(BasicAxisItem::P_TITLE, ytitle);
-}
-
-//! set zoom range of x,y axes to axes of input data
-void IntensityDataItem::setAxesRangeToData()
-{
-    setLowerX(getXmin());
-    setUpperX(getXmax());
-    setLowerY(getYmin());
-    setUpperY(getYmax());
-}
-
 //! Sets zoom range of X,Y axes, if it was not yet defined.
 
 void IntensityDataItem::updateAxesZoomLevel()
diff --git a/GUI/coregui/Models/IntensityDataItem.h b/GUI/coregui/Models/IntensityDataItem.h
index 10585d8daae..21557c27d5b 100644
--- a/GUI/coregui/Models/IntensityDataItem.h
+++ b/GUI/coregui/Models/IntensityDataItem.h
@@ -28,7 +28,6 @@ public:
     static const QString P_TITLE;
     static const QString P_IS_INTERPOLATED;
     static const QString P_GRADIENT;
-    static const QString P_AXES_UNITS;
     static const QString P_XAXIS;
     static const QString P_YAXIS;
     static const QString P_ZAXIS;
@@ -73,8 +72,6 @@ public:
     bool isZAxisLocked() const;
     void setZAxisLocked(bool state);
 
-    QString selectedAxesUnits() const;
-
     void updateDataRange();
     void computeDataRange();
     QPair<double, double> dataRange() const;
@@ -91,6 +88,10 @@ public:
     MaskContainerItem* maskContainerItem();
     ProjectionContainerItem* projectionContainerItem();
 
+    void setXaxisTitle(QString xtitle) override;
+    void setYaxisTitle(QString ytitle) override;
+    void setAxesRangeToData() override;
+
 public slots:
     void setLowerX(double xmin);
     void setUpperX(double xmax);
@@ -101,9 +102,6 @@ public slots:
     void setUpperZ(double zmax);
     void setLogz(bool logz);
     void setInterpolated(bool interp);
-    void setXaxisTitle(QString xtitle);
-    void setYaxisTitle(QString ytitle);
-    void setAxesRangeToData();
 
 private:
     void updateAxesZoomLevel();
diff --git a/GUI/coregui/Models/JobItem.cpp b/GUI/coregui/Models/JobItem.cpp
index aa221bdc33e..f72de8e265f 100644
--- a/GUI/coregui/Models/JobItem.cpp
+++ b/GUI/coregui/Models/JobItem.cpp
@@ -84,7 +84,7 @@ JobItem::JobItem() : SessionItem(Constants::JobItemType)
 
     mapper()->setOnChildPropertyChange([this](SessionItem* item, const QString& name) {
         if (item->parent() == this && item->modelType() == Constants::IntensityDataType
-            && name == IntensityDataItem::P_AXES_UNITS) {
+            && name == DataItem::P_AXES_UNITS) {
             auto intensityItem = dynamic_cast<IntensityDataItem*>(item);
 
             MaskUnitsConverter converter;
diff --git a/GUI/coregui/Models/JobItemUtils.cpp b/GUI/coregui/Models/JobItemUtils.cpp
index 0a68439f665..d99d5a15ad5 100644
--- a/GUI/coregui/Models/JobItemUtils.cpp
+++ b/GUI/coregui/Models/JobItemUtils.cpp
@@ -194,7 +194,7 @@ void JobItemUtils::setIntensityItemAxesUnits(IntensityDataItem* intensityItem,
     AxesUnits preferrable_units = converter.defaultUnits();
 
     combo.setValue(nameFromAxesUnits(preferrable_units));
-    intensityItem->setItemValue(IntensityDataItem::P_AXES_UNITS, combo.variant());
+    intensityItem->setItemValue(DataItem::P_AXES_UNITS, combo.variant());
 }
 
 void JobItemUtils::createDefaultDetectorMap(IntensityDataItem* intensityItem,
diff --git a/GUI/coregui/Models/RealDataItem.cpp b/GUI/coregui/Models/RealDataItem.cpp
index 7e7fa89317a..b0ab10acaeb 100644
--- a/GUI/coregui/Models/RealDataItem.cpp
+++ b/GUI/coregui/Models/RealDataItem.cpp
@@ -60,7 +60,7 @@ RealDataItem::RealDataItem()
                 [this](SessionItem* item, const QString &name)
     {
         if (item && item->modelType() == Constants::IntensityDataType
-            && name == IntensityDataItem::P_AXES_UNITS) {
+            && name == DataItem::P_AXES_UNITS) {
             if(!m_linkedInstrument)
                 return;
             mapper()->setActive(false);
@@ -129,8 +129,8 @@ void RealDataItem::updateToInstrument()
 
     if(m_linkedInstrument == 0) {
         ComboProperty combo = ComboProperty() << Constants::UnitsNbins;
-        item->setItemValue(IntensityDataItem::P_AXES_UNITS, combo.variant());
-        item->getItem(IntensityDataItem::P_AXES_UNITS)->setVisible(true);
+        item->setItemValue(DataItem::P_AXES_UNITS, combo.variant());
+        item->getItem(DataItem::P_AXES_UNITS)->setVisible(true);
         item->setXaxisTitle("X [nbins]");
         item->setYaxisTitle("Y [nbins]");
         MaskUnitsConverter converter;
diff --git a/GUI/coregui/Models/SpecularDataItem.cpp b/GUI/coregui/Models/SpecularDataItem.cpp
index d6128ef81bc..b50e91e7fe4 100644
--- a/GUI/coregui/Models/SpecularDataItem.cpp
+++ b/GUI/coregui/Models/SpecularDataItem.cpp
@@ -15,20 +15,15 @@
 #include "SpecularDataItem.h"
 #include "AxesItems.h"
 #include "BornAgainNamespace.h"
-#include "ComboProperty.h"
 #include "GUIHelpers.h"
 #include "BornAgainNamespace.h"
 
-const QString SpecularDataItem::P_AXES_UNITS = "Axes Units";
 const QString SpecularDataItem::P_TITLE = "Title";
 const QString SpecularDataItem::P_XAXIS = "x-axis";
 const QString SpecularDataItem::P_YAXIS = "y-axis";
 
 SpecularDataItem::SpecularDataItem() : DataItem(Constants::SpecularDataType)
 {
-    ComboProperty units = ComboProperty() << Constants::UnitsNbins;
-    addProperty(P_AXES_UNITS, units.variant());
-
     addProperty(P_TITLE, QString())->setVisible(false);
 
     SessionItem* item = addGroupProperty(P_XAXIS, Constants::BasicAxisType);
@@ -131,10 +126,23 @@ QString SpecularDataItem::getYaxisTitle() const
     return getItem(P_YAXIS)->getItemValue(BasicAxisItem::P_TITLE).toString();
 }
 
-QString SpecularDataItem::selectedAxesUnits() const
+void SpecularDataItem::setXaxisTitle(QString xtitle)
+{
+    getItem(P_XAXIS)->setItemValue(BasicAxisItem::P_TITLE, xtitle);
+}
+
+void SpecularDataItem::setYaxisTitle(QString ytitle)
+{
+    getItem(P_YAXIS)->setItemValue(AmplitudeAxisItem::P_TITLE, ytitle);
+}
+
+//! set zoom range of x,y axes to axes of input data
+void SpecularDataItem::setAxesRangeToData()
 {
-    ComboProperty combo = getItemValue(SpecularDataItem::P_AXES_UNITS).value<ComboProperty>();
-    return combo.getValue();
+    setLowerX(getXmin());
+    setUpperX(getXmax());
+    setLowerY(getYmin());
+    setUpperY(getYmax());
 }
 
 void SpecularDataItem::setLowerX(double xmin)
@@ -162,25 +170,6 @@ void SpecularDataItem::setLog(bool log_flag)
     getItem(P_YAXIS)->setItemValue(AmplitudeAxisItem::P_IS_LOGSCALE, log_flag);
 }
 
-void SpecularDataItem::setXaxisTitle(QString xtitle)
-{
-    getItem(P_XAXIS)->setItemValue(BasicAxisItem::P_TITLE, xtitle);
-}
-
-void SpecularDataItem::setYaxisTitle(QString ytitle)
-{
-    getItem(P_YAXIS)->setItemValue(AmplitudeAxisItem::P_TITLE, ytitle);
-}
-
-//! set zoom range of x,y axes to axes of input data
-void SpecularDataItem::setAxesRangeToData()
-{
-    setLowerX(getXmin());
-    setUpperX(getXmax());
-    setLowerY(getYmin());
-    setUpperY(getYmax());
-}
-
 //! Sets zoom range of X,Y axes, if it was not yet defined.
 
 void SpecularDataItem::updateAxesZoomLevel()
diff --git a/GUI/coregui/Models/SpecularDataItem.h b/GUI/coregui/Models/SpecularDataItem.h
index 2ec6db95f62..8b5702cf50f 100644
--- a/GUI/coregui/Models/SpecularDataItem.h
+++ b/GUI/coregui/Models/SpecularDataItem.h
@@ -26,7 +26,6 @@ class BA_CORE_API_ SpecularDataItem : public DataItem
 {
 public:
     static const QString P_TITLE;
-    static const QString P_AXES_UNITS;
     static const QString P_XAXIS;
     static const QString P_YAXIS;
 
@@ -58,8 +57,6 @@ public:
     QString getXaxisTitle() const;
     QString getYaxisTitle() const;
 
-    QString selectedAxesUnits() const;
-
     void updateDataRange();
     void computeDataRange();
     QPair<double, double> dataRange() const;
@@ -70,15 +67,16 @@ public:
 
     void resetView();
 
+    void setXaxisTitle(QString xtitle) override;
+    void setYaxisTitle(QString ytitle) override;
+    void setAxesRangeToData() override;
+
 public slots:
     void setLowerX(double xmin);
     void setUpperX(double xmax);
     void setLowerY(double ymin);
     void setUpperY(double ymax);
     void setLog(bool log_flag);
-    void setXaxisTitle(QString xtitle);
-    void setYaxisTitle(QString ytitle);
-    void setAxesRangeToData();
 
 private:
     void updateAxesZoomLevel();
diff --git a/GUI/coregui/Views/FitWidgets/FitComparisonWidget.cpp b/GUI/coregui/Views/FitWidgets/FitComparisonWidget.cpp
index eca373c4bd9..eb7aeda67a6 100644
--- a/GUI/coregui/Views/FitWidgets/FitComparisonWidget.cpp
+++ b/GUI/coregui/Views/FitWidgets/FitComparisonWidget.cpp
@@ -128,7 +128,7 @@ void FitComparisonWidget::subscribeToItem()
     if (auto diff_item = diffItem()) {
         diff_item->mapper()->setOnPropertyChange([this](const QString& name)
         {
-            if (name == IntensityDataItem::P_AXES_UNITS) {
+            if (name == DataItem::P_AXES_UNITS) {
                 JobItemUtils::updateDataAxes(diffItem(), jobItem()->instrumentItem());
             }
         }, this);
diff --git a/GUI/coregui/Views/InstrumentWidgets/DetectorMaskDelegate.cpp b/GUI/coregui/Views/InstrumentWidgets/DetectorMaskDelegate.cpp
index ec8bf6e59a7..a19b4c8ec8b 100644
--- a/GUI/coregui/Views/InstrumentWidgets/DetectorMaskDelegate.cpp
+++ b/GUI/coregui/Views/InstrumentWidgets/DetectorMaskDelegate.cpp
@@ -78,5 +78,5 @@ void DetectorMaskDelegate::createIntensityDataItem()
     JobItemUtils::createDefaultDetectorMap(m_intensityItem, instrument);
 
     m_intensityItem->getOutputData()->setAllTo(1.0);
-    m_intensityItem->getItem(IntensityDataItem::P_AXES_UNITS)->setEnabled(false);
+    m_intensityItem->getItem(DataItem::P_AXES_UNITS)->setEnabled(false);
 }
diff --git a/GUI/coregui/Views/IntensityDataWidgets/ColorMap.cpp b/GUI/coregui/Views/IntensityDataWidgets/ColorMap.cpp
index d9036811ff0..6939c08ae56 100644
--- a/GUI/coregui/Views/IntensityDataWidgets/ColorMap.cpp
+++ b/GUI/coregui/Views/IntensityDataWidgets/ColorMap.cpp
@@ -150,7 +150,7 @@ void ColorMap::onPropertyChanged(const QString& property_name)
     } else if (property_name == IntensityDataItem::P_IS_INTERPOLATED) {
         m_colorMap->setInterpolate(intensityItem()->isInterpolated());
         replot();
-    } else if (property_name == IntensityDataItem::P_AXES_UNITS) {
+    } else if (property_name == DataItem::P_AXES_UNITS) {
         setAxesRangeFromItem(intensityItem());
         replot();
     }
diff --git a/GUI/coregui/Views/SpecularDataWidgets/SpecularPlot.cpp b/GUI/coregui/Views/SpecularDataWidgets/SpecularPlot.cpp
index 59277109310..40391be0df7 100644
--- a/GUI/coregui/Views/SpecularDataWidgets/SpecularPlot.cpp
+++ b/GUI/coregui/Views/SpecularDataWidgets/SpecularPlot.cpp
@@ -63,7 +63,7 @@ void SpecularPlot::onPropertyChanged(const QString& property_name)
     if (m_block_update)
         return;
 
-    if (property_name == SpecularDataItem::P_AXES_UNITS) {
+    if (property_name == DataItem::P_AXES_UNITS) {
         setAxesRangeFromItem(specularItem());
         replot();
     }
-- 
GitLab