From e7063be5778feade81cdfcf1b45ef2636fdc8bcb Mon Sep 17 00:00:00 2001
From: Mikhail Svechnikov <m.svechnikov@fz-juelich.de>
Date: Tue, 29 Nov 2022 18:39:53 +0100
Subject: [PATCH] InterferenceItems: provide simple setters and DoubleProperty&
 interfaces

---
 GUI/Model/FromCore/ItemizeSample.cpp   | 18 ++++-----
 GUI/Model/Model/ParameterTreeUtils.cpp |  6 ---
 GUI/Model/Model/ParameterTreeUtils.h   |  2 -
 GUI/Model/Sample/InterferenceItems.cpp | 12 +++---
 GUI/Model/Sample/InterferenceItems.h   | 52 ++++++++++++++++++++------
 5 files changed, 55 insertions(+), 35 deletions(-)

diff --git a/GUI/Model/FromCore/ItemizeSample.cpp b/GUI/Model/FromCore/ItemizeSample.cpp
index 7c4023328a2..8e77332fffa 100644
--- a/GUI/Model/FromCore/ItemizeSample.cpp
+++ b/GUI/Model/FromCore/ItemizeSample.cpp
@@ -202,7 +202,7 @@ void set2DLatticeParameters(Interference2DAbstractLatticeItem* parent, const Lat
 void setPositionVariance(InterferenceItem* parent, const IInterference& iff)
 {
     double pos_var = iff.positionVariance();
-    parent->positionVariance().set(pos_var);
+    parent->setPositionVariance(pos_var);
 }
 
 template <typename T>
@@ -216,8 +216,8 @@ T* addFormFactorItem(std::variant<ParticleItem*, MesocrystalItem*> parent)
 
 void set1DLatticeItem(Interference1DLatticeItem* parent, const Interference1DLattice& sample)
 {
-    parent->length().set(sample.length());
-    parent->rotationAngle().set(Units::rad2deg(sample.xi()));
+    parent->setLength(sample.length());
+    parent->setRotationAngle(Units::rad2deg(sample.xi()));
 
     const auto* pdf = OnlyChildOfType<IProfile1D>(sample);
     setDecayFunction1D(parent, pdf);
@@ -268,18 +268,18 @@ void setFinite2DLatticeItem(InterferenceFinite2DLatticeItem* parent,
 
 void setHardDiskItem(InterferenceHardDiskItem* parent, const InterferenceHardDisk& sample)
 {
-    parent->radius().set(sample.radius());
-    parent->density().set(sample.density());
+    parent->setRadius(sample.radius());
+    parent->setDensity(sample.density());
     setPositionVariance(parent, sample);
 }
 
 void setRadialParacrystalItem(InterferenceRadialParacrystalItem* parent,
                               const InterferenceRadialParacrystal& sample)
 {
-    parent->peakDistance().set(sample.peakDistance());
-    parent->dampingLength().set(sample.dampingLength());
-    parent->domainSize().set(sample.domainSize());
-    parent->kappa().set(sample.kappa());
+    parent->setPeakDistance(sample.peakDistance());
+    parent->setDampingLength(sample.dampingLength());
+    parent->setDomainSize(sample.domainSize());
+    parent->setKappa(sample.kappa());
 
     const auto* ipdf = OnlyChildOfType<IProfile1D>(sample);
     setPDF1D(parent, ipdf);
diff --git a/GUI/Model/Model/ParameterTreeUtils.cpp b/GUI/Model/Model/ParameterTreeUtils.cpp
index 41f9b06d180..a7424f03ec5 100644
--- a/GUI/Model/Model/ParameterTreeUtils.cpp
+++ b/GUI/Model/Model/ParameterTreeUtils.cpp
@@ -158,12 +158,6 @@ void ParameterTreeBuilder::addParameterItem(ParameterLabelItem* parent, const Ve
     addParameterItem(label, d.z());
 }
 
-void ParameterTreeBuilder::addParameterItem(ParameterLabelItem* parent,
-                                            const std::variant<VectorProperty, DoubleDescriptor>& v)
-{
-    std::visit([=](auto const& e) { addParameterItem(parent, e); }, v);
-}
-
 ParameterContainerItem* ParameterTreeBuilder::parameterContainer()
 {
     return m_jobItem->parameterContainerItem();
diff --git a/GUI/Model/Model/ParameterTreeUtils.h b/GUI/Model/Model/ParameterTreeUtils.h
index 737747dc621..114decb0b03 100644
--- a/GUI/Model/Model/ParameterTreeUtils.h
+++ b/GUI/Model/Model/ParameterTreeUtils.h
@@ -55,8 +55,6 @@ private:
     void addParameterItem(ParameterLabelItem* parent, const DoubleDescriptor& d,
                           const QString& label = QString());
     void addParameterItem(ParameterLabelItem* parent, const VectorProperty& d);
-    void addParameterItem(ParameterLabelItem* parent,
-                          const std::variant<VectorProperty, DoubleDescriptor>& v);
     ParameterContainerItem* parameterContainer();
     bool allowMagneticFields() const;
 
diff --git a/GUI/Model/Sample/InterferenceItems.cpp b/GUI/Model/Sample/InterferenceItems.cpp
index ebda5c93f89..04b45db401c 100644
--- a/GUI/Model/Sample/InterferenceItems.cpp
+++ b/GUI/Model/Sample/InterferenceItems.cpp
@@ -69,7 +69,7 @@ std::unique_ptr<IInterference> Interference1DLatticeItem::createInterference() c
     auto result =
         std::make_unique<Interference1DLattice>(m_length, Units::deg2rad(m_rotationAngle));
     result->setDecayFunction(*m_decayFunction->createProfile());
-    result->setPositionVariance(positionVariance());
+    result->setPositionVariance(m_positionVariance);
     return std::unique_ptr<IInterference>(result.release());
 }
 
@@ -108,7 +108,7 @@ std::unique_ptr<IInterference> Interference2DLatticeItem::createInterference() c
 
     result->setDecayFunction(*m_decayFunction->createProfile());
     result->setIntegrationOverXi(xiIntegration());
-    result->setPositionVariance(positionVariance());
+    result->setPositionVariance(m_positionVariance);
 
     return std::unique_ptr<IInterference>(result.release());
 }
@@ -150,7 +150,7 @@ std::unique_ptr<IInterference> Interference2DParacrystalItem::createInterference
     result->setDomainSizes(m_domainSize1, m_domainSize2);
     result->setIntegrationOverXi(xiIntegration());
     result->setProbabilityDistributions(*m_pdf1->createProfile(), *m_pdf2->createProfile());
-    result->setPositionVariance(positionVariance());
+    result->setPositionVariance(m_positionVariance);
     return std::unique_ptr<IInterference>(result.release());
 }
 
@@ -181,7 +181,7 @@ std::unique_ptr<IInterference> InterferenceFinite2DLatticeItem::createInterferen
                                                                 m_domainSize1, m_domainSize2);
 
     result->setIntegrationOverXi(xiIntegration());
-    result->setPositionVariance(positionVariance());
+    result->setPositionVariance(m_positionVariance);
 
     return result;
 }
