From 73c6e9114cccd2512c183deb2bce2392905529a9 Mon Sep 17 00:00:00 2001
From: Mikhail Svechnikov <m.svechnikov@fz-juelich.de>
Date: Tue, 29 Nov 2022 19:48:57 +0100
Subject: [PATCH] MaterialItem: properties interfaces are created

---
 GUI/Model/Device/RectangularDetectorItem.h |  1 -
 GUI/Model/FromCore/ItemizeSample.cpp       |  2 +-
 GUI/Model/Model/ParameterTreeUtils.cpp     |  2 +-
 GUI/Model/Sample/ItemWithParticles.h       |  1 -
 GUI/Model/Sample/MaterialItem.cpp          | 32 ++++++++++----
 GUI/Model/Sample/MaterialItem.h            | 23 ++++++----
 GUI/Model/Sample/MultiLayerItem.cpp        | 51 ++--------------------
 GUI/Model/Sample/MultiLayerItem.h          | 23 +++++-----
 GUI/View/SampleDesigner/MultiLayerForm.cpp |  2 +-
 9 files changed, 57 insertions(+), 80 deletions(-)

diff --git a/GUI/Model/Device/RectangularDetectorItem.h b/GUI/Model/Device/RectangularDetectorItem.h
index 209ece888e3..84c69a0b4f6 100644
--- a/GUI/Model/Device/RectangularDetectorItem.h
+++ b/GUI/Model/Device/RectangularDetectorItem.h
@@ -16,7 +16,6 @@
 #define BORNAGAIN_GUI_MODEL_DEVICE_RECTANGULARDETECTORITEM_H
 
 #include "Device/Detector/RectangularDetector.h"
-#include "GUI/Model/Descriptor/DoubleProperty.h"
 #include "GUI/Model/Descriptor/VectorProperty.h"
 #include "GUI/Model/Device/DetectorItems.h"
 
diff --git a/GUI/Model/FromCore/ItemizeSample.cpp b/GUI/Model/FromCore/ItemizeSample.cpp
index 8e77332fffa..ea8d8db7ab4 100644
--- a/GUI/Model/FromCore/ItemizeSample.cpp
+++ b/GUI/Model/FromCore/ItemizeSample.cpp
@@ -631,7 +631,7 @@ MultiLayerItem* itemizeSample(const MultiLayer& sample, const QString& nodeName)
     auto* result = new MultiLayerItem();
     result->setSampleName(nodeName.isEmpty() ? QString::fromStdString(sample.sampleName())
                                              : nodeName);
-    result->crossCorrLength().set(sample.crossCorrLength());
+    result->setCrossCorLength(sample.crossCorrLength());
     result->setExternalField(sample.externalField());
 
     MaterialItems& matItems = result->materialItems();
diff --git a/GUI/Model/Model/ParameterTreeUtils.cpp b/GUI/Model/Model/ParameterTreeUtils.cpp
index a7424f03ec5..d8c4730ac9b 100644
--- a/GUI/Model/Model/ParameterTreeUtils.cpp
+++ b/GUI/Model/Model/ParameterTreeUtils.cpp
@@ -111,7 +111,7 @@ void ParameterTreeBuilder::addSample()
     auto* label = new ParameterLabelItem("Sample", parameterContainer()->parameterTreeRoot());
     addParameterItem(label, m_jobItem->sampleItem()->crossCorrLength());
     if (allowMagneticFields())
-        addParameterItem(label, m_jobItem->sampleItem()->externalFieldVector());
+        addParameterItem(label, m_jobItem->sampleItem()->externalField());
 
     int iLayer = 0;
     for (auto* layer : m_jobItem->sampleItem()->layers()) {
diff --git a/GUI/Model/Sample/ItemWithParticles.h b/GUI/Model/Sample/ItemWithParticles.h
index 390cd944668..c592e60a29d 100644
--- a/GUI/Model/Sample/ItemWithParticles.h
+++ b/GUI/Model/Sample/ItemWithParticles.h
@@ -15,7 +15,6 @@
 #ifndef BORNAGAIN_GUI_MODEL_SAMPLE_ITEMWITHPARTICLES_H
 #define BORNAGAIN_GUI_MODEL_SAMPLE_ITEMWITHPARTICLES_H
 
-#include "GUI/Model/Descriptor/DoubleProperty.h"
 #include "GUI/Model/Descriptor/SelectionProperty.h"
 #include "GUI/Model/Descriptor/VectorProperty.h"
 #include "GUI/Model/Sample/Item3D.h"
diff --git a/GUI/Model/Sample/MaterialItem.cpp b/GUI/Model/Sample/MaterialItem.cpp
index 80852cbe3f7..502c37f9034 100644
--- a/GUI/Model/Sample/MaterialItem.cpp
+++ b/GUI/Model/Sample/MaterialItem.cpp
@@ -95,25 +95,45 @@ void MaterialItem::setScatteringLengthDensity(const complex_t sld)
     emit dataChanged();
 }
 
-DoubleDescriptor MaterialItem::delta()
+DoubleProperty& MaterialItem::delta()
+{
+    return const_cast<DoubleProperty&>(const_cast<const MaterialItem*>(this)->delta());
+}
+
+const DoubleProperty& MaterialItem::delta() const
 {
     ASSERT(hasRefractiveIndex());
     return m_delta;
 }
 
-DoubleDescriptor MaterialItem::beta()
+DoubleProperty& MaterialItem::beta()
+{
+    return const_cast<DoubleProperty&>(const_cast<const MaterialItem*>(this)->beta());
+}
+
+const DoubleProperty& MaterialItem::beta() const
 {
     ASSERT(hasRefractiveIndex());
     return m_beta;
 }
 
-DoubleDescriptor MaterialItem::sldRe()
+DoubleProperty& MaterialItem::sldRe()
+{
+    return const_cast<DoubleProperty&>(const_cast<const MaterialItem*>(this)->sldRe());
+}
+
+const DoubleProperty& MaterialItem::sldRe() const
 {
     ASSERT(!hasRefractiveIndex());
     return m_sldRe;
 }
 
-DoubleDescriptor MaterialItem::sldIm()
+DoubleProperty& MaterialItem::sldIm()
+{
+    return const_cast<DoubleProperty&>(const_cast<const MaterialItem*>(this)->sldIm());
+}
+
+const DoubleProperty& MaterialItem::sldIm() const
 {
     ASSERT(!hasRefractiveIndex());
     return m_sldIm;
@@ -161,10 +181,6 @@ void MaterialItem::setColor(const QColor& color)
     }
 }
 
-R3 MaterialItem::magnetization() const
-{
-    return m_magnetization;
-}
 
 void MaterialItem::setMagnetization(const R3& magnetization)
 {
diff --git a/GUI/Model/Sample/MaterialItem.h b/GUI/Model/Sample/MaterialItem.h
index 093e4386649..b44d4c12722 100644
--- a/GUI/Model/Sample/MaterialItem.h
+++ b/GUI/Model/Sample/MaterialItem.h
@@ -15,7 +15,6 @@
 #ifndef BORNAGAIN_GUI_MODEL_SAMPLE_MATERIALITEM_H
 #define BORNAGAIN_GUI_MODEL_SAMPLE_MATERIALITEM_H
 
-#include "GUI/Model/Descriptor/DoubleProperty.h"
 #include "GUI/Model/Descriptor/VectorProperty.h"
 #include <QColor>
 #include <QObject>
@@ -52,11 +51,22 @@ public:
     //! Turns material into SLD based material.
     void setScatteringLengthDensity(complex_t sld);
 
-    DoubleDescriptor delta();
-    DoubleDescriptor beta();
-    DoubleDescriptor sldRe();
-    DoubleDescriptor sldIm();
+    DoubleProperty& delta();
+    const DoubleProperty& delta() const;
+
+    DoubleProperty& beta();
+    const DoubleProperty& beta() const;
+
+    DoubleProperty& sldRe();
+    const DoubleProperty& sldRe() const;
+
+    DoubleProperty& sldIm();
+    const DoubleProperty& sldIm() const;
+
+    VectorProperty& magnetizationVector() { return m_magnetization; }
     const VectorProperty& magnetizationVector() const { return m_magnetization; }
+    R3 magnetization() const { return m_magnetization; }
+    void setMagnetization(const R3& magnetization);
 
     /// \return true if refractive index was given, otherwise SLD was given
     bool hasRefractiveIndex() const;
@@ -70,9 +80,6 @@ public:
     QColor color() const;
     void setColor(const QColor& color);
 
-    R3 magnetization() const;
-    void setMagnetization(const R3& magnetization);
-
     std::unique_ptr<Material> createMaterial() const;
 
     void serialize(Streamer& s);
diff --git a/GUI/Model/Sample/MultiLayerItem.cpp b/GUI/Model/Sample/MultiLayerItem.cpp
index 428a82c1733..32a371ce4b1 100644
--- a/GUI/Model/Sample/MultiLayerItem.cpp
+++ b/GUI/Model/Sample/MultiLayerItem.cpp
@@ -34,9 +34,9 @@ const QString ExternalField("ExternalField");
 MultiLayerItem::MultiLayerItem()
 {
     m_name = "Sample";
-    m_crossCorrelationLength.init("Cross-correlation length",
-                                  "Cross correlation length of roughnesses between interfaces", 0.0,
-                                  Unit::nanometer, 5, RealLimits::nonnegative(), "cross");
+    m_crossCorrelationLength.init(
+        "Cross-correlation length", "Cross correlation length of roughnesses between interfaces",
+        0.0, Unit::nanometer, 5 /* decimals */, RealLimits::nonnegative(), "cross");
     m_externalField.init("External field", "External field (A/m)", "A/m", "extField");
 }
 
@@ -61,41 +61,6 @@ void MultiLayerItem::addStandardMaterials()
     m_materials.addRefractiveMaterial("Substrate", 6e-6, 2e-8);
 }
 