@@ -209,7 +209,7 @@ InterferenceHardDiskItem::InterferenceHardDiskItem()
 std::unique_ptr<IInterference> InterferenceHardDiskItem::createInterference() const
 {
     auto result = std::make_unique<InterferenceHardDisk>(m_radius, m_density);
-    result->setPositionVariance(positionVariance());
+    result->setPositionVariance(m_positionVariance);
     return std::unique_ptr<IInterference>(result.release());
 }
 
@@ -244,7 +244,7 @@ std::unique_ptr<IInterference> InterferenceRadialParacrystalItem::createInterfer
     result->setKappa(m_kappa);
     auto pdf = m_pdf->createProfile();
     result->setProbabilityDistribution(*pdf);
-    result->setPositionVariance(positionVariance());
+    result->setPositionVariance(m_positionVariance);
     return std::unique_ptr<IInterference>(result.release());
 }
 
diff --git a/GUI/Model/Sample/InterferenceItems.h b/GUI/Model/Sample/InterferenceItems.h
index f4525349268..f36285f74fe 100644
--- a/GUI/Model/Sample/InterferenceItems.h
+++ b/GUI/Model/Sample/InterferenceItems.h
@@ -30,7 +30,9 @@ public:
     virtual std::unique_ptr<IInterference> createInterference() const = 0;
     virtual void serialize(Streamer& s) = 0;
 
-    DoubleDescriptor positionVariance() const { return m_positionVariance; }
+    DoubleProperty& positionVariance() { return m_positionVariance; }
+    const DoubleProperty& positionVariance() const { return m_positionVariance; }
+    void setPositionVariance(double v) { m_positionVariance.set(v); }
 
 protected:
     InterferenceItem();
@@ -47,8 +49,13 @@ public:
     std::unique_ptr<IInterference> createInterference() const override;
     void serialize(Streamer& s) override;
 
-    DoubleDescriptor length() const { return m_length; }
-    DoubleDescriptor rotationAngle() const { return m_rotationAngle; }
+    DoubleProperty& length() { return m_length; }
+    const DoubleProperty& length() const { return m_length; }
+    void setLength(double v) { m_length.set(v); }
+
+    DoubleProperty& rotationAngle() { return m_rotationAngle; }
+    const DoubleProperty& rotationAngle() const { return m_rotationAngle; }
+    void setRotationAngle(double v) { m_rotationAngle.set(v); }
 
     void setDecayFunction(Profile1DItem* p) { m_decayFunction.set(p); }
     SelectionDescriptor<Profile1DItem*> decayFunction() const { return m_decayFunction; }
@@ -99,12 +106,16 @@ public:
     std::unique_ptr<IInterference> createInterference() const override;
     void serialize(Streamer& s) override;
 
-    DoubleDescriptor dampingLength() const { return m_dampingLength; }
+    DoubleProperty& dampingLength() { return m_dampingLength; }
+    const DoubleProperty& dampingLength() const { return m_dampingLength; }
     void setDampingLength(double dampingLength) { m_dampingLength.set(dampingLength); }
 
-    DoubleDescriptor domainSize1() const { return m_domainSize1; }
+    DoubleProperty& domainSize1() { return m_domainSize1; }
+    const DoubleProperty& domainSize1() const { return m_domainSize1; }
     void setDomainSize1(double size) { m_domainSize1.set(size); }
-    DoubleDescriptor domainSize2() const { return m_domainSize2; }
+
+    DoubleProperty& domainSize2() { return m_domainSize2; }
+    const DoubleProperty& domainSize2() const { return m_domainSize2; }
     void setDomainSize2(double size) { m_domainSize2.set(size); }
 
     SelectionDescriptor<Profile2DItem*> probabilityDistribution1() const { return m_pdf1; }
@@ -148,8 +159,13 @@ public:
     std::unique_ptr<IInterference> createInterference() const override;
     void serialize(Streamer& s) override;
 
-    DoubleDescriptor radius() const { return m_radius; }
-    DoubleDescriptor density() const { return m_density; }
+    DoubleProperty& radius() { return m_radius; }
+    const DoubleProperty& radius() const { return m_radius; }
+    void setRadius(double v) { m_radius.set(v); }
+
+    DoubleProperty& density() { return m_density; }
+    const DoubleProperty& density() const { return m_density; }
+    void setDensity(double v) { m_density.set(v); }
 
 private:
     DoubleProperty m_radius;
@@ -164,10 +180,22 @@ public:
     std::unique_ptr<IInterference> createInterference() const override;
     void serialize(Streamer& s) override;
 
-    DoubleDescriptor peakDistance() const { return m_peakDistance; }
-    DoubleDescriptor dampingLength() const { return m_dampingLength; }
-    DoubleDescriptor domainSize() const { return m_domainSize; }
-    DoubleDescriptor kappa() const { return m_kappa; }
+    DoubleProperty& peakDistance() { return m_peakDistance; }
+    const DoubleProperty& peakDistance() const { return m_peakDistance; }
+    void setPeakDistance(double v) { m_peakDistance.set(v); }
+
+    DoubleProperty& dampingLength() { return m_dampingLength; }
+    const DoubleProperty& dampingLength() const { return m_dampingLength; }
+    void setDampingLength(double v) { m_dampingLength.set(v); }
+
+    DoubleProperty& domainSize() { return m_domainSize; }
+    const DoubleProperty& domainSize() const { return m_domainSize; }
+    void setDomainSize(double v) { m_domainSize.set(v); }
+
+    DoubleProperty& kappa() { return m_kappa; }
+    const DoubleProperty& kappa() const { return m_kappa; }
+    void setKappa(double v) { m_kappa.set(v); }
+
     SelectionDescriptor<Profile1DItem*> probabilityDistribution() const { return m_pdf; }
     void setPDFType(Profile1DItem* p) { m_pdf.set(p); }
 
-- 
GitLab