-QString MultiLayerItem::sampleName() const
-{
-    return m_name;
-}
-
-void MultiLayerItem::setSampleName(const QString& name)
-{
-    m_name = name;
-}
-
-QString MultiLayerItem::description() const
-{
-    return m_description;
-}
-
-void MultiLayerItem::setDescription(const QString& description)
-{
-    m_description = description;
-}
-
-DoubleDescriptor MultiLayerItem::crossCorrLength() const
-{
-    return m_crossCorrelationLength;
-}
-
-R3 MultiLayerItem::externalField() const
-{
-    return m_externalField;
-}
-
-void MultiLayerItem::setExternalField(const R3& externalField)
-{
-    m_externalField.set(externalField);
-}
-
 QVector<LayerItem*> MultiLayerItem::layers() const
 {
     return m_layers;
@@ -167,13 +132,3 @@ void MultiLayerItem::serialize(Streamer& s)
         }
     }
 }
-
-const MaterialItems& MultiLayerItem::materialItems() const
-{
-    return m_materials;
-}
-
-MaterialItems& MultiLayerItem::materialItems()
-{
-    return m_materials;
-}
diff --git a/GUI/Model/Sample/MultiLayerItem.h b/GUI/Model/Sample/MultiLayerItem.h
index 1287ed48b8e..f55205b073a 100644
--- a/GUI/Model/Sample/MultiLayerItem.h
+++ b/GUI/Model/Sample/MultiLayerItem.h
@@ -15,7 +15,6 @@
 #ifndef BORNAGAIN_GUI_MODEL_SAMPLE_MULTILAYERITEM_H
 #define BORNAGAIN_GUI_MODEL_SAMPLE_MULTILAYERITEM_H
 
-#include "GUI/Model/Descriptor/DoubleProperty.h"
 #include "GUI/Model/Descriptor/VectorProperty.h"
 #include "GUI/Model/Sample/Item3D.h"
 #include "GUI/Model/Sample/MaterialItems.h"
@@ -39,17 +38,19 @@ public:
 
     void addStandardMaterials();
 
-    QString sampleName() const;
-    void setSampleName(const QString& name);
+    QString sampleName() const { return m_name; }
+    void setSampleName(const QString& s) { m_name = s; }
 
-    QString description() const;
-    void setDescription(const QString& description);
+    QString description() const { return m_description; }
+    void setDescription(const QString& s) { m_description = s; }
 
-    DoubleDescriptor crossCorrLength() const;
+    DoubleProperty& crossCorrLength() { return m_crossCorrelationLength; }
+    const DoubleProperty& crossCorrLength() const { return m_crossCorrelationLength; }
+    void setCrossCorLength(double d) { m_crossCorrelationLength.set(d); }
 
-    R3 externalField() const;
-    void setExternalField(const R3& externalField);
-    const VectorProperty& externalFieldVector() const { return m_externalField; }
+    VectorProperty& externalField() { return m_externalField; }
+    const VectorProperty& externalField() const { return m_externalField; }
+    void setExternalField(const R3& r) { m_externalField.set(r); }
 
     QVector<LayerItem*> layers() const;
 
@@ -66,8 +67,8 @@ public:
     void readContentFrom(QXmlStreamReader* reader);
     void serialize(Streamer& s);
 
-    MaterialItems& materialItems();
-    const MaterialItems& materialItems() const;
+    MaterialItems& materialItems() { return m_materials; }
+    const MaterialItems& materialItems() const { return m_materials; }
 
 private:
     QString m_name;
diff --git a/GUI/View/SampleDesigner/MultiLayerForm.cpp b/GUI/View/SampleDesigner/MultiLayerForm.cpp
index 78f2cc0f2a3..99af67127df 100644
--- a/GUI/View/SampleDesigner/MultiLayerForm.cpp
+++ b/GUI/View/SampleDesigner/MultiLayerForm.cpp
@@ -86,7 +86,7 @@ MultiLayerForm::MultiLayerForm(QWidget* parent, MultiLayerItem* sampleItem,
             [=]() { m_ec->setSampleDescription(descriptionEdit->toPlainText()); });
 
     layouter.addValue(sampleItem->crossCorrLength());
-    layouter.addVector(sampleItem->externalFieldVector(), false);
+    layouter.addVector(sampleItem->externalField(), false);
     auto* collapser = GroupBoxCollapser::installIntoGroupBox(props, false);
 
     auto* showInRealspaceAction = ActionFactory::createShowInRealspaceAction(
-- 
GitLab