From 50cb3941648dc5b3d4b919c2ee73665ba8e76273 Mon Sep 17 00:00:00 2001
From: Mikhail Svechnikov <m.svechnikov@fz-juelich.de>
Date: Wed, 20 Jul 2022 16:46:38 +0200
Subject: [PATCH 01/32] DataAccessWidget: add fourier case

---
 GUI/View/Common/DataAccessWidget.cpp | 13 +++++++++++++
 GUI/View/Common/DataAccessWidget.h   |  3 +++
 2 files changed, 16 insertions(+)

diff --git a/GUI/View/Common/DataAccessWidget.cpp b/GUI/View/Common/DataAccessWidget.cpp
index 3e54b763728..1117b762229 100644
--- a/GUI/View/Common/DataAccessWidget.cpp
+++ b/GUI/View/Common/DataAccessWidget.cpp
@@ -31,6 +31,11 @@ void DataAccessWidget::setJobOrRealItem(JobRealBase* item)
     connect(m_item, &QObject::destroyed, this, [=](){ m_item = nullptr; });
 }
 
+void DataAccessWidget::setFourierItem(IntensityDataItem* fftItem)
+{
+    m_fftItem = fftItem;
+}
+
 QList<QAction*> DataAccessWidget::actionList()
 {
     return QList<QAction*>();
@@ -109,21 +114,29 @@ SpecularDataItem* DataAccessWidget::currentSpecularDataItem() const
 
 QList<IntensityDataItem*> DataAccessWidget::mainIntensityDataItems() const
 {
+    if(m_fftItem)
+        return {m_fftItem};
     return mainDataItems<IntensityDataItem>();
 }
 
 QList<IntensityDataItem*> DataAccessWidget::otherMainIntensityDataItems() const
 {
+    if(m_fftItem)
+        return {};
     return otherMainDataItems<IntensityDataItem>();
 }
 
 QList<IntensityDataItem*> DataAccessWidget::allIntensityDataItems() const
 {
+    if(m_fftItem)
+        return {m_fftItem};
     return allDataItems<IntensityDataItem>();
 }
 
 QList<IntensityDataItem*> DataAccessWidget::otherAllIntensityDataItems() const
 {
+    if(m_fftItem)
+        return {};
     return otherAllDataItems<IntensityDataItem>();
 }
 
diff --git a/GUI/View/Common/DataAccessWidget.h b/GUI/View/Common/DataAccessWidget.h
index 2ffb8e23f06..c5863cffa9c 100644
--- a/GUI/View/Common/DataAccessWidget.h
+++ b/GUI/View/Common/DataAccessWidget.h
@@ -34,6 +34,8 @@ public:
 
     virtual void setJobOrRealItem(JobRealBase* item);
 
+    void setFourierItem(IntensityDataItem* fftItem);
+
     virtual QList<QAction*> actionList();
 
     JobItem* jobItem() const;
@@ -131,6 +133,7 @@ private:
     QList<T*> otherMainDataItems() const;
 
     JobRealBase* m_item;
+    IntensityDataItem* m_fftItem;
 };
 
 template <class T>
-- 
GitLab


From 976287aa7e4de8a254167add403635c9355e3d98 Mon Sep 17 00:00:00 2001
From: Mikhail Svechnikov <m.svechnikov@fz-juelich.de>
Date: Wed, 20 Jul 2022 17:43:33 +0200
Subject: [PATCH 02/32] IntensityDataWidget: fft update

---
 GUI/View/Common/DataAccessWidget.cpp          |  2 ++
 GUI/View/Common/DataAccessWidget.h            |  2 +-
 GUI/View/Plot2D/IntensityDataCanvas.cpp       | 19 +++++--------------
 GUI/View/Plot2D/IntensityDataCanvas.h         |  3 +--
 .../Plot2D/IntensityDataPropertyWidget.cpp    | 10 ++++++++--
 GUI/View/Plot2D/IntensityDataPropertyWidget.h |  3 ++-
 GUI/View/Plot2D/IntensityDataWidget.cpp       | 14 +++++++++-----
 7 files changed, 28 insertions(+), 25 deletions(-)

diff --git a/GUI/View/Common/DataAccessWidget.cpp b/GUI/View/Common/DataAccessWidget.cpp
index 1117b762229..0bfcd596195 100644
--- a/GUI/View/Common/DataAccessWidget.cpp
+++ b/GUI/View/Common/DataAccessWidget.cpp
@@ -18,6 +18,8 @@
 
 DataAccessWidget::DataAccessWidget(QWidget* parent)
     : QWidget(parent)
+    , m_item(nullptr)
+    , m_fftItem(nullptr)
 {
 }
 DataAccessWidget::~DataAccessWidget() = default;
diff --git a/GUI/View/Common/DataAccessWidget.h b/GUI/View/Common/DataAccessWidget.h
index c5863cffa9c..bd4530f0636 100644
--- a/GUI/View/Common/DataAccessWidget.h
+++ b/GUI/View/Common/DataAccessWidget.h
@@ -34,7 +34,7 @@ public:
 
     virtual void setJobOrRealItem(JobRealBase* item);
 
-    void setFourierItem(IntensityDataItem* fftItem);
+    virtual void setFourierItem(IntensityDataItem* fftItem);
 
     virtual QList<QAction*> actionList();
 
diff --git a/GUI/View/Plot2D/IntensityDataCanvas.cpp b/GUI/View/Plot2D/IntensityDataCanvas.cpp
index ca069a6110c..509b0ba1637 100644
--- a/GUI/View/Plot2D/IntensityDataCanvas.cpp
+++ b/GUI/View/Plot2D/IntensityDataCanvas.cpp
@@ -38,7 +38,6 @@ IntensityDataCanvas::IntensityDataCanvas(QWidget* parent)
     , m_resetViewAction(nullptr)
     , m_rotateDataAction(nullptr)
     , m_savePlotAction(nullptr)
-    , m_fftItem(nullptr)
 {
     setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
 
@@ -65,15 +64,10 @@ void IntensityDataCanvas::setJobOrRealItem(JobRealBase* job_or_real_Item)
         initRotation();
 }
 
-void IntensityDataCanvas::setFourierIntensity(IntensityDataItem* fftItem)
+void IntensityDataCanvas::setFourierItem(IntensityDataItem* fftItem)
 {
-    if(fftItem) {
-        m_fftItem = fftItem;
-        m_colorMapCanvas->setIntensityItem(m_fftItem);
-    } else {
-        m_fftItem = nullptr;
-        m_colorMapCanvas->setIntensityItem(currentIntensityDataItem());
-    }
+    DataAccessWidget::setFourierItem(fftItem);
+    m_colorMapCanvas->setIntensityItem(currentIntensityDataItem());
 }
 
 QSize IntensityDataCanvas::sizeHint() const
@@ -96,11 +90,8 @@ QList<QAction*> IntensityDataCanvas::actionList()
 
 void IntensityDataCanvas::onResetViewAction()
 {
-    if(m_fftItem)
-        m_fftItem->resetView();
-    else
-        for(auto item : allIntensityDataItems())
-            item->resetView();
+    for(auto item : allIntensityDataItems())
+        item->resetView();
 }
 
 void IntensityDataCanvas::onSavePlotAction()
diff --git a/GUI/View/Plot2D/IntensityDataCanvas.h b/GUI/View/Plot2D/IntensityDataCanvas.h
index e5574491690..3d2b95a77c5 100644
--- a/GUI/View/Plot2D/IntensityDataCanvas.h
+++ b/GUI/View/Plot2D/IntensityDataCanvas.h
@@ -30,7 +30,7 @@ public:
     explicit IntensityDataCanvas(QWidget* parent = nullptr);
 
     void setJobOrRealItem(JobRealBase* job_or_real_Item) override;
-    void setFourierIntensity(IntensityDataItem* fftItem);
+    void setFourierItem(IntensityDataItem* fftItem) override;
 
     QSize sizeHint() const override;
     QSize minimumSizeHint() const override;
@@ -50,7 +50,6 @@ private:
     QAction* m_resetViewAction;
     QAction* m_rotateDataAction;
     QAction* m_savePlotAction;
-    IntensityDataItem* m_fftItem;
 };
 
 #endif // BORNAGAIN_GUI_VIEW_PLOT2D_INTENSITYDATACANVAS_H
diff --git a/GUI/View/Plot2D/IntensityDataPropertyWidget.cpp b/GUI/View/Plot2D/IntensityDataPropertyWidget.cpp
index abc0a21b57c..9af8baece5e 100644
--- a/GUI/View/Plot2D/IntensityDataPropertyWidget.cpp
+++ b/GUI/View/Plot2D/IntensityDataPropertyWidget.cpp
@@ -44,10 +44,16 @@ IntensityDataPropertyWidget::IntensityDataPropertyWidget(QWidget* parent)
 void IntensityDataPropertyWidget::setJobOrRealItem(JobRealBase* job_or_real_Item)
 {
     DataAccessWidget::setJobOrRealItem(job_or_real_Item);
-    setIntensityItems(allIntensityDataItems());
+    createPanelElements(allIntensityDataItems());
 }
 
-void IntensityDataPropertyWidget::setIntensityItems(const QList<IntensityDataItem*>& items)
+void IntensityDataPropertyWidget::setFourierItem(IntensityDataItem* fftItem)
+{
+    DataAccessWidget::setFourierItem(fftItem);
+    createPanelElements(allIntensityDataItems());
+}
+
+void IntensityDataPropertyWidget::createPanelElements(const QList<IntensityDataItem*>& items)
 {
     if (items.size() == 0)
         return;
diff --git a/GUI/View/Plot2D/IntensityDataPropertyWidget.h b/GUI/View/Plot2D/IntensityDataPropertyWidget.h
index 68bde3a44e2..2a2d35358d8 100644
--- a/GUI/View/Plot2D/IntensityDataPropertyWidget.h
+++ b/GUI/View/Plot2D/IntensityDataPropertyWidget.h
@@ -29,7 +29,8 @@ public:
     explicit IntensityDataPropertyWidget(QWidget* parent = nullptr);
 
     void setJobOrRealItem(JobRealBase* job_or_real_Item) override;
-    void setIntensityItems(const QList<IntensityDataItem*>& items);
+    void setFourierItem(IntensityDataItem* fftItem) override;
+    void createPanelElements(const QList<IntensityDataItem*>& items);
 
 private:
     void updateUIValues();
diff --git a/GUI/View/Plot2D/IntensityDataWidget.cpp b/GUI/View/Plot2D/IntensityDataWidget.cpp
index 890d18ded56..44c441befaa 100644
--- a/GUI/View/Plot2D/IntensityDataWidget.cpp
+++ b/GUI/View/Plot2D/IntensityDataWidget.cpp
@@ -51,10 +51,14 @@ IntensityDataWidget::IntensityDataWidget(QWidget* parent)
 
 void IntensityDataWidget::setJobOrRealItem(JobRealBase* job_or_real_item)
 {
+    JobItem* oldJob = jobItem();
     DataAccessWidget::setJobOrRealItem(job_or_real_item);
     m_intensityCanvas->setJobOrRealItem(job_or_real_item);
     m_propertyWidget->setJobOrRealItem(job_or_real_item);
-    m_fftPresenter->reset();
+
+    if(oldJob != jobItem())
+        m_fftPresenter->reset();
+    onFFTAction();
 }
 
 QList<QAction*> IntensityDataWidget::actionList()
@@ -78,11 +82,11 @@ void IntensityDataWidget::onFFTAction()
 
     if (m_fftPresenter->inFFTMode()) {
         auto* fftItem = m_fftPresenter->fftItem(currentIntensityDataItem());
-        m_intensityCanvas->setFourierIntensity(fftItem);
-        m_propertyWidget->setIntensityItems({fftItem});
+        m_intensityCanvas->setFourierItem(fftItem);
+        m_propertyWidget->setFourierItem(fftItem);
     } else {
         // returning ColorMap to non-fft presentation
-        m_intensityCanvas->setFourierIntensity(nullptr);
-        m_propertyWidget->setIntensityItems(allIntensityDataItems());
+        m_intensityCanvas->setFourierItem(nullptr);
+        m_propertyWidget->setFourierItem(nullptr);
     }
 }
-- 
GitLab


From d33c9fd2799392c30c3665eaae1ae81eabc1c780 Mon Sep 17 00:00:00 2001
From: Mikhail Svechnikov <m.svechnikov@fz-juelich.de>
Date: Wed, 20 Jul 2022 18:03:42 +0200
Subject: [PATCH 03/32] IntensityDataPropertyWidget: use built-in list views

---
 .../Plot2D/IntensityDataPropertyWidget.cpp    | 85 +++++++++----------
 GUI/View/Plot2D/IntensityDataPropertyWidget.h |  5 +-
 .../PlotSpecular/SpecularDataPropertyWidget.h |  2 +-
 3 files changed, 43 insertions(+), 49 deletions(-)

diff --git a/GUI/View/Plot2D/IntensityDataPropertyWidget.cpp b/GUI/View/Plot2D/IntensityDataPropertyWidget.cpp
index 9af8baece5e..5cb6faa935c 100644
--- a/GUI/View/Plot2D/IntensityDataPropertyWidget.cpp
+++ b/GUI/View/Plot2D/IntensityDataPropertyWidget.cpp
@@ -44,51 +44,44 @@ IntensityDataPropertyWidget::IntensityDataPropertyWidget(QWidget* parent)
 void IntensityDataPropertyWidget::setJobOrRealItem(JobRealBase* job_or_real_Item)
 {
     DataAccessWidget::setJobOrRealItem(job_or_real_Item);
-    createPanelElements(allIntensityDataItems());
+    createPanelElements();
 }
 
 void IntensityDataPropertyWidget::setFourierItem(IntensityDataItem* fftItem)
 {
+    ASSERT(jobRealBase());
     DataAccessWidget::setFourierItem(fftItem);
-    createPanelElements(allIntensityDataItems());
+    createPanelElements();
 }
 
-void IntensityDataPropertyWidget::createPanelElements(const QList<IntensityDataItem*>& items)
+void IntensityDataPropertyWidget::unsubscribe()
 {
-    if (items.size() == 0)
-        return;
+    for(auto item : allIntensityDataItems())
+        disconnect(item, nullptr, this, nullptr);
+}
 
-    IntensityDataItem* firstItem = items.first();
-    if(!firstItem)
+void IntensityDataPropertyWidget::createPanelElements()
+{
+    if (allIntensityDataItems().size() == 0)
         return;
 
-    QList<IntensityDataItem*> otherItems = items;
-    otherItems.removeFirst();
-
-    QList<IntensityDataItem*> otherMainItems = items;
-    otherMainItems.removeFirst();    
-    if(otherMainItems.size() > 0)
-        otherMainItems.removeLast();
-
-    for(auto item : items)
-        disconnect(item, nullptr, this, nullptr);
-
+    unsubscribe();
     GUI::Util::Layout::clearLayout(m_mainLayout);
     m_updaters.clear();
 
     m_mainLayout->addRow("Axes units:", GUI::Util::createComboBoxUpdScroll(
-        firstItem->axesUnits(), &m_updaters, [=](int newIndex) {
-        for(auto item : otherItems)
+        currentIntensityDataItem()->axesUnits(), &m_updaters, [=](int newIndex) {
+        for(auto item : otherAllIntensityDataItems())
             item->axesUnits().setCurrentIndex(newIndex); }));
 
     m_mainLayout->addRow("Color scheme:", GUI::Util::createComboBoxUpdScroll(
-        firstItem->gradient(), &m_updaters, [=](int newIndex) {
-        for(auto item : otherItems)
+        currentIntensityDataItem()->gradient(), &m_updaters, [=](int newIndex) {
+        for(auto item : otherAllIntensityDataItems())
             item->gradient().setCurrentIndex(newIndex); }));
 
     m_mainLayout->addRow(GUI::Util::createCheckBox("Interpolate",
-        [=]() { return firstItem->isInterpolated(); }, [=](bool b) {
-        for(auto item : items)
+        [=]() { return currentIntensityDataItem()->isInterpolated(); }, [=](bool b) {
+        for(auto item : allIntensityDataItems())
             item->setInterpolated(b); }, &m_updaters));
 
     // -- x-axis
@@ -98,18 +91,18 @@ void IntensityDataPropertyWidget::createPanelElements(const QList<IntensityDataI
     xFormLayout->setSpacing(5);
 
     xFormLayout->addRow("Min:", GUI::Util::createDoubleSpinboxScroll(
-        firstItem->xAxisItem()->min(), &m_updaters, [=](double newValue) {
-        for(auto item : otherItems)
+        currentIntensityDataItem()->xAxisItem()->min(), &m_updaters, [=](double newValue) {
+        for(auto item : otherAllIntensityDataItems())
             item->xAxisItem()->min().set(newValue); }));
 
     xFormLayout->addRow("Max:", GUI::Util::createDoubleSpinboxScroll(
-        firstItem->xAxisItem()->max(), &m_updaters, [=](double newValue) {
-        for(auto item : otherItems)
+        currentIntensityDataItem()->xAxisItem()->max(), &m_updaters, [=](double newValue) {
+        for(auto item : otherAllIntensityDataItems())
             item->xAxisItem()->max().set(newValue); }));
 
     xFormLayout->addRow("Title:", GUI::Util::createTextEdit(
-        [=]() { return firstItem->xAxisItem()->title(); }, [=](QString newText) {
-        for(auto item : items)
+        [=]() { return currentIntensityDataItem()->xAxisItem()->title(); }, [=](QString newText) {
+        for(auto item : allIntensityDataItems())
             item->xAxisItem()->setTitle(newText); }, &m_updaters));
 
     m_mainLayout->addRow(xGroup);
@@ -121,18 +114,18 @@ void IntensityDataPropertyWidget::createPanelElements(const QList<IntensityDataI
     yFormLayout->setSpacing(5);
 
     yFormLayout->addRow("Min:", GUI::Util::createDoubleSpinboxScroll(
-        firstItem->yAxisItem()->min(), &m_updaters, [=](double newValue) {
-        for(auto item : otherItems)
+        currentIntensityDataItem()->yAxisItem()->min(), &m_updaters, [=](double newValue) {
+        for(auto item : otherAllIntensityDataItems())
             item->yAxisItem()->min().set(newValue); }));
 
     yFormLayout->addRow("Max:", GUI::Util::createDoubleSpinboxScroll(
-        firstItem->yAxisItem()->max(), &m_updaters, [=](double newValue) {
-        for(auto item : otherItems)
+        currentIntensityDataItem()->yAxisItem()->max(), &m_updaters, [=](double newValue) {
+        for(auto item : otherAllIntensityDataItems())
             item->yAxisItem()->max().set(newValue); }));
 
     yFormLayout->addRow("Title:", GUI::Util::createTextEdit(
-        [=]() { return firstItem->yAxisItem()->title(); }, [=](QString newText) {
-        for(auto item : items)
+        [=]() { return currentIntensityDataItem()->yAxisItem()->title(); }, [=](QString newText) {
+        for(auto item : allIntensityDataItems())
             item->yAxisItem()->setTitle(newText); }, &m_updaters));
 
     m_mainLayout->addRow(yGroup);
@@ -144,23 +137,23 @@ void IntensityDataPropertyWidget::createPanelElements(const QList<IntensityDataI
     zFormLayout->setSpacing(5);
 
     zFormLayout->addRow("Min:", GUI::Util::createDoubleSpinboxScroll(
-        firstItem->zAxisItem()->min(), &m_updaters, [=](double newValue) {
-        for(auto item : otherMainItems)
+        currentIntensityDataItem()->zAxisItem()->min(), &m_updaters, [=](double newValue) {
+        for(auto item : otherMainIntensityDataItems())
             item->zAxisItem()->min().set(newValue); }));
 
     zFormLayout->addRow("Max:", GUI::Util::createDoubleSpinboxScroll(
-        firstItem->zAxisItem()->max(), &m_updaters, [=](double newValue) {
-        for(auto item : otherMainItems)
+        currentIntensityDataItem()->zAxisItem()->max(), &m_updaters, [=](double newValue) {
+        for(auto item : otherMainIntensityDataItems())
             item->zAxisItem()->max().set(newValue); }));
 
     zFormLayout->addRow(GUI::Util::createCheckBox("log10",
-        [=]() { return firstItem->zAxisItem()->isLogScale(); }, [=](bool b) {
-        for(auto item : items)
+        [=]() { return currentIntensityDataItem()->zAxisItem()->isLogScale(); }, [=](bool b) {
+        for(auto item : allIntensityDataItems())
             item->zAxisItem()->setLogScale(b); }, &m_updaters));
 
     zFormLayout->addRow(GUI::Util::createCheckBox("Visible",
-        [=]() { return firstItem->zAxisItem()->isVisible(); }, [=](bool b) {
-        for(auto item : items)
+        [=]() { return currentIntensityDataItem()->zAxisItem()->isVisible(); }, [=](bool b) {
+        for(auto item : allIntensityDataItems())
             item->zAxisItem()->setVisibilityValue(b); }, &m_updaters));
 
     m_mainLayout->addRow(zGroup);
@@ -168,11 +161,11 @@ void IntensityDataPropertyWidget::createPanelElements(const QList<IntensityDataI
     updateUIValues();
 
     // react on external changes (e.g. zooming in customplot shall update the axis values)
-    connect(firstItem, &DataItem::itemAxesRangeChanged, this,
+    connect(currentIntensityDataItem(), &DataItem::itemAxesRangeChanged, this,
             &IntensityDataPropertyWidget::updateUIValues, Qt::UniqueConnection);
 
     // update coordinates on axes units change
-    for(auto item : items)
+    for(auto item : allIntensityDataItems())
         connect(item, &DataItem::axesUnitsChanged, this,
                 &IntensityDataPropertyWidget::updateItemCoords, Qt::UniqueConnection);
 }
diff --git a/GUI/View/Plot2D/IntensityDataPropertyWidget.h b/GUI/View/Plot2D/IntensityDataPropertyWidget.h
index 2a2d35358d8..9cf7e581f24 100644
--- a/GUI/View/Plot2D/IntensityDataPropertyWidget.h
+++ b/GUI/View/Plot2D/IntensityDataPropertyWidget.h
@@ -30,11 +30,12 @@ public:
 
     void setJobOrRealItem(JobRealBase* job_or_real_Item) override;
     void setFourierItem(IntensityDataItem* fftItem) override;
-    void createPanelElements(const QList<IntensityDataItem*>& items);
 
 private:
-    void updateUIValues();
+    void unsubscribe();
+    void createPanelElements();
     void updateItemCoords(DataItem* item);
+    void updateUIValues();
 
     QWidget* parent;
     QVector<IntensityDataItem*> m_items;
diff --git a/GUI/View/PlotSpecular/SpecularDataPropertyWidget.h b/GUI/View/PlotSpecular/SpecularDataPropertyWidget.h
index e8e17c7d539..a74945452c6 100644
--- a/GUI/View/PlotSpecular/SpecularDataPropertyWidget.h
+++ b/GUI/View/PlotSpecular/SpecularDataPropertyWidget.h
@@ -34,10 +34,10 @@ public:
     void setJobOrRealItem(JobRealBase* job_or_real_Item) override;
 
 private:
-    void updateUIValues();
     void unsubscribe();
     void createPanelElements();
     void updateItemCoords(DataItem* item);
+    void updateUIValues();
 
 private:
     QFormLayout* m_mainLayout;
-- 
GitLab


From 9ff086ce71060c3451eb9af4c23f5a80ffe4d8a5 Mon Sep 17 00:00:00 2001
From: Mikhail Svechnikov <m.svechnikov@fz-juelich.de>
Date: Wed, 20 Jul 2022 18:35:22 +0200
Subject: [PATCH 04/32] DataPropertyWidget: class added

---
 .../Plot2D/IntensityDataPropertyWidget.cpp    |  3 +-
 GUI/View/Plot2D/IntensityDataPropertyWidget.h |  8 ++--
 GUI/View/Plot2D/IntensityDataWidget.cpp       |  2 +-
 .../PlotSpecular/SpecularDataPropertyWidget.h |  6 +--
 GUI/View/PlotUtil/DataPropertyWidget.cpp      | 47 +++++++++++++++++++
 GUI/View/PlotUtil/DataPropertyWidget.h        | 40 ++++++++++++++++
 6 files changed, 95 insertions(+), 11 deletions(-)
 create mode 100644 GUI/View/PlotUtil/DataPropertyWidget.cpp
 create mode 100644 GUI/View/PlotUtil/DataPropertyWidget.h

diff --git a/GUI/View/Plot2D/IntensityDataPropertyWidget.cpp b/GUI/View/Plot2D/IntensityDataPropertyWidget.cpp
index 5cb6faa935c..cc798fb580e 100644
--- a/GUI/View/Plot2D/IntensityDataPropertyWidget.cpp
+++ b/GUI/View/Plot2D/IntensityDataPropertyWidget.cpp
@@ -30,14 +30,13 @@
 
 IntensityDataPropertyWidget::IntensityDataPropertyWidget(QWidget* parent)
     : DataAccessWidget(parent)
-    , parent(parent)
 {
     setWindowTitle("Properties");
     setAttribute(Qt::WA_StyledBackground, true);
     setProperty("stylable", true); // for stylesheet addressing
 
     m_mainLayout = new QFormLayout(this);
-    m_mainLayout->setContentsMargins(8, 8, 8, 8);
+    m_mainLayout->setContentsMargins(8, 20, 8, 8);
     m_mainLayout->setSpacing(5);
 }
 
diff --git a/GUI/View/Plot2D/IntensityDataPropertyWidget.h b/GUI/View/Plot2D/IntensityDataPropertyWidget.h
index 9cf7e581f24..7c8ae95b3e4 100644
--- a/GUI/View/Plot2D/IntensityDataPropertyWidget.h
+++ b/GUI/View/Plot2D/IntensityDataPropertyWidget.h
@@ -12,8 +12,8 @@
 //
 //  ************************************************************************************************
 
-#ifndef BORNAGAIN_GUI_VIEW_PLOTUTIL_INTENSITYDATAPROPERTYWIDGET_H
-#define BORNAGAIN_GUI_VIEW_PLOTUTIL_INTENSITYDATAPROPERTYWIDGET_H
+#ifndef BORNAGAIN_GUI_VIEW_PLOT2D_INTENSITYDATAPROPERTYWIDGET_H
+#define BORNAGAIN_GUI_VIEW_PLOT2D_INTENSITYDATAPROPERTYWIDGET_H
 
 #include "GUI/View/Common/DataAccessWidget.h"
 
@@ -37,10 +37,8 @@ private:
     void updateItemCoords(DataItem* item);
     void updateUIValues();
 
-    QWidget* parent;
-    QVector<IntensityDataItem*> m_items;
     QFormLayout* m_mainLayout;
     QList<function<void()>> m_updaters;
 };
 
-#endif // BORNAGAIN_GUI_VIEW_PLOTUTIL_INTENSITYDATAPROPERTYWIDGET_H
+#endif // BORNAGAIN_GUI_VIEW_PLOT2D_INTENSITYDATAPROPERTYWIDGET_H
diff --git a/GUI/View/Plot2D/IntensityDataWidget.cpp b/GUI/View/Plot2D/IntensityDataWidget.cpp
index 44c441befaa..3117cbaffff 100644
--- a/GUI/View/Plot2D/IntensityDataWidget.cpp
+++ b/GUI/View/Plot2D/IntensityDataWidget.cpp
@@ -23,7 +23,7 @@
 
 IntensityDataWidget::IntensityDataWidget(QWidget* parent)
     : DataAccessWidget(parent)
-    , m_intensityCanvas(new IntensityDataCanvas)
+    , m_intensityCanvas(new IntensityDataCanvas(this))
     , m_propertyWidget(new IntensityDataPropertyWidget(this))
     , m_fftPresenter(new IntensityDataFFTPresenter(this))
 {
diff --git a/GUI/View/PlotSpecular/SpecularDataPropertyWidget.h b/GUI/View/PlotSpecular/SpecularDataPropertyWidget.h
index a74945452c6..5780790f995 100644
--- a/GUI/View/PlotSpecular/SpecularDataPropertyWidget.h
+++ b/GUI/View/PlotSpecular/SpecularDataPropertyWidget.h
@@ -12,8 +12,8 @@
 //
 //  ************************************************************************************************
 
-#ifndef BORNAGAIN_GUI_VIEW_PROPERTYEDITOR_SPECULARDATAPROPERTYWIDGET_H
-#define BORNAGAIN_GUI_VIEW_PROPERTYEDITOR_SPECULARDATAPROPERTYWIDGET_H
+#ifndef BORNAGAIN_GUI_VIEW_PLOTSPECULAR_SPECULARDATAPROPERTYWIDGET_H
+#define BORNAGAIN_GUI_VIEW_PLOTSPECULAR_SPECULARDATAPROPERTYWIDGET_H
 
 #include "GUI/View/Common/DataAccessWidget.h"
 #include <functional>
@@ -44,4 +44,4 @@ private:
     QList<function<void()>> m_updaters;
 };
 
-#endif // BORNAGAIN_GUI_VIEW_PROPERTYEDITOR_SPECULARDATAPROPERTYWIDGET_H
+#endif // BORNAGAIN_GUI_VIEW_PLOTSPECULAR_SPECULARDATAPROPERTYWIDGET_H
diff --git a/GUI/View/PlotUtil/DataPropertyWidget.cpp b/GUI/View/PlotUtil/DataPropertyWidget.cpp
new file mode 100644
index 00000000000..2d463334616
--- /dev/null
+++ b/GUI/View/PlotUtil/DataPropertyWidget.cpp
@@ -0,0 +1,47 @@
+#include "GUI/View/PlotUtil/DataPropertyWidget.h"
+#include "GUI/Model/Data/DataItem.h"
+#include <QFormLayout>
+
+DataPropertyWidget::DataPropertyWidget(QWidget* parent)
+    : DataAccessWidget(parent)
+{
+    setWindowTitle("Properties");
+    setAttribute(Qt::WA_StyledBackground, true);
+    setProperty("stylable", true); // for stylesheet addressing
+
+    m_mainLayout = new QFormLayout(this);
+    m_mainLayout->setContentsMargins(8, 20, 8, 8);
+    m_mainLayout->setSpacing(5);
+}
+
+void DataPropertyWidget::setJobOrRealItem(JobRealBase* job_or_real_Item)
+{
+    DataAccessWidget::setJobOrRealItem(job_or_real_Item);
+    createPanelElements();
+}
+
+void DataPropertyWidget::updateItemCoords(DataItem* item)
+{
+    // TODO change units for real item with linked instrument
+    if (!item || !jobItem())
+        return;
+
+//    InstrumentItem* instrument;
+//    if(jobItem())
+//        instrument = jobItem()->instrumentItem();
+//    else if(realItem())
+//        instrument = gSessionData->instrumentLibrary.collectedItems()
+//                ->findInstrumentById(realItem()->instrumentId());
+//    if(instrument) {
+        item->blockSignals(true);
+        item->updateCoords(jobItem()->instrumentItem());
+        item->blockSignals(false);
+        emit item->axesUnitsReplotRequested();
+//    }
+}
+
+void DataPropertyWidget::updateUIValues()
+{
+    for (const auto& updater : m_updaters)
+        updater();
+}
diff --git a/GUI/View/PlotUtil/DataPropertyWidget.h b/GUI/View/PlotUtil/DataPropertyWidget.h
new file mode 100644
index 00000000000..0cc52865416
--- /dev/null
+++ b/GUI/View/PlotUtil/DataPropertyWidget.h
@@ -0,0 +1,40 @@
+//  ************************************************************************************************
+//
+//  BornAgain: simulate and fit reflection and scattering
+//
+//! @file      GUI/View/PlotUtil/IntensityDataPropertyWidget.h
+//! @brief     Defines class IntensityDataPropertyWidget
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2022
+//! @authors   Scientific Computing Group at MLZ (see CITATION, AUTHORS)
+//
+//  ************************************************************************************************
+
+#ifndef BORNAGAIN_GUI_VIEW_PLOTUTIL_DATAPROPERTYWIDGET_H
+#define BORNAGAIN_GUI_VIEW_PLOTUTIL_DATAPROPERTYWIDGET_H
+
+#include "GUI/View/Common/DataAccessWidget.h"
+
+class QFormLayout;
+
+using std::function;
+
+class DataPropertyWidget : public DataAccessWidget {
+    Q_OBJECT
+public:
+    explicit DataPropertyWidget(QWidget* parent = nullptr);
+
+    void setJobOrRealItem(JobRealBase* job_or_real_Item) override;
+
+protected:
+    void updateItemCoords(DataItem* item);
+    void updateUIValues();
+    virtual void createPanelElements() = 0;
+
+    QFormLayout* m_mainLayout;
+    QList<function<void()>> m_updaters;
+};
+
+#endif // BORNAGAIN_GUI_VIEW_PLOTUTIL_DATAPROPERTYWIDGET_H
-- 
GitLab


From e5c9810e87ffd6c5e11226c27851b8f2714230fa Mon Sep 17 00:00:00 2001
From: Mikhail Svechnikov <m.svechnikov@fz-juelich.de>
Date: Wed, 20 Jul 2022 18:44:47 +0200
Subject: [PATCH 05/32] IntensityDataPropertyWidget: inherits
 DataPropertyWidget

---
 .../Plot2D/IntensityDataPropertyWidget.cpp    | 45 +------------------
 GUI/View/Plot2D/IntensityDataPropertyWidget.h | 16 ++-----
 GUI/View/PlotUtil/DataPropertyWidget.cpp      | 14 ++++++
 GUI/View/PlotUtil/DataPropertyWidget.h        |  6 ++-
 4 files changed, 22 insertions(+), 59 deletions(-)

diff --git a/GUI/View/Plot2D/IntensityDataPropertyWidget.cpp b/GUI/View/Plot2D/IntensityDataPropertyWidget.cpp
index cc798fb580e..7e65f630af2 100644
--- a/GUI/View/Plot2D/IntensityDataPropertyWidget.cpp
+++ b/GUI/View/Plot2D/IntensityDataPropertyWidget.cpp
@@ -15,35 +15,18 @@
 #include "GUI/View/Plot2D/IntensityDataPropertyWidget.h"
 #include "GUI/Model/Data/IntensityDataItem.h"
 #include "GUI/Model/Device/AxesItems.h"
-#include "GUI/Model/Job/JobItem.h"
 #include "GUI/Util/ComboProperty.h"
 #include "GUI/View/Common/DoubleSpinBox.h"
-#include "GUI/View/Common/SessionItemWidget.h"
 #include "GUI/View/Tool/LayoutUtils.h"
 #include "GUI/View/Tool/WidgetUtils.h"
-#include <QAction>
 #include <QCheckBox>
-#include <QComboBox>
 #include <QFormLayout>
 #include <QGroupBox>
 #include <QLineEdit>
 
 IntensityDataPropertyWidget::IntensityDataPropertyWidget(QWidget* parent)
-    : DataAccessWidget(parent)
+    : DataPropertyWidget(parent)
 {
-    setWindowTitle("Properties");
-    setAttribute(Qt::WA_StyledBackground, true);
-    setProperty("stylable", true); // for stylesheet addressing
-
-    m_mainLayout = new QFormLayout(this);
-    m_mainLayout->setContentsMargins(8, 20, 8, 8);
-    m_mainLayout->setSpacing(5);
-}
-
-void IntensityDataPropertyWidget::setJobOrRealItem(JobRealBase* job_or_real_Item)
-{
-    DataAccessWidget::setJobOrRealItem(job_or_real_Item);
-    createPanelElements();
 }
 
 void IntensityDataPropertyWidget::setFourierItem(IntensityDataItem* fftItem)
@@ -168,29 +151,3 @@ void IntensityDataPropertyWidget::createPanelElements()
         connect(item, &DataItem::axesUnitsChanged, this,
                 &IntensityDataPropertyWidget::updateItemCoords, Qt::UniqueConnection);
 }
-
-void IntensityDataPropertyWidget::updateItemCoords(DataItem* item)
-{
-    // TODO change units for real item with linked instrument
-    if (!item || !jobItem())
-        return;
-
-//    InstrumentItem* instrument;
-//    if(jobItem())
-//        instrument = jobItem()->instrumentItem();
-//    else if(realItem())
-//        instrument = gSessionData->instrumentLibrary.collectedItems()
-//                ->findInstrumentById(realItem()->instrumentId());
-//    if(instrument) {
-        item->blockSignals(true);
-        item->updateCoords(jobItem()->instrumentItem());
-        item->blockSignals(false);
-        emit item->axesUnitsReplotRequested();
-//    }
-}
-
-void IntensityDataPropertyWidget::updateUIValues()
-{
-    for (const auto& updater : m_updaters)
-        updater();
-}
diff --git a/GUI/View/Plot2D/IntensityDataPropertyWidget.h b/GUI/View/Plot2D/IntensityDataPropertyWidget.h
index 7c8ae95b3e4..a1ea8618d14 100644
--- a/GUI/View/Plot2D/IntensityDataPropertyWidget.h
+++ b/GUI/View/Plot2D/IntensityDataPropertyWidget.h
@@ -15,30 +15,20 @@
 #ifndef BORNAGAIN_GUI_VIEW_PLOT2D_INTENSITYDATAPROPERTYWIDGET_H
 #define BORNAGAIN_GUI_VIEW_PLOT2D_INTENSITYDATAPROPERTYWIDGET_H
 
-#include "GUI/View/Common/DataAccessWidget.h"
-
-class QFormLayout;
-
-using std::function;
+#include "GUI/View/PlotUtil/DataPropertyWidget.h"
 
 //! Widget to edit properties of an IntensityDataItem.
 
-class IntensityDataPropertyWidget : public DataAccessWidget {
+class IntensityDataPropertyWidget : public DataPropertyWidget {
     Q_OBJECT
 public:
     explicit IntensityDataPropertyWidget(QWidget* parent = nullptr);
 
-    void setJobOrRealItem(JobRealBase* job_or_real_Item) override;
     void setFourierItem(IntensityDataItem* fftItem) override;
 
 private:
     void unsubscribe();
-    void createPanelElements();
-    void updateItemCoords(DataItem* item);
-    void updateUIValues();
-
-    QFormLayout* m_mainLayout;
-    QList<function<void()>> m_updaters;
+    void createPanelElements() override;
 };
 
 #endif // BORNAGAIN_GUI_VIEW_PLOT2D_INTENSITYDATAPROPERTYWIDGET_H
diff --git a/GUI/View/PlotUtil/DataPropertyWidget.cpp b/GUI/View/PlotUtil/DataPropertyWidget.cpp
index 2d463334616..1794d02677e 100644
--- a/GUI/View/PlotUtil/DataPropertyWidget.cpp
+++ b/GUI/View/PlotUtil/DataPropertyWidget.cpp
@@ -1,3 +1,17 @@
+//  ************************************************************************************************
+//
+//  BornAgain: simulate and fit reflection and scattering
+//
+//! @file      GUI/View/PlotUtil/DataPropertyWidget.h
+//! @brief     Defines class DataPropertyWidget
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2022
+//! @authors   Scientific Computing Group at MLZ (see CITATION, AUTHORS)
+//
+//  ************************************************************************************************
+
 #include "GUI/View/PlotUtil/DataPropertyWidget.h"
 #include "GUI/Model/Data/DataItem.h"
 #include <QFormLayout>
diff --git a/GUI/View/PlotUtil/DataPropertyWidget.h b/GUI/View/PlotUtil/DataPropertyWidget.h
index 0cc52865416..6816fb2542b 100644
--- a/GUI/View/PlotUtil/DataPropertyWidget.h
+++ b/GUI/View/PlotUtil/DataPropertyWidget.h
@@ -2,8 +2,8 @@
 //
 //  BornAgain: simulate and fit reflection and scattering
 //
-//! @file      GUI/View/PlotUtil/IntensityDataPropertyWidget.h
-//! @brief     Defines class IntensityDataPropertyWidget
+//! @file      GUI/View/PlotUtil/DataPropertyWidget.h
+//! @brief     Defines class DataPropertyWidget
 //!
 //! @homepage  http://www.bornagainproject.org
 //! @license   GNU General Public License v3 or higher (see COPYING)
@@ -21,6 +21,8 @@ class QFormLayout;
 
 using std::function;
 
+//! Base class for IntensityDataPropertyWidget and SpecularDataPropertyWidget.
+
 class DataPropertyWidget : public DataAccessWidget {
     Q_OBJECT
 public:
-- 
GitLab


From c0172920704ab925a13281a53f59329e86026168 Mon Sep 17 00:00:00 2001
From: Mikhail Svechnikov <m.svechnikov@fz-juelich.de>
Date: Wed, 20 Jul 2022 18:51:47 +0200
Subject: [PATCH 06/32] SpecularDataPropertyWidget: inherits DataPropertyWidget

---
 .../Plot2D/IntensityDataPropertyWidget.cpp    |  2 +-
 GUI/View/Plot2D/IntensityDataPropertyWidget.h |  2 +-
 .../SpecularDataPropertyWidget.cpp            | 46 +------------------
 .../PlotSpecular/SpecularDataPropertyWidget.h | 23 ++--------
 4 files changed, 8 insertions(+), 65 deletions(-)

diff --git a/GUI/View/Plot2D/IntensityDataPropertyWidget.cpp b/GUI/View/Plot2D/IntensityDataPropertyWidget.cpp
index 7e65f630af2..3b9ba00b31d 100644
--- a/GUI/View/Plot2D/IntensityDataPropertyWidget.cpp
+++ b/GUI/View/Plot2D/IntensityDataPropertyWidget.cpp
@@ -2,7 +2,7 @@
 //
 //  BornAgain: simulate and fit reflection and scattering
 //
-//! @file      GUI/View/PlotUtil/IntensityDataPropertyWidget.cpp
+//! @file      GUI/View/Plot2D/IntensityDataPropertyWidget.cpp
 //! @brief     Implements class IntensityDataPropertyWidget
 //!
 //! @homepage  http://www.bornagainproject.org
diff --git a/GUI/View/Plot2D/IntensityDataPropertyWidget.h b/GUI/View/Plot2D/IntensityDataPropertyWidget.h
index a1ea8618d14..1e1ebd74f24 100644
--- a/GUI/View/Plot2D/IntensityDataPropertyWidget.h
+++ b/GUI/View/Plot2D/IntensityDataPropertyWidget.h
@@ -2,7 +2,7 @@
 //
 //  BornAgain: simulate and fit reflection and scattering
 //
-//! @file      GUI/View/PlotUtil/IntensityDataPropertyWidget.h
+//! @file      GUI/View/Plot2D/IntensityDataPropertyWidget.h
 //! @brief     Defines class IntensityDataPropertyWidget
 //!
 //! @homepage  http://www.bornagainproject.org
diff --git a/GUI/View/PlotSpecular/SpecularDataPropertyWidget.cpp b/GUI/View/PlotSpecular/SpecularDataPropertyWidget.cpp
index e0d718ac196..ef7e3634d27 100644
--- a/GUI/View/PlotSpecular/SpecularDataPropertyWidget.cpp
+++ b/GUI/View/PlotSpecular/SpecularDataPropertyWidget.cpp
@@ -2,7 +2,7 @@
 //
 //  BornAgain: simulate and fit reflection and scattering
 //
-//! @file      GUI/View/PropertyEditor/SpecularDataPropertyWidget.cpp
+//! @file      GUI/View/PlotSpecular/SpecularDataPropertyWidget.cpp
 //! @brief     Implements class SpecularDataPropertyWidget
 //!
 //! @homepage  http://www.bornagainproject.org
@@ -14,34 +14,18 @@
 
 #include "GUI/View/PlotSpecular/SpecularDataPropertyWidget.h"
 #include "GUI/Model/Data/SpecularDataItem.h"
-#include "GUI/Model/Data/SessionData.h"
 #include "GUI/Util/ComboProperty.h"
 #include "GUI/View/Common/DoubleSpinBox.h"
 #include "GUI/View/Tool/LayoutUtils.h"
 #include "GUI/View/Tool/WidgetUtils.h"
 #include <QAction>
 #include <QCheckBox>
-#include <QComboBox>
 #include <QFormLayout>
-#include <QGroupBox>
 #include <QLineEdit>
 
 SpecularDataPropertyWidget::SpecularDataPropertyWidget(QWidget* parent)
-    : DataAccessWidget(parent)
+    : DataPropertyWidget(parent)
 {
-    setWindowTitle("Properties");
-    setAttribute(Qt::WA_StyledBackground, true);
-    setProperty("stylable", true); // for stylesheet addressing
-
-    m_mainLayout = new QFormLayout(this);
-    m_mainLayout->setContentsMargins(8, 20, 8, 8);
-    m_mainLayout->setSpacing(5);
-}
-
-void SpecularDataPropertyWidget::setJobOrRealItem(JobRealBase* job_or_real_Item)
-{
-    DataAccessWidget::setJobOrRealItem(job_or_real_Item);
-    createPanelElements();
 }
 
 void SpecularDataPropertyWidget::unsubscribe()
@@ -126,29 +110,3 @@ void SpecularDataPropertyWidget::createPanelElements()
         connect(item, &DataItem::axesUnitsChanged, this,
                 &SpecularDataPropertyWidget::updateItemCoords, Qt::UniqueConnection);
 }
-
-void SpecularDataPropertyWidget::updateItemCoords(DataItem* item)
-{
-    // TODO change units for real item with linked instrument
-    if (!item || !jobItem())
-        return;
-
-//    InstrumentItem* instrument;
-//    if(jobItem())
-//        instrument = jobItem()->instrumentItem();
-//    else if(realItem())
-//        instrument = gSessionData->instrumentLibrary.collectedItems()
-//                ->findInstrumentById(realItem()->instrumentId());
-//    if(instrument) {
-        item->blockSignals(true);
-        item->updateCoords(jobItem()->instrumentItem());
-        item->blockSignals(false);
-        emit item->axesUnitsReplotRequested();
-//    }
-}
-
-void SpecularDataPropertyWidget::updateUIValues()
-{
-    for (const auto& updater : m_updaters)
-        updater();
-}
diff --git a/GUI/View/PlotSpecular/SpecularDataPropertyWidget.h b/GUI/View/PlotSpecular/SpecularDataPropertyWidget.h
index 5780790f995..24505a53ded 100644
--- a/GUI/View/PlotSpecular/SpecularDataPropertyWidget.h
+++ b/GUI/View/PlotSpecular/SpecularDataPropertyWidget.h
@@ -15,33 +15,18 @@
 #ifndef BORNAGAIN_GUI_VIEW_PLOTSPECULAR_SPECULARDATAPROPERTYWIDGET_H
 #define BORNAGAIN_GUI_VIEW_PLOTSPECULAR_SPECULARDATAPROPERTYWIDGET_H
 
-#include "GUI/View/Common/DataAccessWidget.h"
-#include <functional>
+#include "GUI/View/PlotUtil/DataPropertyWidget.h"
 
-class SpecularDataItem;
-class QFormLayout;
-class DoubleDescriptor;
+//! Widget to edit properties of a SpecularDataItem.
 
-using std::function;
-
-//! Widget to edit properties of a SpecularDataItem or a Data1DViewItem.
-
-class SpecularDataPropertyWidget : public DataAccessWidget {
+class SpecularDataPropertyWidget : public DataPropertyWidget {
     Q_OBJECT
 public:
     explicit SpecularDataPropertyWidget(QWidget* parent = nullptr);
 
-    void setJobOrRealItem(JobRealBase* job_or_real_Item) override;
-
 private:
     void unsubscribe();
-    void createPanelElements();
-    void updateItemCoords(DataItem* item);
-    void updateUIValues();
-
-private:
-    QFormLayout* m_mainLayout;
-    QList<function<void()>> m_updaters;
+    void createPanelElements() override;
 };
 
 #endif // BORNAGAIN_GUI_VIEW_PLOTSPECULAR_SPECULARDATAPROPERTYWIDGET_H
-- 
GitLab


From 1d224e0740b617841978863908becda39c59bf0e Mon Sep 17 00:00:00 2001
From: Mikhail Svechnikov <m.svechnikov@fz-juelich.de>
Date: Wed, 20 Jul 2022 18:55:03 +0200
Subject: [PATCH 07/32] DataPropertyWidget: issue created

---
 GUI/View/PlotUtil/DataPropertyWidget.cpp | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/GUI/View/PlotUtil/DataPropertyWidget.cpp b/GUI/View/PlotUtil/DataPropertyWidget.cpp
index 1794d02677e..4b4153be63e 100644
--- a/GUI/View/PlotUtil/DataPropertyWidget.cpp
+++ b/GUI/View/PlotUtil/DataPropertyWidget.cpp
@@ -36,7 +36,9 @@ void DataPropertyWidget::setJobOrRealItem(JobRealBase* job_or_real_Item)
 
 void DataPropertyWidget::updateItemCoords(DataItem* item)
 {
-    // TODO change units for real item with linked instrument
+    // TODO : https://jugit.fz-juelich.de/mlz/bornagain/-/issues/320
+    // Also change units for real item with linked instrument
+
     if (!item || !jobItem())
         return;
 
-- 
GitLab


From 9b461142913e13d5e52aa73ba4d9da338cae17a8 Mon Sep 17 00:00:00 2001
From: Mikhail Svechnikov <m.svechnikov@fz-juelich.de>
Date: Thu, 21 Jul 2022 10:22:43 +0200
Subject: [PATCH 08/32] RangeUtils: commonRage added

---
 GUI/View/PlotUtil/RangeUtils.cpp | 15 +++++++++++++++
 GUI/View/PlotUtil/RangeUtils.h   |  3 +++
 2 files changed, 18 insertions(+)

diff --git a/GUI/View/PlotUtil/RangeUtils.cpp b/GUI/View/PlotUtil/RangeUtils.cpp
index 0b01f8529ea..546c804baaf 100644
--- a/GUI/View/PlotUtil/RangeUtils.cpp
+++ b/GUI/View/PlotUtil/RangeUtils.cpp
@@ -14,6 +14,7 @@
 
 #include "GUI/View/PlotUtil/RangeUtils.h"
 #include "GUI/Model/Data/IntensityDataItem.h"
+#include "GUI/Model/Device/AxesItems.h"
 #include "GUI/Util/Error.h"
 #include "GUI/View/Tool/StyleUtils.h"
 
@@ -141,3 +142,17 @@ void GUI::View::RangeUtils::setDefaultMargins(QCustomPlot* customPlot)
     axisRectangle->setAutoMargins(QCP::msTop | QCP::msBottom);
     axisRectangle->setMargins(defaultMargins(*customPlot));
 }
+
+QCPRange GUI::View::RangeUtils::commonRange(const QList<BasicAxisItem*>& axes)
+{
+    double min = +std::numeric_limits<double>::max();
+    double max = -std::numeric_limits<double>::max();
+
+    for(auto axis : axes) {
+        if(min<axis->min())
+            min = axis->min();
+        if(max>axis->max())
+            max = axis->max();
+    }
+    return QCPRange(min, max);
+}
diff --git a/GUI/View/PlotUtil/RangeUtils.h b/GUI/View/PlotUtil/RangeUtils.h
index 0e574fad7b4..e051a2a4422 100644
--- a/GUI/View/PlotUtil/RangeUtils.h
+++ b/GUI/View/PlotUtil/RangeUtils.h
@@ -21,6 +21,7 @@
 #include "qcustomplot.h"
 
 class IntensityDataItem;
+class BasicAxisItem;
 class ColorMap;
 
 //! Provides few helper functions for ColorMapPlot.
@@ -48,6 +49,8 @@ QCPRange itemDataRange(const IntensityDataItem* item);
 //! Returns z-axis visible range (zoom).
 QCPRange itemDataZoom(const IntensityDataItem* item);
 
+QCPRange commonRange(const QList<BasicAxisItem*>& axes);
+
 void setLogz(QCPColorScale* scale, bool isLogz);
 void setLogz(QCPAxis* axis, bool isLogz);
 
-- 
GitLab


From ffa8bb8545a8ea8f043c956a6ba0035f0282d5de Mon Sep 17 00:00:00 2001
From: Mikhail Svechnikov <m.svechnikov@fz-juelich.de>
Date: Thu, 21 Jul 2022 11:57:56 +0200
Subject: [PATCH 09/32] RangeUtils: setCommonRange added

---
 GUI/View/PlotUtil/RangeUtils.cpp | 57 ++++++++++++++++++++++++++++----
 GUI/View/PlotUtil/RangeUtils.h   | 15 ++++++++-
 2 files changed, 64 insertions(+), 8 deletions(-)

diff --git a/GUI/View/PlotUtil/RangeUtils.cpp b/GUI/View/PlotUtil/RangeUtils.cpp
index 546c804baaf..d9f24d29989 100644
--- a/GUI/View/PlotUtil/RangeUtils.cpp
+++ b/GUI/View/PlotUtil/RangeUtils.cpp
@@ -14,6 +14,7 @@
 
 #include "GUI/View/PlotUtil/RangeUtils.h"
 #include "GUI/Model/Data/IntensityDataItem.h"
+#include "GUI/Model/Data/SpecularDataItem.h"
 #include "GUI/Model/Device/AxesItems.h"
 #include "GUI/Util/Error.h"
 #include "GUI/View/Tool/StyleUtils.h"
@@ -143,16 +144,58 @@ void GUI::View::RangeUtils::setDefaultMargins(QCustomPlot* customPlot)
     axisRectangle->setMargins(defaultMargins(*customPlot));
 }
 
-QCPRange GUI::View::RangeUtils::commonRange(const QList<BasicAxisItem*>& axes)
+double GUI::View::RangeUtils::commonMin(const QList<AmplitudeAxisItem*>& axes)
 {
     double min = +std::numeric_limits<double>::max();
-    double max = -std::numeric_limits<double>::max();
-
-    for(auto axis : axes) {
-        if(min<axis->min())
+    for(auto axis : axes)
+        if(min>axis->min())
             min = axis->min();
-        if(max>axis->max())
+    return min;
+}
+
+double GUI::View::RangeUtils::commonMax(const QList<AmplitudeAxisItem*>& axes)
+{
+    double max = -std::numeric_limits<double>::max();
+    for(auto axis : axes)
+        if(max<axis->max())
             max = axis->max();
+    return max;
+}
+
+QCPRange GUI::View::RangeUtils::commonRange(const QList<AmplitudeAxisItem*>& axes)
+{
+    return QCPRange(commonMin(axes), commonMax(axes));
+}
+
+void GUI::View::RangeUtils::setCommonRange(QList<DataItem*> items)
+{
+    QCPRange range = commonRange(valueAxesFromItems(items));
+    for(auto item : items) {
+        SpecularDataItem* specular = dynamic_cast<SpecularDataItem*>(item);
+        IntensityDataItem* intensity = dynamic_cast<IntensityDataItem*>(item);
+        if(specular) {
+            specular->setLowerY(range.lower);
+            specular->setUpperY(range.upper);
+        } else if(intensity) {
+            intensity->setLowerZ(range.lower);
+            intensity->setUpperZ(range.upper);
+        } else
+            ASSERT(0);
+    }
+}
+
+QList<AmplitudeAxisItem*> GUI::View::RangeUtils::valueAxesFromItems(const QList<DataItem*>& items)
+{
+    QList<AmplitudeAxisItem*> axes;
+    for(auto item : items)  {
+        SpecularDataItem* specular = dynamic_cast<SpecularDataItem*>(item);
+        IntensityDataItem* intensity = dynamic_cast<IntensityDataItem*>(item);
+        if(specular)
+            axes.append(specular->yAxisItem());
+        else if(intensity)
+            axes.append(intensity->zAxisItem());
+        else
+            ASSERT(0);
     }
-    return QCPRange(min, max);
+    return axes;
 }
diff --git a/GUI/View/PlotUtil/RangeUtils.h b/GUI/View/PlotUtil/RangeUtils.h
index e051a2a4422..d59f4393945 100644
--- a/GUI/View/PlotUtil/RangeUtils.h
+++ b/GUI/View/PlotUtil/RangeUtils.h
@@ -21,7 +21,9 @@
 #include "qcustomplot.h"
 
 class IntensityDataItem;
+class DataItem;
 class BasicAxisItem;
+class AmplitudeAxisItem;
 class ColorMap;
 
 //! Provides few helper functions for ColorMapPlot.
@@ -49,7 +51,18 @@ QCPRange itemDataRange(const IntensityDataItem* item);
 //! Returns z-axis visible range (zoom).
 QCPRange itemDataZoom(const IntensityDataItem* item);
 
-QCPRange commonRange(const QList<BasicAxisItem*>& axes);
+//! Returns common min for a list of axes (zoom).
+double commonMin(const QList<AmplitudeAxisItem*>& axes);
+
+//! Returns common max for a list of axes (zoom).
+double commonMax(const QList<AmplitudeAxisItem*>& axes);
+
+//! Returns common range for a list of axes (zoom).
+QCPRange commonRange(const QList<AmplitudeAxisItem*>& axes);
+
+void setCommonRange(QList<DataItem*> items);
+
+QList<AmplitudeAxisItem*> valueAxesFromItems(const QList<DataItem*>& items);
 
 void setLogz(QCPColorScale* scale, bool isLogz);
 void setLogz(QCPAxis* axis, bool isLogz);
-- 
GitLab


From 6ed9f27e486c4732d1262ad7aa10003859ad803d Mon Sep 17 00:00:00 2001
From: Mikhail Svechnikov <m.svechnikov@fz-juelich.de>
Date: Thu, 21 Jul 2022 12:09:37 +0200
Subject: [PATCH 10/32] RangeUtils: changed

---
 .../PlotComparison/FitComparisonWidget.cpp    |  4 ++
 GUI/View/PlotUtil/RangeUtils.cpp              | 47 ++++++++++---------
 GUI/View/PlotUtil/RangeUtils.h                | 13 ++++-
 3 files changed, 39 insertions(+), 25 deletions(-)

diff --git a/GUI/View/PlotComparison/FitComparisonWidget.cpp b/GUI/View/PlotComparison/FitComparisonWidget.cpp
index 432d818028b..2527fc13dd4 100644
--- a/GUI/View/PlotComparison/FitComparisonWidget.cpp
+++ b/GUI/View/PlotComparison/FitComparisonWidget.cpp
@@ -21,6 +21,7 @@
 #include "GUI/View/Plot2D/IntensityDataPropertyWidget.h"
 #include "GUI/View/PlotComparison/FitFlowWidget.h"
 #include "GUI/View/PlotUtil/PlotStatusLabel.h"
+#include "GUI/View/PlotUtil/RangeUtils.h"
 #include "GUI/Util/ActionFactory.h"
 #include "Device/Histo/DiffUtil.h"
 #include <QAction>
@@ -113,6 +114,9 @@ void FitComparisonWidget::connectItems()
                 connect(senderItem, &DataItem::updateOtherPlots, receiverItem,
                         &DataItem::copyXYRangesFromItem, Qt::UniqueConnection);
 
+    // synchronize data range at start
+//    GUI::View::RangeUtils::setCommonRangeZ(mainIntensityDataItems());
+
     // sync Z range between sumulated and real
     // simu --> real
     connect(simuIntensityDataItem(), &DataItem::updateOtherPlots, realIntensityDataItem(),
diff --git a/GUI/View/PlotUtil/RangeUtils.cpp b/GUI/View/PlotUtil/RangeUtils.cpp
index d9f24d29989..e6ab00f1aeb 100644
--- a/GUI/View/PlotUtil/RangeUtils.cpp
+++ b/GUI/View/PlotUtil/RangeUtils.cpp
@@ -167,35 +167,36 @@ QCPRange GUI::View::RangeUtils::commonRange(const QList<AmplitudeAxisItem*>& axe
     return QCPRange(commonMin(axes), commonMax(axes));
 }
 
-void GUI::View::RangeUtils::setCommonRange(QList<DataItem*> items)
+void GUI::View::RangeUtils::setCommonRangeY(QList<SpecularDataItem*> items)
 {
-    QCPRange range = commonRange(valueAxesFromItems(items));
+    QCPRange range = commonRange(valueAxesFromSpecularItems(items));
     for(auto item : items) {
-        SpecularDataItem* specular = dynamic_cast<SpecularDataItem*>(item);
-        IntensityDataItem* intensity = dynamic_cast<IntensityDataItem*>(item);
-        if(specular) {
-            specular->setLowerY(range.lower);
-            specular->setUpperY(range.upper);
-        } else if(intensity) {
-            intensity->setLowerZ(range.lower);
-            intensity->setUpperZ(range.upper);
-        } else
-            ASSERT(0);
+        item->setLowerY(range.lower);
+        item->setUpperY(range.upper);
     }
 }
 
-QList<AmplitudeAxisItem*> GUI::View::RangeUtils::valueAxesFromItems(const QList<DataItem*>& items)
+void GUI::View::RangeUtils::setCommonRangeZ(QList<IntensityDataItem*> items)
 {
-    QList<AmplitudeAxisItem*> axes;
-    for(auto item : items)  {
-        SpecularDataItem* specular = dynamic_cast<SpecularDataItem*>(item);
-        IntensityDataItem* intensity = dynamic_cast<IntensityDataItem*>(item);
-        if(specular)
-            axes.append(specular->yAxisItem());
-        else if(intensity)
-            axes.append(intensity->zAxisItem());
-        else
-            ASSERT(0);
+    QCPRange range = commonRange(valueAxesFromIntensityItems(items));
+    for(auto item : items) {
+        item->setLowerZ(range.lower);
+        item->setUpperZ(range.upper);
     }
+}
+
+QList<AmplitudeAxisItem*> GUI::View::RangeUtils::valueAxesFromSpecularItems(const QList<SpecularDataItem*>& items)
+{
+    QList<AmplitudeAxisItem*> axes;
+    for(auto item : items)
+        axes.append(item->yAxisItem());
+    return axes;
+}
+
+QList<AmplitudeAxisItem*> GUI::View::RangeUtils::valueAxesFromIntensityItems(const QList<IntensityDataItem*>& items)
+{
+    QList<AmplitudeAxisItem*> axes;
+    for(auto item : items)
+        axes.append(item->zAxisItem());
     return axes;
 }
diff --git a/GUI/View/PlotUtil/RangeUtils.h b/GUI/View/PlotUtil/RangeUtils.h
index d59f4393945..505bfeb3ab9 100644
--- a/GUI/View/PlotUtil/RangeUtils.h
+++ b/GUI/View/PlotUtil/RangeUtils.h
@@ -21,6 +21,7 @@
 #include "qcustomplot.h"
 
 class IntensityDataItem;
+class SpecularDataItem;
 class DataItem;
 class BasicAxisItem;
 class AmplitudeAxisItem;
@@ -60,9 +61,17 @@ double commonMax(const QList<AmplitudeAxisItem*>& axes);
 //! Returns common range for a list of axes (zoom).
 QCPRange commonRange(const QList<AmplitudeAxisItem*>& axes);
 
-void setCommonRange(QList<DataItem*> items);
+//! Sets common Y range for a list of items (zoom).
+void setCommonRangeY(QList<SpecularDataItem*> items);
 
-QList<AmplitudeAxisItem*> valueAxesFromItems(const QList<DataItem*>& items);
+//! Sets common Z range for a list of items (zoom).
+void setCommonRangeZ(QList<IntensityDataItem*> items);
+
+//! Gets Y axes from a list of specular items.
+QList<AmplitudeAxisItem*> valueAxesFromSpecularItems(const QList<SpecularDataItem*>& items);
+
+//! Gets Z axes from a list of intensity items.
+QList<AmplitudeAxisItem*> valueAxesFromIntensityItems(const QList<IntensityDataItem*>& items);
 
 void setLogz(QCPColorScale* scale, bool isLogz);
 void setLogz(QCPAxis* axis, bool isLogz);
-- 
GitLab


From d66fdde51ceeae0b8a7eb6211cbfe19ca00a7c70 Mon Sep 17 00:00:00 2001
From: Mikhail Svechnikov <m.svechnikov@fz-juelich.de>
Date: Thu, 21 Jul 2022 12:23:15 +0200
Subject: [PATCH 11/32] FitComparisonWidget: common range

---
 GUI/View/PlotComparison/FitComparisonWidget.cpp | 13 +++++++++----
 1 file changed, 9 insertions(+), 4 deletions(-)

diff --git a/GUI/View/PlotComparison/FitComparisonWidget.cpp b/GUI/View/PlotComparison/FitComparisonWidget.cpp
index 2527fc13dd4..20f6f6eb833 100644
--- a/GUI/View/PlotComparison/FitComparisonWidget.cpp
+++ b/GUI/View/PlotComparison/FitComparisonWidget.cpp
@@ -79,11 +79,16 @@ FitComparisonWidget::FitComparisonWidget(QWidget* parent)
 
 void FitComparisonWidget::setJobOrRealItem(JobRealBase* job_item)
 {
+    JobItem* oldJob = jobItem();
+
     DataAccessWidget::setJobOrRealItem(job_item);
     ASSERT(jobItem());
 
     updateDiffData();
-    connectItems();
+    if(oldJob != jobItem()) {
+        GUI::View::RangeUtils::setCommonRangeZ(mainIntensityDataItems());
+        connectItems();
+    }
 
     m_simuCanvas->setIntensityItem(simuIntensityDataItem());
     m_realCanvas->setIntensityItem(realIntensityDataItem());
@@ -103,6 +108,9 @@ void FitComparisonWidget::onResetViewAction()
     simuIntensityDataItem()->resetView();
     realIntensityDataItem()->resetView();
     diffIntensityDataItem()->resetView();
+
+    // synchronize data range between simulated and real
+    GUI::View::RangeUtils::setCommonRangeZ(mainIntensityDataItems());
 }
 
 void FitComparisonWidget::connectItems()
@@ -114,9 +122,6 @@ void FitComparisonWidget::connectItems()
                 connect(senderItem, &DataItem::updateOtherPlots, receiverItem,
                         &DataItem::copyXYRangesFromItem, Qt::UniqueConnection);
 
-    // synchronize data range at start
-//    GUI::View::RangeUtils::setCommonRangeZ(mainIntensityDataItems());
-
     // sync Z range between sumulated and real
     // simu --> real
     connect(simuIntensityDataItem(), &DataItem::updateOtherPlots, realIntensityDataItem(),
-- 
GitLab


From 12f816e5071af0745e165367c15916ed53f114b4 Mon Sep 17 00:00:00 2001
From: Mikhail Svechnikov <m.svechnikov@fz-juelich.de>
Date: Thu, 21 Jul 2022 12:34:49 +0200
Subject: [PATCH 12/32] IntensityDataCanvas: renge synch

---
 GUI/View/Plot2D/IntensityDataCanvas.cpp | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/GUI/View/Plot2D/IntensityDataCanvas.cpp b/GUI/View/Plot2D/IntensityDataCanvas.cpp
index 509b0ba1637..6fcbb05a668 100644
--- a/GUI/View/Plot2D/IntensityDataCanvas.cpp
+++ b/GUI/View/Plot2D/IntensityDataCanvas.cpp
@@ -89,9 +89,13 @@ QList<QAction*> IntensityDataCanvas::actionList()
 }
 
 void IntensityDataCanvas::onResetViewAction()
-{
+{   
     for(auto item : allIntensityDataItems())
         item->resetView();
+
+    // synchronize real item with current item
+    for(auto item : otherMainIntensityDataItems())
+        item->copyZRangeFromItem(currentIntensityDataItem());
 }
 
 void IntensityDataCanvas::onSavePlotAction()
-- 
GitLab


From c8cd92372bdd15e58db66f7e5b340df34034ab3a Mon Sep 17 00:00:00 2001
From: Mikhail Svechnikov <m.svechnikov@fz-juelich.de>
Date: Thu, 21 Jul 2022 12:50:31 +0200
Subject: [PATCH 13/32] FitComparisonWidget1D: common range

---
 GUI/View/PlotComparison/FitComparisonWidget1D.cpp | 11 ++++++++++-
 1 file changed, 10 insertions(+), 1 deletion(-)

diff --git a/GUI/View/PlotComparison/FitComparisonWidget1D.cpp b/GUI/View/PlotComparison/FitComparisonWidget1D.cpp
index 9021d113189..157d5e7d7bf 100644
--- a/GUI/View/PlotComparison/FitComparisonWidget1D.cpp
+++ b/GUI/View/PlotComparison/FitComparisonWidget1D.cpp
@@ -18,6 +18,7 @@
 #include "GUI/View/PlotComparison/FitComparisonWidget1D.h"
 #include "GUI/View/PlotComparison/FitFlowWidget.h"
 #include "GUI/View/PlotUtil/PlotStatusLabel.h"
+#include "GUI/View/PlotUtil/RangeUtils.h"
 #include "GUI/View/PlotSpecular/SpecularDataPropertyWidget.h"
 #include "GUI/View/PlotSpecular/SpecularPlotCanvas.h"
 #include "GUI/View/PlotSpecular/SpecularPlot.h"
@@ -75,11 +76,16 @@ FitComparisonWidget1D::FitComparisonWidget1D(QWidget* parent)
 
 void FitComparisonWidget1D::setJobOrRealItem(JobRealBase* job_item)
 {
+    JobItem* oldJob = jobItem();
+
     DataAccessWidget::setJobOrRealItem(job_item);
     ASSERT(jobItem());
 
     updateDiffData();
-    connectItems();
+    if(oldJob != jobItem()) {
+        GUI::View::RangeUtils::setCommonRangeY(mainSpecularDataItems());
+        connectItems();
+    }
 
     m_data_canvas->setSpecularItems({simuSpecularDataItem(),
                                      realSpecularDataItem()});
@@ -99,6 +105,9 @@ void FitComparisonWidget1D::onResetViewAction()
     simuSpecularDataItem()->resetView();
     realSpecularDataItem()->resetView();
     diffSpecularDataItem()->resetView();
+
+    // synchronize data range between simulated and real
+    GUI::View::RangeUtils::setCommonRangeY(mainSpecularDataItems());
 }
 
 void FitComparisonWidget1D::connectItems()
-- 
GitLab


From 98bcf07267df0636cb9ce5b858eee3f78710732b Mon Sep 17 00:00:00 2001
From: Mikhail Svechnikov <m.svechnikov@fz-juelich.de>
Date: Thu, 21 Jul 2022 12:56:09 +0200
Subject: [PATCH 14/32] RangeUtils: ticks values

---
 GUI/View/PlotUtil/RangeUtils.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/GUI/View/PlotUtil/RangeUtils.cpp b/GUI/View/PlotUtil/RangeUtils.cpp
index e6ab00f1aeb..0f6bbb5cf03 100644
--- a/GUI/View/PlotUtil/RangeUtils.cpp
+++ b/GUI/View/PlotUtil/RangeUtils.cpp
@@ -130,7 +130,7 @@ void GUI::View::RangeUtils::setLogz(QCPAxis* axis, bool isLogz)
         axis->setTicker(ticker);
     } else {
         axis->setNumberFormat("f");
-        axis->setNumberPrecision(0);
+        axis->setNumberPrecision(1);
         axis->setScaleType(QCPAxis::stLinear);
         QSharedPointer<QCPAxisTicker> ticker(new QCPAxisTicker);
         axis->setTicker(ticker);
-- 
GitLab


From 53965004ffcdc43cc2cae90f0d9f0080e601cc91 Mon Sep 17 00:00:00 2001
From: Mikhail Svechnikov <m.svechnikov@fz-juelich.de>
Date: Thu, 21 Jul 2022 12:58:34 +0200
Subject: [PATCH 15/32] RangeUtils: format

---
 GUI/View/PlotUtil/RangeUtils.cpp | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/GUI/View/PlotUtil/RangeUtils.cpp b/GUI/View/PlotUtil/RangeUtils.cpp
index 0f6bbb5cf03..826df77f500 100644
--- a/GUI/View/PlotUtil/RangeUtils.cpp
+++ b/GUI/View/PlotUtil/RangeUtils.cpp
@@ -185,7 +185,8 @@ void GUI::View::RangeUtils::setCommonRangeZ(QList<IntensityDataItem*> items)
     }
 }
 
-QList<AmplitudeAxisItem*> GUI::View::RangeUtils::valueAxesFromSpecularItems(const QList<SpecularDataItem*>& items)
+QList<AmplitudeAxisItem*>
+GUI::View::RangeUtils::valueAxesFromSpecularItems(const QList<SpecularDataItem*>& items)
 {
     QList<AmplitudeAxisItem*> axes;
     for(auto item : items)
@@ -193,7 +194,8 @@ QList<AmplitudeAxisItem*> GUI::View::RangeUtils::valueAxesFromSpecularItems(cons
     return axes;
 }
 
-QList<AmplitudeAxisItem*> GUI::View::RangeUtils::valueAxesFromIntensityItems(const QList<IntensityDataItem*>& items)
+QList<AmplitudeAxisItem*>
+GUI::View::RangeUtils::valueAxesFromIntensityItems(const QList<IntensityDataItem*>& items)
 {
     QList<AmplitudeAxisItem*> axes;
     for(auto item : items)
-- 
GitLab


From 11e62cb6537215fb18aa7677a1c31f2269d037e9 Mon Sep 17 00:00:00 2001
From: Mikhail Svechnikov <m.svechnikov@fz-juelich.de>
Date: Thu, 21 Jul 2022 13:00:51 +0200
Subject: [PATCH 16/32] FitComparison: fix

---
 GUI/View/PlotComparison/FitComparisonWidget.cpp   | 7 +++----
 GUI/View/PlotComparison/FitComparisonWidget1D.cpp | 7 +++----
 2 files changed, 6 insertions(+), 8 deletions(-)

diff --git a/GUI/View/PlotComparison/FitComparisonWidget.cpp b/GUI/View/PlotComparison/FitComparisonWidget.cpp
index 20f6f6eb833..604796ea78b 100644
--- a/GUI/View/PlotComparison/FitComparisonWidget.cpp
+++ b/GUI/View/PlotComparison/FitComparisonWidget.cpp
@@ -84,11 +84,10 @@ void FitComparisonWidget::setJobOrRealItem(JobRealBase* job_item)
     DataAccessWidget::setJobOrRealItem(job_item);
     ASSERT(jobItem());
 
-    updateDiffData();
-    if(oldJob != jobItem()) {
+    if(oldJob != jobItem())
         GUI::View::RangeUtils::setCommonRangeZ(mainIntensityDataItems());
-        connectItems();
-    }
+    updateDiffData();
+    connectItems();
 
     m_simuCanvas->setIntensityItem(simuIntensityDataItem());
     m_realCanvas->setIntensityItem(realIntensityDataItem());
diff --git a/GUI/View/PlotComparison/FitComparisonWidget1D.cpp b/GUI/View/PlotComparison/FitComparisonWidget1D.cpp
index 157d5e7d7bf..381811f183a 100644
--- a/GUI/View/PlotComparison/FitComparisonWidget1D.cpp
+++ b/GUI/View/PlotComparison/FitComparisonWidget1D.cpp
@@ -81,11 +81,10 @@ void FitComparisonWidget1D::setJobOrRealItem(JobRealBase* job_item)
     DataAccessWidget::setJobOrRealItem(job_item);
     ASSERT(jobItem());
 
-    updateDiffData();
-    if(oldJob != jobItem()) {
+    if(oldJob != jobItem())
         GUI::View::RangeUtils::setCommonRangeY(mainSpecularDataItems());
-        connectItems();
-    }
+    updateDiffData();
+    connectItems();
 
     m_data_canvas->setSpecularItems({simuSpecularDataItem(),
                                      realSpecularDataItem()});
-- 
GitLab


From a4a45b0aef6315bfba76aade4ea35b935bf0785d Mon Sep 17 00:00:00 2001
From: Mikhail Svechnikov <m.svechnikov@fz-juelich.de>
Date: Thu, 21 Jul 2022 14:03:30 +0200
Subject: [PATCH 17/32] Mask and Projections update fix

---
 GUI/View/Import/RealDataMaskWidget.cpp                 | 1 +
 GUI/View/Projection/IntensityDataProjectionsWidget.cpp | 1 +
 2 files changed, 2 insertions(+)

diff --git a/GUI/View/Import/RealDataMaskWidget.cpp b/GUI/View/Import/RealDataMaskWidget.cpp
index ce423a32f89..a765cae3de1 100644
--- a/GUI/View/Import/RealDataMaskWidget.cpp
+++ b/GUI/View/Import/RealDataMaskWidget.cpp
@@ -59,6 +59,7 @@ void RealDataMaskWidget::setJobOrRealItem(JobRealBase* job_or_real_item)
 {
     DataAccessWidget::setJobOrRealItem(job_or_real_item);
     m_editorPropertyPanel->setJobOrRealItem(job_or_real_item);
+    setContext();
 }
 
 //! shows/hides right panel with properties
diff --git a/GUI/View/Projection/IntensityDataProjectionsWidget.cpp b/GUI/View/Projection/IntensityDataProjectionsWidget.cpp
index bcd92096e16..9dae7a9aa20 100644
--- a/GUI/View/Projection/IntensityDataProjectionsWidget.cpp
+++ b/GUI/View/Projection/IntensityDataProjectionsWidget.cpp
@@ -58,6 +58,7 @@ void IntensityDataProjectionsWidget::setJobOrRealItem(JobRealBase* job_or_real_i
 {
     DataAccessWidget::setJobOrRealItem(job_or_real_item);
     m_propertyPanel->setJobOrRealItem(job_or_real_item);
+    setContext();
 }
 
 void IntensityDataProjectionsWidget::setContext()
-- 
GitLab


From aa32e306048b566cfb590f5bb82cf2e44f5acfc8 Mon Sep 17 00:00:00 2001
From: Mikhail Svechnikov <m.svechnikov@fz-juelich.de>
Date: Thu, 21 Jul 2022 14:25:17 +0200
Subject: [PATCH 18/32] IntensityDataItem: gradient_map

---
 GUI/Model/Data/IntensityDataItem.cpp | 36 +++++++++++++---------------
 1 file changed, 17 insertions(+), 19 deletions(-)

diff --git a/GUI/Model/Data/IntensityDataItem.cpp b/GUI/Model/Data/IntensityDataItem.cpp
index 660c1221b60..c282bd19261 100644
--- a/GUI/Model/Data/IntensityDataItem.cpp
+++ b/GUI/Model/Data/IntensityDataItem.cpp
@@ -21,27 +21,25 @@
 #include "GUI/Model/Device/MaskUnitsConverter.h"
 #include "GUI/Support/IO/ImportDataInfo.h"
 #include "GUI/Util/Error.h"
+#include <qcustomplot.h>
 
 namespace {
 
-ComboProperty gradientSet()
-{
-    ComboProperty result;
-    result << "Grayscale"
-           << "Hot"
-           << "Cold"
-           << "Night"
-           << "Candy"
-           << "Geography"
-           << "Ion"
-           << "Thermal"
-           << "Polar"
-           << "Spectrum"
-           << "Jet"
-           << "Hues";
-    result.setValue("Thermal");
-    return result;
-}
+// gradient map for colormaps
+const QMap<QString, QCPColorGradient::GradientPreset> gradient_map = {
+    {"Grayscale", QCPColorGradient::gpGrayscale},
+    {"Hot", QCPColorGradient::gpHot},
+    {"Cold", QCPColorGradient::gpCold},
+    {"Night", QCPColorGradient::gpNight},
+    {"Candy", QCPColorGradient::gpCandy},
+    {"Geography", QCPColorGradient::gpGeography},
+    {"Ion", QCPColorGradient::gpIon},
+    {"Thermal", QCPColorGradient::gpThermal},
+    {"Polar", QCPColorGradient::gpPolar},
+    {"Spectrum", QCPColorGradient::gpSpectrum},
+    {"Jet", QCPColorGradient::gpJet},
+    {"Hues", QCPColorGradient::gpHues}
+};
 
 } // namespace
 
@@ -51,7 +49,7 @@ IntensityDataItem::IntensityDataItem()
     addProperty(P_TITLE, QString());
     addProperty(P_PROJECTIONS, false);
     addProperty(P_IS_INTERPOLATED, true);
-    addProperty(P_GRADIENT, gradientSet().variant());
+    addProperty(P_GRADIENT, ComboProperty::fromList(gradient_map.keys(), "Thermal").variant());
     addProperty<AmplitudeAxisItem>(P_ZAXIS);
 
     registerTag(T_MASKS, 0, -1, {MaskContainerItem::M_TYPE});
-- 
GitLab


From b3565a118c515e1e96510d682d0c147791baa979 Mon Sep 17 00:00:00 2001
From: Mikhail Svechnikov <m.svechnikov@fz-juelich.de>
Date: Thu, 21 Jul 2022 14:44:49 +0200
Subject: [PATCH 19/32] IntensityDataItem: gradient is only here

---
 GUI/Model/Data/IntensityDataItem.cpp |  8 +++---
 GUI/Model/Data/IntensityDataItem.h   |  5 ++--
 GUI/View/Plot2D/ColorMap.cpp         |  2 +-
 GUI/View/PlotUtil/RangeUtils.cpp     | 37 ----------------------------
 GUI/View/PlotUtil/RangeUtils.h       |  3 ---
 5 files changed, 8 insertions(+), 47 deletions(-)

diff --git a/GUI/Model/Data/IntensityDataItem.cpp b/GUI/Model/Data/IntensityDataItem.cpp
index c282bd19261..3ffbd4dfcb3 100644
--- a/GUI/Model/Data/IntensityDataItem.cpp
+++ b/GUI/Model/Data/IntensityDataItem.cpp
@@ -21,7 +21,6 @@
 #include "GUI/Model/Device/MaskUnitsConverter.h"
 #include "GUI/Support/IO/ImportDataInfo.h"
 #include "GUI/Util/Error.h"
-#include <qcustomplot.h>
 
 namespace {
 
@@ -46,10 +45,11 @@ const QMap<QString, QCPColorGradient::GradientPreset> gradient_map = {
 IntensityDataItem::IntensityDataItem()
     : DataItem(M_TYPE)
 {
+    QString startGradient = gradient_map.key(QCPColorGradient::gpThermal);
     addProperty(P_TITLE, QString());
     addProperty(P_PROJECTIONS, false);
     addProperty(P_IS_INTERPOLATED, true);
-    addProperty(P_GRADIENT, ComboProperty::fromList(gradient_map.keys(), "Thermal").variant());
+    addProperty(P_GRADIENT, ComboProperty::fromList(gradient_map.keys(), startGradient).variant());
     addProperty<AmplitudeAxisItem>(P_ZAXIS);
 
     registerTag(T_MASKS, 0, -1, {MaskContainerItem::M_TYPE});
@@ -134,9 +134,9 @@ void IntensityDataItem::copyZRangeFromItem(DataItem* sourceItem)
     setUpperZ(source->upperZ());
 }
 
-QString IntensityDataItem::gradientValue() const
+QCPColorGradient IntensityDataItem::gradientQCP() const
 {
-    return gradientCombo().getValue();
+    return gradient_map.value(gradientCombo().getValue());
 }
 
 ComboProperty IntensityDataItem::gradientCombo() const
diff --git a/GUI/Model/Data/IntensityDataItem.h b/GUI/Model/Data/IntensityDataItem.h
index 22cfeccd4f3..3709aafafe1 100644
--- a/GUI/Model/Data/IntensityDataItem.h
+++ b/GUI/Model/Data/IntensityDataItem.h
@@ -17,6 +17,7 @@
 
 #include "GUI/Model/Data/DataItem.h"
 #include "GUI/Model/Descriptor/SelectionDescriptor.h"
+#include <qcustomplot.h>
 
 class BasicAxisItem;
 class AmplitudeAxisItem;
@@ -61,10 +62,10 @@ public:
     void setLowerZ(double zmin);
     void setUpperZ(double zmax);
     void setLowerAndUpperZ(double zmin, double zmax);
-    void copyZRangeFromItem(DataItem *sourceItem);
+    void copyZRangeFromItem(DataItem* sourceItem);
 
     // Color scheme of the color map
-    QString gradientValue() const;
+    QCPColorGradient gradientQCP() const;
     ComboProperty gradientCombo() const;
     void setGradient(const ComboProperty& gradient);
     SelectionDescriptor<QString> gradient() const;
diff --git a/GUI/View/Plot2D/ColorMap.cpp b/GUI/View/Plot2D/ColorMap.cpp
index c7326a4bbd0..82867508874 100644
--- a/GUI/View/Plot2D/ColorMap.cpp
+++ b/GUI/View/Plot2D/ColorMap.cpp
@@ -119,7 +119,7 @@ void ColorMap::setGradient()
 {
     if(!intensityItem())
         return;
-    m_colorMap->setGradient(GUI::View::RangeUtils::itemGradient(intensityItem()));
+    m_colorMap->setGradient(intensityItem()->gradientQCP());
     replot();
 }
 
diff --git a/GUI/View/PlotUtil/RangeUtils.cpp b/GUI/View/PlotUtil/RangeUtils.cpp
index 826df77f500..b20fc9d5cdb 100644
--- a/GUI/View/PlotUtil/RangeUtils.cpp
+++ b/GUI/View/PlotUtil/RangeUtils.cpp
@@ -19,30 +19,8 @@
 #include "GUI/Util/Error.h"
 #include "GUI/View/Tool/StyleUtils.h"
 
-using gradient_map_t = QMap<QString, QCPColorGradient::GradientPreset>;
-
 namespace {
 
-gradient_map_t createGradientMap()
-{
-    gradient_map_t result;
-
-    result["Grayscale"] = QCPColorGradient::gpGrayscale;
-    result["Hot"] = QCPColorGradient::gpHot;
-    result["Cold"] = QCPColorGradient::gpCold;
-    result["Night"] = QCPColorGradient::gpNight;
-    result["Candy"] = QCPColorGradient::gpCandy;
-    result["Geography"] = QCPColorGradient::gpGeography;
-    result["Ion"] = QCPColorGradient::gpIon;
-    result["Thermal"] = QCPColorGradient::gpThermal;
-    result["Polar"] = QCPColorGradient::gpPolar;
-    result["Spectrum"] = QCPColorGradient::gpSpectrum;
-    result["Jet"] = QCPColorGradient::gpJet;
-    result["Hues"] = QCPColorGradient::gpHues;
-
-    return result;
-}
-
 // Converts xmin (low edge of first bin) and xmax (upper edge of last bin) to the
 // range expected by QCPColorMapData::setRange.
 QCPRange qcpRange(double xmin, double xmax, int nbins)
@@ -63,21 +41,6 @@ QMargins defaultMargins(const QWidget& widget)
 
 } // namespace
 
-QCPColorGradient GUI::View::RangeUtils::getGradient(const QString& gradientName)
-{
-    static gradient_map_t gradient_map = createGradientMap();
-
-    auto it = gradient_map.find(gradientName);
-    if (it == gradient_map.end())
-        throw Error("ColorMapHelper::getGradient() -> Error. No such gradient" + gradientName);
-    return QCPColorGradient(it.value());
-}
-
-QCPColorGradient GUI::View::RangeUtils::itemGradient(const IntensityDataItem* item)
-{
-    return getGradient(item->gradientValue());
-}
-
 QCPRange GUI::View::RangeUtils::itemXrange(const IntensityDataItem* item)
 {
     return qcpRange(item->xMin(), item->xMax(), item->xSize());
diff --git a/GUI/View/PlotUtil/RangeUtils.h b/GUI/View/PlotUtil/RangeUtils.h
index 505bfeb3ab9..f836430c5d4 100644
--- a/GUI/View/PlotUtil/RangeUtils.h
+++ b/GUI/View/PlotUtil/RangeUtils.h
@@ -31,9 +31,6 @@ class ColorMap;
 
 namespace GUI::View::RangeUtils {
 
-QCPColorGradient getGradient(const QString& gradientName);
-QCPColorGradient itemGradient(const IntensityDataItem* item);
-
 //! Returns x-axis range.
 QCPRange itemXrange(const IntensityDataItem* item);
 
-- 
GitLab


From e8b608ec3a9265cd7f857711d026f36ba2f7ae35 Mon Sep 17 00:00:00 2001
From: Mikhail Svechnikov <m.svechnikov@fz-juelich.de>
Date: Thu, 21 Jul 2022 16:00:44 +0200
Subject: [PATCH 20/32] DataItem: cleanup

---
 GUI/Model/Data/DataItem.h | 2 --
 1 file changed, 2 deletions(-)

diff --git a/GUI/Model/Data/DataItem.h b/GUI/Model/Data/DataItem.h
index c42d39064ff..648636859ce 100644
--- a/GUI/Model/Data/DataItem.h
+++ b/GUI/Model/Data/DataItem.h
@@ -99,8 +99,6 @@ public:
     ComboProperty axesUnitsCombo() const;
     void setAxesUnits(const ComboProperty& units);
     SelectionDescriptor<QString> axesUnits() const;
-
-    //! Returns currently selected axes units
     QString selectedAxesUnits() const;
 
     //! Updates data on the change of axes units
-- 
GitLab


From 4598452f4ab74685d3e3c164cd35b3a25dbf57b1 Mon Sep 17 00:00:00 2001
From: Mikhail Svechnikov <m.svechnikov@fz-juelich.de>
Date: Thu, 21 Jul 2022 16:37:12 +0200
Subject: [PATCH 21/32] DataPropertyWidget: change units in real data

---
 GUI/View/PlotUtil/DataPropertyWidget.cpp | 25 ++++++++++++++----------
 1 file changed, 15 insertions(+), 10 deletions(-)

diff --git a/GUI/View/PlotUtil/DataPropertyWidget.cpp b/GUI/View/PlotUtil/DataPropertyWidget.cpp
index 4b4153be63e..c17b3b77310 100644
--- a/GUI/View/PlotUtil/DataPropertyWidget.cpp
+++ b/GUI/View/PlotUtil/DataPropertyWidget.cpp
@@ -13,6 +13,8 @@
 //  ************************************************************************************************
 
 #include "GUI/View/PlotUtil/DataPropertyWidget.h"
+#include "GUI/Model/Data/SessionData.h"
+#include "GUI/Model/Project/ProjectDocument.h"
 #include "GUI/Model/Data/DataItem.h"
 #include <QFormLayout>
 
@@ -39,21 +41,24 @@ void DataPropertyWidget::updateItemCoords(DataItem* item)
     // TODO : https://jugit.fz-juelich.de/mlz/bornagain/-/issues/320
     // Also change units for real item with linked instrument
 
-    if (!item || !jobItem())
+    if (!item)
         return;
 
-//    InstrumentItem* instrument;
-//    if(jobItem())
-//        instrument = jobItem()->instrumentItem();
-//    else if(realItem())
-//        instrument = gSessionData->instrumentLibrary.collectedItems()
-//                ->findInstrumentById(realItem()->instrumentId());
-//    if(instrument) {
+    InstrumentItem* instrument = nullptr;
+    if(jobItem())
+        instrument = jobItem()->instrumentItem();
+    else if(realItem()) {
+        instrument = gSessionData->projectDocument.value()->collectedItems()
+                ->findInstrumentById(realItem()->instrumentId());
+    } else
+        ASSERT(0)
+
+    if(instrument) {
         item->blockSignals(true);
-        item->updateCoords(jobItem()->instrumentItem());
+        item->updateCoords(instrument);
         item->blockSignals(false);
         emit item->axesUnitsReplotRequested();
-//    }
+    }
 }
 
 void DataPropertyWidget::updateUIValues()
-- 
GitLab


From bd2c10702944f94d1b7c36adca59c366d1bd0cc0 Mon Sep 17 00:00:00 2001
From: Mikhail Svechnikov <m.svechnikov@fz-juelich.de>
Date: Thu, 21 Jul 2022 16:53:00 +0200
Subject: [PATCH 22/32] DataPropertyWidget: cleanup

---
 GUI/View/PlotUtil/DataPropertyWidget.cpp | 3 ---
 1 file changed, 3 deletions(-)

diff --git a/GUI/View/PlotUtil/DataPropertyWidget.cpp b/GUI/View/PlotUtil/DataPropertyWidget.cpp
index c17b3b77310..903d18cf564 100644
--- a/GUI/View/PlotUtil/DataPropertyWidget.cpp
+++ b/GUI/View/PlotUtil/DataPropertyWidget.cpp
@@ -38,9 +38,6 @@ void DataPropertyWidget::setJobOrRealItem(JobRealBase* job_or_real_Item)
 
 void DataPropertyWidget::updateItemCoords(DataItem* item)
 {
-    // TODO : https://jugit.fz-juelich.de/mlz/bornagain/-/issues/320
-    // Also change units for real item with linked instrument
-
     if (!item)
         return;
 
-- 
GitLab


From 6061640522631ff5104ab9051b537e718bc444de Mon Sep 17 00:00:00 2001
From: Mikhail Svechnikov <m.svechnikov@fz-juelich.de>
Date: Thu, 21 Jul 2022 17:16:33 +0200
Subject: [PATCH 23/32] RealDataSelector: instrument change notification

---
 GUI/View/Import/RealDataPropertiesWidget.cpp | 2 ++
 GUI/View/Import/RealDataPropertiesWidget.h   | 3 +++
 GUI/View/Import/RealDataSelectorWidget.cpp   | 3 +++
 3 files changed, 8 insertions(+)

diff --git a/GUI/View/Import/RealDataPropertiesWidget.cpp b/GUI/View/Import/RealDataPropertiesWidget.cpp
index 9656b263303..8c0fab804d1 100644
--- a/GUI/View/Import/RealDataPropertiesWidget.cpp
+++ b/GUI/View/Import/RealDataPropertiesWidget.cpp
@@ -88,6 +88,8 @@ void RealDataPropertiesWidget::onInstrumentComboIndexChanged(int /*index*/)
     } else
         // Linking was impossible or denied. Set combo to previous state
         updateInstrumentComboIndex();
+
+    emit instrumentUpdated(m_currentRealItem);
 }
 
 //! Updates instrument selector for new instruments and their names.
diff --git a/GUI/View/Import/RealDataPropertiesWidget.h b/GUI/View/Import/RealDataPropertiesWidget.h
index 8b27ee82ef8..93bf77d9c40 100644
--- a/GUI/View/Import/RealDataPropertiesWidget.h
+++ b/GUI/View/Import/RealDataPropertiesWidget.h
@@ -35,6 +35,9 @@ public:
     //! Set current RealDataItem to display in instrument selector.
     void setRealItem(RealDataItem* realItem);
 
+signals:
+    void instrumentUpdated(RealDataItem* realItem);
+
 private:
     //! Processes user interaction with instrument selector combo. If there is realDataItem,
     //! it will be linked with selected instrument.
diff --git a/GUI/View/Import/RealDataSelectorWidget.cpp b/GUI/View/Import/RealDataSelectorWidget.cpp
index 8da87546fed..2e9d36f7cad 100644
--- a/GUI/View/Import/RealDataSelectorWidget.cpp
+++ b/GUI/View/Import/RealDataSelectorWidget.cpp
@@ -103,6 +103,9 @@ RealDataSelectorWidget::RealDataSelectorWidget(QWidget* parent, ProjectDocument*
 
     setLayout(mainLayout);
 
+    connect(m_propertiesWidget, &RealDataPropertiesWidget::instrumentUpdated, this,
+            &RealDataSelectorWidget::selectionChanged);
+
     connect(m_itemTree, &QTreeView::customContextMenuRequested, this,
             &RealDataSelectorWidget::onContextMenuRequest);
 
-- 
GitLab


From eead760262c709e250285f6c81e7af418e09c96b Mon Sep 17 00:00:00 2001
From: Mikhail Svechnikov <m.svechnikov@fz-juelich.de>
Date: Fri, 22 Jul 2022 12:38:09 +0200
Subject: [PATCH 24/32] MaskGraphicsScene: back to onSceneSelectionChanged()

---
 GUI/View/Mask/MaskGraphicsScene.cpp | 38 ++++++++++++-----------------
 1 file changed, 16 insertions(+), 22 deletions(-)

diff --git a/GUI/View/Mask/MaskGraphicsScene.cpp b/GUI/View/Mask/MaskGraphicsScene.cpp
index 043397c7ff7..cbdc58c3348 100644
--- a/GUI/View/Mask/MaskGraphicsScene.cpp
+++ b/GUI/View/Mask/MaskGraphicsScene.cpp
@@ -237,28 +237,22 @@ void MaskGraphicsScene::onSessionSelectionChanged(const QItemSelection&, const Q
 
 void MaskGraphicsScene::onSceneSelectionChanged()
 {
-    // TODO : https://jugit.fz-juelich.de/mlz/bornagain/-/issues/319
-    //
-    // With this code we get crash on program close if:
-    // create or select mask -> calculate job with masked data -> save -> close program
-    // I don't understand the meaning of this function, but without it everything looks working
-
-//    if (m_block_selection)
-//        return;
-
-//    m_block_selection = true;
-
-//    m_selectionModel->clearSelection();
-
-//    for (QGraphicsItem* graphicsItem : selectedItems()) {
-//        if (auto* view = dynamic_cast<IShape2DView*>(graphicsItem)) {
-//            QModelIndex itemIndex = m_maskModel->indexOfItem(view->parameterizedItem());
-//            ASSERT(itemIndex.isValid());
-//            if (!m_selectionModel->isSelected(itemIndex))
-//                m_selectionModel->select(itemIndex, QItemSelectionModel::Select);
-//        }
-//    }
-//    m_block_selection = false;
+    if (m_block_selection)
+        return;
+
+    m_block_selection = true;
+
+    m_selectionModel->clearSelection();
+
+    for (QGraphicsItem* graphicsItem : selectedItems()) {
+        if (auto* view = dynamic_cast<IShape2DView*>(graphicsItem)) {
+            QModelIndex itemIndex = m_maskModel->indexOfItem(view->parameterizedItem());
+            ASSERT(itemIndex.isValid());
+            if (!m_selectionModel->isSelected(itemIndex))
+                m_selectionModel->select(itemIndex, QItemSelectionModel::Select);
+        }
+    }
+    m_block_selection = false;
 }
 
 void MaskGraphicsScene::mousePressEvent(QGraphicsSceneMouseEvent* event)
-- 
GitLab


From d07420130647e6d616c2e460e5a1a674e38b4245 Mon Sep 17 00:00:00 2001
From: Mikhail Svechnikov <m.svechnikov@fz-juelich.de>
Date: Fri, 29 Jul 2022 15:00:15 +0200
Subject: [PATCH 25/32] DataPropertyWidget: rm using std::function

---
 GUI/View/PlotUtil/DataPropertyWidget.h | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)

diff --git a/GUI/View/PlotUtil/DataPropertyWidget.h b/GUI/View/PlotUtil/DataPropertyWidget.h
index 6816fb2542b..bebffa3176f 100644
--- a/GUI/View/PlotUtil/DataPropertyWidget.h
+++ b/GUI/View/PlotUtil/DataPropertyWidget.h
@@ -19,8 +19,6 @@
 
 class QFormLayout;
 
-using std::function;
-
 //! Base class for IntensityDataPropertyWidget and SpecularDataPropertyWidget.
 
 class DataPropertyWidget : public DataAccessWidget {
@@ -36,7 +34,7 @@ protected:
     virtual void createPanelElements() = 0;
 
     QFormLayout* m_mainLayout;
-    QList<function<void()>> m_updaters;
+    QList<std::function<void()>> m_updaters;
 };
 
 #endif // BORNAGAIN_GUI_VIEW_PLOTUTIL_DATAPROPERTYWIDGET_H
-- 
GitLab


From ac0f1e9df895d1d8a74f1f9da2f73b7e03fe1aa8 Mon Sep 17 00:00:00 2001
From: Mikhail Svechnikov <m.svechnikov@fz-juelich.de>
Date: Fri, 29 Jul 2022 15:05:21 +0200
Subject: [PATCH 26/32] MaskEditorPropertyPanel: rm using std::function

---
 GUI/View/Mask/MaskEditorPropertyPanel.h | 2 --
 1 file changed, 2 deletions(-)

diff --git a/GUI/View/Mask/MaskEditorPropertyPanel.h b/GUI/View/Mask/MaskEditorPropertyPanel.h
index 531008bd597..08cbcd34e58 100644
--- a/GUI/View/Mask/MaskEditorPropertyPanel.h
+++ b/GUI/View/Mask/MaskEditorPropertyPanel.h
@@ -20,8 +20,6 @@
 #include <QModelIndex>
 #include <functional>
 
-using std::function;
-
 class QListView;
 class SessionModel;
 class QItemSelection;
-- 
GitLab


From c37a3e65070084d468a5455dfd6f04c924717af4 Mon Sep 17 00:00:00 2001
From: Mikhail Svechnikov <m.svechnikov@fz-juelich.de>
Date: Fri, 29 Jul 2022 15:07:58 +0200
Subject: [PATCH 27/32] MinimizerSettingsWidget: rm using std::function

---
 GUI/View/Fit/MinimizerSettingsWidget.h | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)

diff --git a/GUI/View/Fit/MinimizerSettingsWidget.h b/GUI/View/Fit/MinimizerSettingsWidget.h
index 3dd9252c9fa..b1ff0ede2e3 100644
--- a/GUI/View/Fit/MinimizerSettingsWidget.h
+++ b/GUI/View/Fit/MinimizerSettingsWidget.h
@@ -26,8 +26,6 @@ class DoubleDescriptor;
 class UIntDescriptor;
 class QFormLayout;
 
-using std::function;
-
 //! The MinimizerSettingsWidget contains editor for all minimizer settings and related fit
 //! options. Part of FitSuiteWidget.
 
@@ -51,7 +49,7 @@ private:
     MinimizerContainerItem* m_currentItem;
     QFormLayout* m_mainLayout;
     QFormLayout* m_minimizerLayout;
-    QList<function<void()>> m_updaters;
+    QList<std::function<void()>> m_updaters;
 };
 
 #endif // BORNAGAIN_GUI_VIEW_FIT_MINIMIZERSETTINGSWIDGET_H
-- 
GitLab


From 1747afd25284b6ef30fd60de79703c72a50c6835 Mon Sep 17 00:00:00 2001
From: Mikhail Svechnikov <m.svechnikov@fz-juelich.de>
Date: Fri, 29 Jul 2022 15:16:27 +0200
Subject: [PATCH 28/32] SelectionDescriptor & WidgetUtils: rm using
 std::function

---
 GUI/Model/Descriptor/SelectionDescriptor.h |  8 ++---
 GUI/View/Tool/WidgetUtils.cpp              | 22 +++++++-------
 GUI/View/Tool/WidgetUtils.h                | 34 +++++++++++-----------
 3 files changed, 31 insertions(+), 33 deletions(-)

diff --git a/GUI/Model/Descriptor/SelectionDescriptor.h b/GUI/Model/Descriptor/SelectionDescriptor.h
index 2bde2404d67..1cd99633fd2 100644
--- a/GUI/Model/Descriptor/SelectionDescriptor.h
+++ b/GUI/Model/Descriptor/SelectionDescriptor.h
@@ -21,8 +21,6 @@
 #include <QStringList>
 #include <functional>
 
-using std::function;
-
 //! Abstract base class for SelectionDescriptor to ease referencing.
 class AbstractSelectionDescriptor {
 public:
@@ -108,9 +106,9 @@ public:
     QString label;                          //!< A label text (short, no trailing colon)
     QString tooltip;                        //!< Tooltip text
     QStringList options;                    //!< List of options, usually presented as combo entries
-    function<void(int)> currentIndexSetter; //!< Function to set currently selected option
-    function<int()> currentIndexGetter;     //!< Function to get currently selected option
-    function<T()> currentItem;              //!< Function to get currently selected item
+    std::function<void(int)> currentIndexSetter; //!< Function to set currently selected option
+    std::function<int()> currentIndexGetter;     //!< Function to get currently selected option
+    std::function<T()> currentItem;              //!< Function to get currently selected item
 };
 
 #endif // BORNAGAIN_GUI_MODEL_DESCRIPTOR_SELECTIONDESCRIPTOR_H
diff --git a/GUI/View/Tool/WidgetUtils.cpp b/GUI/View/Tool/WidgetUtils.cpp
index bd436883672..87081b2c1c0 100644
--- a/GUI/View/Tool/WidgetUtils.cpp
+++ b/GUI/View/Tool/WidgetUtils.cpp
@@ -57,7 +57,7 @@ SafeSpinBox* GUI::Util::createSpinBox(const UIntDescriptor& d,
 }
 
 SafeSpinBox* GUI::Util::createSpinBoxScroll(const UIntDescriptor& d,
-                                            QList<function<void()>>* updaters,
+                                            QList<std::function<void()>>* updaters,
                                             std::function<void(uint)> slot)
 {
     return GUI::Util::createSpinBox(d, updaters, slot, true);
@@ -119,9 +119,9 @@ ScientificSpinBox* GUI::Util::createScientificSpinBox(QFormLayout* parentLayout,
 }
 
 QCheckBox* GUI::Util::createCheckBox(const QString& title,
-                                     function<bool()> getter,
-                                     function<void(bool)> setter,
-                                     QList<function<void()>>* updaters)
+                                     std::function<bool()> getter,
+                                     std::function<void(bool)> setter,
+                                     QList<std::function<void()>>* updaters)
 {
     QCheckBox* checkBox = new QCheckBox(title);
     checkBox->setChecked(getter());
@@ -137,9 +137,9 @@ QCheckBox* GUI::Util::createCheckBox(const QString& title,
     return checkBox;
 }
 
-QLineEdit* GUI::Util::createTextEdit(function<QString()> getter,
-                                     function<void(QString)> setter,
-                                     QList<function<void()>>* updaters)
+QLineEdit* GUI::Util::createTextEdit(std::function<QString()> getter,
+                                     std::function<void(QString)> setter,
+                                     QList<std::function<void()>>* updaters)
 {
     QLineEdit* edit = new QLineEdit;
     edit->setText(getter());
@@ -156,8 +156,8 @@ QLineEdit* GUI::Util::createTextEdit(function<QString()> getter,
 }
 
 DoubleSpinBox* GUI::Util::createDoubleSpinbox(DoubleDescriptor d,
-                                              QList<function<void()>>* updaters,
-                                              function<void(double)> slot,
+                                              QList<std::function<void()>>* updaters,
+                                              std::function<void(double)> slot,
                                               bool easyScrollable)
 {
     DoubleSpinBox* spinBox = new DoubleSpinBox(d, easyScrollable);
@@ -177,8 +177,8 @@ DoubleSpinBox* GUI::Util::createDoubleSpinbox(DoubleDescriptor d,
 }
 
 DoubleSpinBox* GUI::Util::createDoubleSpinboxScroll(DoubleDescriptor d,
-                                                    QList<function<void()>>* updaters,
-                                                    function<void(double)> slot)
+                                                    QList<std::function<void()>>* updaters,
+                                                    std::function<void(double)> slot)
 {
     return GUI::Util::createDoubleSpinbox(d, updaters, slot, true);
 }
diff --git a/GUI/View/Tool/WidgetUtils.h b/GUI/View/Tool/WidgetUtils.h
index 226d25aadcf..6391e61317d 100644
--- a/GUI/View/Tool/WidgetUtils.h
+++ b/GUI/View/Tool/WidgetUtils.h
@@ -47,8 +47,8 @@ namespace GUI::Util {
 //!
 template <typename T>
 QComboBox* createComboBox(SelectionDescriptor<T> d,
-                          function<void(int)> slot = nullptr,
-                          QList<function<void()>>* updaters = nullptr,
+                          std::function<void(int)> slot = nullptr,
+                          QList<std::function<void()>>* updaters = nullptr,
                           bool isScrollable = false)
 {
     QComboBox* combo = new QComboBox;
@@ -78,8 +78,8 @@ QComboBox* createComboBox(SelectionDescriptor<T> d,
 //! Scrollable and updatable version
 template <typename T>
 QComboBox* createComboBoxUpdScroll(SelectionDescriptor<T> d,
-                                   QList<function<void()>>* updaters = nullptr,
-                                   function<void(int)> slot = nullptr)
+                                   QList<std::function<void()>>* updaters = nullptr,
+                                   std::function<void(int)> slot = nullptr)
 {
     return GUI::Util::createComboBox(d, slot, updaters, true);
 }
@@ -87,7 +87,7 @@ QComboBox* createComboBoxUpdScroll(SelectionDescriptor<T> d,
 //! Scrollable, but non-updatable version
 template <typename T>
 QComboBox* createComboBoxScroll(SelectionDescriptor<T> d,
-                                function<void(int)> slot = nullptr)
+                                std::function<void(int)> slot = nullptr)
 {
     return GUI::Util::createComboBox(d, slot, nullptr, true);
 }
@@ -103,13 +103,13 @@ QComboBox* createComboBoxScroll(SelectionDescriptor<T> d,
 //! will *not* be notified to the descriptor. The additional (and optional) slot can be used to be
 //! notified about a value change.
 SafeSpinBox* createSpinBox(const UIntDescriptor& d,
-                           QList<function<void()>>* updaters = nullptr,
+                           QList<std::function<void()>>* updaters = nullptr,
                            std::function<void(uint)> slot = nullptr,
                            bool easyScrollable = false);
 
 //! Creates a scrollable spinbox
 SafeSpinBox* createSpinBoxScroll(const UIntDescriptor& d,
-                                 QList<function<void()>>* updaters = nullptr,
+                                 QList<std::function<void()>>* updaters = nullptr,
                                  std::function<void(uint)> slot = nullptr);
 
 //! Create a label and a spin box with the information found in a UIntDescriptor and place them in a
@@ -162,25 +162,25 @@ QString labelWithUnit(const DoubleDescriptor& d);
 
 //! Creates an updatable checkbox
 QCheckBox* createCheckBox(const QString& title,
-                          function<bool()> getter,
-                          function<void(bool)> setter,
-                          QList<function<void()>>* updaters);
+                          std::function<bool()> getter,
+                          std::function<void(bool)> setter,
+                          QList<std::function<void()>>* updaters);
 
 //! Creates an updatable lineedit
-QLineEdit* createTextEdit(function<QString()> getter,
-                          function<void(QString)> setter,
-                          QList<function<void()>>* updaters);
+QLineEdit* createTextEdit(std::function<QString()> getter,
+                          std::function<void(QString)> setter,
+                          QList<std::function<void()>>* updaters);
 
 //! Creates an updatable doublespinBox
 DoubleSpinBox* createDoubleSpinbox(DoubleDescriptor d,
-                                   QList<function<void ()>>* updaters = nullptr,
-                                   function<void(double)> slot = nullptr,
+                                   QList<std::function<void ()>>* updaters = nullptr,
+                                   std::function<void(double)> slot = nullptr,
                                    bool easyScrollable = false);
 
 //! Creates a scrollable updatable doublespinBox
 DoubleSpinBox* createDoubleSpinboxScroll(DoubleDescriptor d,
-                                         QList<function<void()>>* updaters = nullptr,
-                                         function<void(double)> slot = nullptr);
+                                         QList<std::function<void()>>* updaters = nullptr,
+                                         std::function<void(double)> slot = nullptr);
 
 
 } // namespace GUI::Util
-- 
GitLab


From f0303f57815f539b4d88933fed112a69303dce37 Mon Sep 17 00:00:00 2001
From: Mikhail Svechnikov <m.svechnikov@fz-juelich.de>
Date: Fri, 29 Jul 2022 15:21:53 +0200
Subject: [PATCH 29/32] UIntDescriptor: mv using std::function to cpp

---
 GUI/Model/Descriptor/UIntDescriptor.cpp |  5 ++++-
 GUI/Model/Descriptor/UIntDescriptor.h   | 26 +++++++++++--------------
 2 files changed, 15 insertions(+), 16 deletions(-)

diff --git a/GUI/Model/Descriptor/UIntDescriptor.cpp b/GUI/Model/Descriptor/UIntDescriptor.cpp
index 739a2fc306d..688c083afd7 100644
--- a/GUI/Model/Descriptor/UIntDescriptor.cpp
+++ b/GUI/Model/Descriptor/UIntDescriptor.cpp
@@ -17,6 +17,9 @@
 #include "GUI/Model/BaseItem/SessionItem.h"
 #include <utility>
 
+using std::function;
+using std::variant;
+
 UIntDescriptor::UIntDescriptor(const QString& label, SessionItem* item,
                                const variant<QString, Unit>& unit)
     : UIntDescriptor(
@@ -25,7 +28,7 @@ UIntDescriptor::UIntDescriptor(const QString& label, SessionItem* item,
 {
 }
 
-UIntDescriptor::UIntDescriptor(SessionItem* item, const variant<QString, Unit>& unit)
+UIntDescriptor::UIntDescriptor(SessionItem* item, const variant<QString, Unit> &unit)
     : UIntDescriptor(item->displayName(), item, unit)
 {
 }
diff --git a/GUI/Model/Descriptor/UIntDescriptor.h b/GUI/Model/Descriptor/UIntDescriptor.h
index f5521bbb001..91480877693 100644
--- a/GUI/Model/Descriptor/UIntDescriptor.h
+++ b/GUI/Model/Descriptor/UIntDescriptor.h
@@ -23,10 +23,6 @@
 
 class SessionItem;
 
-using std::function;
-using std::variant;
-
-
 //! Describes properties of a uint value which are necessary to allow GUI representation, editing
 //! the value, undo/redo, unit conversion.
 //!
@@ -39,25 +35,25 @@ public:
     //! Operates on a session item. The settings (like limits) are taken from the session
     //! item.
     //! Only for easier migration. Should be removed after SessionItem refactoring.
-    UIntDescriptor(SessionItem* item, const variant<QString, Unit>& unit);
+    UIntDescriptor(SessionItem* item, const std::variant<QString, Unit>& unit);
 
     //! Operates on a session item. The settings (like limits) are taken from the session
     //! item.
     //! Only for easier migration. Should be removed after SessionItem refactoring.
-    UIntDescriptor(const QString& label, SessionItem* item, const variant<QString, Unit>& unit);
+    UIntDescriptor(const QString& label, SessionItem* item, const std::variant<QString, Unit>& unit);
 
-    UIntDescriptor(const QString& label, const uint* var, const variant<QString, Unit>& unit);
+    UIntDescriptor(const QString& label, const uint* var, const std::variant<QString, Unit>& unit);
 
 private:
     //! Operates on any kind of storage (e.g. session items), by using setter/getter methods
     UIntDescriptor(QString label, QString tooltip, const RealLimits& limits,
-                   function<void(uint)> setter, function<uint()> getter,
-                   const variant<QString, Unit>& unit);
+                   std::function<void(uint)> setter, std::function<uint()> getter,
+                   const std::variant<QString, Unit>& unit);
 
     //! Operates on any kind of storage (e.g. session items), by using setter/getter methods
     //! limits is set to nonnegative
-    UIntDescriptor(const QString& label, const QString& tooltip, function<void(uint)> setter,
-                   function<uint()> getter, const variant<QString, Unit>& unit);
+    UIntDescriptor(const QString& label, const QString& tooltip, std::function<void(uint)> setter,
+                   std::function<uint()> getter, const std::variant<QString, Unit>& unit);
 
 public:
     //! Return the current value of the handled parameter.
@@ -66,10 +62,10 @@ public:
     QString label;                                //!< A label text (short, no trailing colon)
     QString tooltip;                              //!< Tooltip text
     RealLimits limits;                            //!< Limits of the value.
-    function<void(uint)> set = nullptr;           //!< function to set the value
-    function<uint()> get = nullptr;               //!< function to get the current value
-    variant<QString, Unit> unit = Unit::unitless; //!< Unit of the value (internal unit only!)
-    function<QString()> path = nullptr; //!< Path describing  this value. Used e.g. for undo/redo
+    std::function<void(uint)> set = nullptr;           //!< function to set the value
+    std::function<uint()> get = nullptr;               //!< function to get the current value
+    std::variant<QString, Unit> unit = Unit::unitless; //!< Unit of the value (internal unit only!)
+    std::function<QString()> path = nullptr; //!< Path describing  this value. Used e.g. for undo/redo
 };
 
 #endif // BORNAGAIN_GUI_MODEL_DESCRIPTOR_UINTDESCRIPTOR_H
-- 
GitLab


From 76cf388202bc37121543051b2c6f5aad6ecc9b90 Mon Sep 17 00:00:00 2001
From: Mikhail Svechnikov <m.svechnikov@fz-juelich.de>
Date: Fri, 29 Jul 2022 15:29:48 +0200
Subject: [PATCH 30/32] UIntProperty: mv using std::variant to cpp

---
 GUI/Model/Descriptor/UIntProperty.cpp |  2 ++
 GUI/Model/Descriptor/UIntProperty.h   | 10 ++--------
 2 files changed, 4 insertions(+), 8 deletions(-)

diff --git a/GUI/Model/Descriptor/UIntProperty.cpp b/GUI/Model/Descriptor/UIntProperty.cpp
index 4a64ce1b69d..c4a851a5f04 100644
--- a/GUI/Model/Descriptor/UIntProperty.cpp
+++ b/GUI/Model/Descriptor/UIntProperty.cpp
@@ -17,6 +17,8 @@
 #include "GUI/Support/XML/UtilXML.h"
 #include <QUuid>
 
+using std::variant;
+
 void UIntProperty::init(const QString& label, const QString& tooltip, uint value,
                         const variant<QString, Unit>& unit, const QString& persistentTag)
 {
diff --git a/GUI/Model/Descriptor/UIntProperty.h b/GUI/Model/Descriptor/UIntProperty.h
index a6bce7d06bf..924c4329556 100644
--- a/GUI/Model/Descriptor/UIntProperty.h
+++ b/GUI/Model/Descriptor/UIntProperty.h
@@ -17,17 +17,11 @@
 
 #include "Fit/Param/RealLimits.h"
 #include "GUI/Model/Descriptor/UIntDescriptor.h"
-#include "GUI/Support/Type/Unit.h"
-#include <QString>
-#include <functional>
 #include <variant>
 
 class Streamer;
 class SessionItem;
 
-using std::function;
-using std::variant;
-
 //! Class for representing a uint value, its attributes and its accessors.
 //!
 //! For a complete description please refer to the documentation of DoubleProperty. Everything said
@@ -39,9 +33,9 @@ using std::variant;
 class UIntProperty {
 public:
     void init(const QString& label, const QString& tooltip, uint value,
-              const variant<QString, Unit>& unit, const QString& persistentTag);
+              const std::variant<QString, Unit>& unit, const QString& persistentTag);
     void init(const QString& label, const QString& tooltip, uint value,
-              const variant<QString, Unit>& unit, const RealLimits& limits,
+              const std::variant<QString, Unit>& unit, const RealLimits& limits,
               const QString& persistentTag);
 
     UIntDescriptor descriptor() const { return m_descriptor; }
-- 
GitLab


From 59167c0dd27c822a22b72487ae35e3d7fdf302c1 Mon Sep 17 00:00:00 2001
From: Mikhail Svechnikov <m.svechnikov@fz-juelich.de>
Date: Fri, 29 Jul 2022 15:40:31 +0200
Subject: [PATCH 31/32] Descriptors & Properties: mv using std::variant &
 std::function to cpp

---
 GUI/Model/Descriptor/AxisProperty.cpp         |  2 ++
 GUI/Model/Descriptor/AxisProperty.h           |  6 ++--
 GUI/Model/Descriptor/DistributionItems.cpp    |  2 ++
 GUI/Model/Descriptor/DistributionItems.h      | 16 ++++-----
 GUI/Model/Descriptor/DoubleDescriptor.cpp     |  3 ++
 GUI/Model/Descriptor/DoubleDescriptor.h       | 29 ++++++++--------
 GUI/Model/Descriptor/DoubleProperty.cpp       |  2 ++
 GUI/Model/Descriptor/DoubleProperty.h         |  6 ++--
 GUI/Model/Descriptor/VectorDescriptor.h       |  8 ++---
 GUI/Model/Descriptor/VectorProperty.cpp       |  2 ++
 GUI/Model/Descriptor/VectorProperty.h         |  2 +-
 GUI/Model/Model/ParameterTreeUtils.cpp        |  2 ++
 GUI/View/Mask/MaskEditorPropertyPanel.cpp     |  2 ++
 GUI/View/Mask/MaskEditorPropertyPanel.h       |  4 +--
 GUI/View/SampleDesigner/FormLayouter.cpp      |  2 ++
 GUI/View/SampleDesigner/FormLayouter.h        |  4 +--
 GUI/View/SampleDesigner/LayerEditorUtils.cpp  |  2 ++
 GUI/View/SampleDesigner/LayerEditorUtils.h    |  4 +--
 .../SampleDesigner/SelectionContainerForm.h   |  2 +-
 GUI/View/Tool/WidgetUtils.cpp                 | 33 ++++++++++---------
 20 files changed, 76 insertions(+), 57 deletions(-)

diff --git a/GUI/Model/Descriptor/AxisProperty.cpp b/GUI/Model/Descriptor/AxisProperty.cpp
index b98052fae88..78e8aa34195 100644
--- a/GUI/Model/Descriptor/AxisProperty.cpp
+++ b/GUI/Model/Descriptor/AxisProperty.cpp
@@ -16,6 +16,8 @@
 #include "Base/Util/Assert.h"
 #include "GUI/Support/XML/Serialize.h"
 
+using std::variant;
+
 void AxisProperty::initNbins(const QString& label, const QString& tooltip, uint n,
                              const variant<QString, Unit>& unit)
 {
diff --git a/GUI/Model/Descriptor/AxisProperty.h b/GUI/Model/Descriptor/AxisProperty.h
index 26dc4131d62..d69bc2b21b0 100644
--- a/GUI/Model/Descriptor/AxisProperty.h
+++ b/GUI/Model/Descriptor/AxisProperty.h
@@ -42,13 +42,13 @@ public:
     DOUBLE_PROPERTY(max, Max);
 
     void initNbins(const QString& label, const QString& tooltip, uint n = 100,
-                   const variant<QString, Unit>& unit = "nbins");
+                   const std::variant<QString, Unit>& unit = "nbins");
 
     void initMin(const QString& label, const QString& tooltip, double value,
-                 const variant<QString, Unit>& unit,
+                 const std::variant<QString, Unit>& unit,
                  const RealLimits& limits = RealLimits::nonnegative(), uint decimals = 3);
     void initMax(const QString& label, const QString& tooltip, double value,
-                 const variant<QString, Unit>& unit,
+                 const std::variant<QString, Unit>& unit,
                  const RealLimits& limits = RealLimits::nonnegative(), uint decimals = 3);
 
     void serialize(Streamer& s);
diff --git a/GUI/Model/Descriptor/DistributionItems.cpp b/GUI/Model/Descriptor/DistributionItems.cpp
index ac63d8104ee..2d016b02e14 100644
--- a/GUI/Model/Descriptor/DistributionItems.cpp
+++ b/GUI/Model/Descriptor/DistributionItems.cpp
@@ -20,6 +20,8 @@
 #include "Param/Distrib/RangedDistributions.h"
 #include <cmath>
 
+using std::variant;
+
 DistributionItem::DistributionItem()
 {
     m_numberOfSamples.init("Number of samples", "", 5, "", RealLimits::lowerLimited(1.0),
diff --git a/GUI/Model/Descriptor/DistributionItems.h b/GUI/Model/Descriptor/DistributionItems.h
index b4399da1ee7..2c6c98d52ae 100644
--- a/GUI/Model/Descriptor/DistributionItems.h
+++ b/GUI/Model/Descriptor/DistributionItems.h
@@ -43,7 +43,7 @@ public:
     RealLimits limits() const;
 
     //! Set the unit of the distributed value
-    virtual void setUnit(const variant<QString, Unit>& unit) = 0;
+    virtual void setUnit(const std::variant<QString, Unit>& unit) = 0;
 
     UINT_PROPERTY(numberOfSamples, NumberOfSamples);
     DOUBLE_PROPERTY(sigmaFactor, SigmaFactor);
@@ -70,7 +70,7 @@ private:
 class SymmetricResolutionItem : public DistributionItem {
 public:
     SymmetricResolutionItem(double mean, int decimals = 3, const QString& meanLabel = "Mean");
-    void setUnit(const variant<QString, Unit>& unit) override;
+    void setUnit(const std::variant<QString, Unit>& unit) override;
     void setLimits(const RealLimits& limits) override;
 
     DOUBLE_PROPERTY(mean, Mean);
@@ -96,7 +96,7 @@ class DistributionGateItem : public DistributionItem {
 public:
     DistributionGateItem();
 
-    void setUnit(const variant<QString, Unit>& unit) override;
+    void setUnit(const std::variant<QString, Unit>& unit) override;
 
     std::unique_ptr<IDistribution1D> createDistribution(double scale = 1.0) const override;
     void initDistribution(double value) override;
@@ -111,7 +111,7 @@ public:
 class DistributionLorentzItem : public SymmetricResolutionItem {
 public:
     DistributionLorentzItem();
-    void setUnit(const variant<QString, Unit>& unit) override;
+    void setUnit(const std::variant<QString, Unit>& unit) override;
 
     std::unique_ptr<IDistribution1D> createDistribution(double scale = 1.0) const override;
     std::unique_ptr<IRangedDistribution> createIRangedDistribution(double scale) const override;
@@ -127,7 +127,7 @@ public:
 class DistributionGaussianItem : public SymmetricResolutionItem {
 public:
     DistributionGaussianItem();
-    void setUnit(const variant<QString, Unit>& unit) override;
+    void setUnit(const std::variant<QString, Unit>& unit) override;
 
     std::unique_ptr<IDistribution1D> createDistribution(double scale = 1.0) const override;
     std::unique_ptr<IRangedDistribution> createIRangedDistribution(double scale) const override;
@@ -143,7 +143,7 @@ public:
 class DistributionLogNormalItem : public DistributionItem {
 public:
     DistributionLogNormalItem();
-    void setUnit(const variant<QString, Unit>& unit) override;
+    void setUnit(const std::variant<QString, Unit>& unit) override;
 
     std::unique_ptr<IDistribution1D> createDistribution(double scale = 1.0) const override;
     void initDistribution(double value) override;
@@ -157,7 +157,7 @@ public:
 class DistributionCosineItem : public SymmetricResolutionItem {
 public:
     DistributionCosineItem();
-    void setUnit(const variant<QString, Unit>& unit) override;
+    void setUnit(const std::variant<QString, Unit>& unit) override;
 
     std::unique_ptr<IDistribution1D> createDistribution(double scale = 1.0) const override;
     std::unique_ptr<IRangedDistribution> createIRangedDistribution(double scale) const override;
@@ -172,7 +172,7 @@ public:
 class DistributionTrapezoidItem : public DistributionItem {
 public:
     DistributionTrapezoidItem();
-    void setUnit(const variant<QString, Unit>& unit) override;
+    void setUnit(const std::variant<QString, Unit>& unit) override;
 
     std::unique_ptr<IDistribution1D> createDistribution(double scale = 1.0) const override;
     void initDistribution(double value) override;
diff --git a/GUI/Model/Descriptor/DoubleDescriptor.cpp b/GUI/Model/Descriptor/DoubleDescriptor.cpp
index 7c519d261bc..0b46d6bbe08 100644
--- a/GUI/Model/Descriptor/DoubleDescriptor.cpp
+++ b/GUI/Model/Descriptor/DoubleDescriptor.cpp
@@ -18,6 +18,9 @@
 #include "GUI/Util/Path.h"
 #include <utility>
 
+using std::function;
+using std::variant;
+
 DoubleDescriptor::DoubleDescriptor(QString label_, QString tooltip_, int decimals_,
                                    const RealLimits& limits_, function<void(double)> setter,
                                    function<double()> getter, const variant<QString, Unit>& unit_)
diff --git a/GUI/Model/Descriptor/DoubleDescriptor.h b/GUI/Model/Descriptor/DoubleDescriptor.h
index b7740b15ce4..4199999f5d2 100644
--- a/GUI/Model/Descriptor/DoubleDescriptor.h
+++ b/GUI/Model/Descriptor/DoubleDescriptor.h
@@ -24,9 +24,6 @@
 
 class SessionItem;
 
-using std::function;
-using std::variant;
-
 //! Describes properties of a double value which are necessary to allow GUI representation, editing
 //! the value, undo/redo, unit conversion.
 //!
@@ -51,35 +48,35 @@ private: // private as long as path initialization is not included in params (to
          // SessionItem migration)
     //! Operates on a double value (e.g a member variable).
     DoubleDescriptor(const QString& label, const QString& tooltip, int decimals,
-                     const RealLimits& limits, double* var, const variant<QString, Unit>& unit);
+                     const RealLimits& limits, double* var, const std::variant<QString, Unit>& unit);
 
     //! Operates on a double value (e.g a member variable).
     //! Decimals is set to 3, limits is set to nonnegative
     DoubleDescriptor(const QString& label, const QString& tooltip, double* var,
-                     const variant<QString, Unit>& unit);
+                     const std::variant<QString, Unit>& unit);
 
 public:
     //! Operates on any kind of storage (e.g. session items), by using setter/getter methods
     //! decimals is set to 3, limits is set to nonnegative
-    DoubleDescriptor(const QString& label, const QString& tooltip, function<void(double)> setter,
-                     function<double()> getter, const variant<QString, Unit>& unit);
+    DoubleDescriptor(const QString& label, const QString& tooltip, std::function<void(double)> setter,
+                     std::function<double()> getter, const std::variant<QString, Unit>& unit);
 
     //! Operates on any kind of storage (e.g. session items), by using setter/getter methods
     DoubleDescriptor(QString label, QString tooltip, int decimals, const RealLimits& limits,
-                     function<void(double)> setter, function<double()> getter,
-                     const variant<QString, Unit>& unit);
+                     std::function<void(double)> setter, std::function<double()> getter,
+                     const std::variant<QString, Unit>& unit);
 
-    DoubleDescriptor(const QString& label, const double* var, const variant<QString, Unit>& unit);
+    DoubleDescriptor(const QString& label, const double* var, const std::variant<QString, Unit>& unit);
 
     //! Operates on a session item. The settings (like decimals, limits) are taken from the session
     //! item.
     //! Only for easier migration. Should be removed after SessionItem refactoring.
-    DoubleDescriptor(const QString& label, SessionItem* item, const variant<QString, Unit>& unit);
+    DoubleDescriptor(const QString& label, SessionItem* item, const std::variant<QString, Unit>& unit);
 
     //! Operates on a session item. The settings (like decimals, limits) are taken from the session
     //! item.
     //! Only for easier migration. Should be removed after SessionItem refactoring.
-    DoubleDescriptor(SessionItem* item, const variant<QString, Unit>& unit);
+    DoubleDescriptor(SessionItem* item, const std::variant<QString, Unit>& unit);
 
     DoubleDescriptor() = default;
 
@@ -93,10 +90,10 @@ public:
     QString tooltip;                      //!< Tooltip text
     int decimals = 0;                     //!< numbers of decimals to be shown in an edit control
     RealLimits limits;                    //!< Limits of the value.
-    function<void(double)> set = nullptr; //!< function to set the value
-    function<double()> get = nullptr;     //!< function to get the current value
-    variant<QString, Unit> unit = Unit::unitless; //!< Unit of the value (internal unit only!)
-    function<QString()> path = nullptr; //!< Path describing  this value. Used e.g. for undo/redo
+    std::function<void(double)> set = nullptr; //!< function to set the value
+    std::function<double()> get = nullptr;     //!< function to get the current value
+    std::variant<QString, Unit> unit = Unit::unitless; //!< Unit of the value (internal unit only!)
+    std::function<QString()> path = nullptr; //!< Path describing  this value. Used e.g. for undo/redo
 };
 
 using DoubleDescriptors = QList<DoubleDescriptor>;
diff --git a/GUI/Model/Descriptor/DoubleProperty.cpp b/GUI/Model/Descriptor/DoubleProperty.cpp
index 928b7083f68..d137b24d858 100644
--- a/GUI/Model/Descriptor/DoubleProperty.cpp
+++ b/GUI/Model/Descriptor/DoubleProperty.cpp
@@ -17,6 +17,8 @@
 #include "GUI/Support/XML/UtilXML.h"
 #include <QUuid>
 
+using std::variant;
+
 void DoubleProperty::init(const QString& label, const QString& tooltip, double value,
                           const variant<QString, Unit>& unit, const QString& persistentTag)
 {
diff --git a/GUI/Model/Descriptor/DoubleProperty.h b/GUI/Model/Descriptor/DoubleProperty.h
index 4f4dce1330d..3581fd838c6 100644
--- a/GUI/Model/Descriptor/DoubleProperty.h
+++ b/GUI/Model/Descriptor/DoubleProperty.h
@@ -44,9 +44,9 @@ class Streamer;
 class DoubleProperty {
 public:
     void init(const QString& label, const QString& tooltip, double value,
-              const variant<QString, Unit>& unit, const QString& persistentTag);
+              const std::variant<QString, Unit>& unit, const QString& persistentTag);
     void init(const QString& label, const QString& tooltip, double value,
-              const variant<QString, Unit>& unit, int decimals, const RealLimits& limits,
+              const std::variant<QString, Unit>& unit, int decimals, const RealLimits& limits,
               const QString& persistentTag);
 
     //! Return a descriptor (information provider) for this double property.
@@ -83,7 +83,7 @@ public:
     void setTooltip(const QString& tooltip);
 
     //! Set the unit
-    void setUnit(const variant<QString, Unit>& unit);
+    void setUnit(const std::variant<QString, Unit>& unit);
 
     //! Set the limits
     void setLimits(const RealLimits& limits);
diff --git a/GUI/Model/Descriptor/VectorDescriptor.h b/GUI/Model/Descriptor/VectorDescriptor.h
index 884fb506b62..f2a2930577f 100644
--- a/GUI/Model/Descriptor/VectorDescriptor.h
+++ b/GUI/Model/Descriptor/VectorDescriptor.h
@@ -33,7 +33,7 @@ public:
     VectorDescriptor() = default;
 
     VectorDescriptor(const QString& label, const QString& tooltip, double* xVar, double* yVar,
-                     double* zVar, const variant<QString, Unit>& unit)
+                     double* zVar, const std::variant<QString, Unit>& unit)
         : label(label)
         , tooltip(tooltip)
         , x("X", xVar, unit)
@@ -52,7 +52,7 @@ public:
     }
 
     VectorDescriptor(const QString& label, const QString& tooltip,
-                     const variant<QString, Unit>& unit)
+                     const std::variant<QString, Unit>& unit)
         : label(label)
         , tooltip(tooltip)
     {
@@ -74,7 +74,7 @@ public:
     }
 
     void init(const QString& _label, const QString& _tooltip, const R3* vec,
-              const variant<QString, Unit>& _unit)
+              const std::variant<QString, Unit>& _unit)
     {
         label = _label;
         tooltip = _tooltip;
@@ -110,7 +110,7 @@ public:
     DoubleDescriptor x;
     DoubleDescriptor y;
     DoubleDescriptor z;
-    function<QString()> uid; //!< unique id describing  this value. Used e.g. for undo/redo
+    std::function<QString()> uid; //!< unique id describing  this value. Used e.g. for undo/redo
 };
 
 #endif // BORNAGAIN_GUI_MODEL_DESCRIPTOR_VECTORDESCRIPTOR_H
diff --git a/GUI/Model/Descriptor/VectorProperty.cpp b/GUI/Model/Descriptor/VectorProperty.cpp
index 58f16b960e4..7aa4aaf0e3d 100644
--- a/GUI/Model/Descriptor/VectorProperty.cpp
+++ b/GUI/Model/Descriptor/VectorProperty.cpp
@@ -17,6 +17,8 @@
 #include "GUI/Support/XML/UtilXML.h"
 #include <QUuid>
 
+using std::variant;
+
 void VectorProperty::init(const QString& label, const QString& tooltip,
                           const variant<QString, Unit>& unit, const QString& persistentTag)
 {
diff --git a/GUI/Model/Descriptor/VectorProperty.h b/GUI/Model/Descriptor/VectorProperty.h
index 3f4c660374e..120ff6747d4 100644
--- a/GUI/Model/Descriptor/VectorProperty.h
+++ b/GUI/Model/Descriptor/VectorProperty.h
@@ -32,7 +32,7 @@ class Streamer;
 //!
 class VectorProperty {
 public:
-    void init(const QString& label, const QString& tooltip, const variant<QString, Unit>& unit,
+    void init(const QString& label, const QString& tooltip, const std::variant<QString, Unit>& unit,
               const QString& persistentTag);
 
     VectorDescriptor descriptor() const { return m_descriptor; }
diff --git a/GUI/Model/Model/ParameterTreeUtils.cpp b/GUI/Model/Model/ParameterTreeUtils.cpp
index da6a72c72c8..29a5849a203 100644
--- a/GUI/Model/Model/ParameterTreeUtils.cpp
+++ b/GUI/Model/Model/ParameterTreeUtils.cpp
@@ -40,6 +40,8 @@
 #include "GUI/Model/Sample/ParticleItem.h"
 #include "GUI/Model/Sample/ParticleLayoutItem.h"
 
+using std::variant;
+
 namespace {
 
 QString labelWithUnit(const QString& label, variant<QString, Unit> unit)
diff --git a/GUI/View/Mask/MaskEditorPropertyPanel.cpp b/GUI/View/Mask/MaskEditorPropertyPanel.cpp
index 2ebc14f93b3..a4a1112c77e 100644
--- a/GUI/View/Mask/MaskEditorPropertyPanel.cpp
+++ b/GUI/View/Mask/MaskEditorPropertyPanel.cpp
@@ -27,6 +27,8 @@
 #include <QLineEdit>
 #include <QListView>
 
+using std::function;
+
 MaskEditorPropertyPanel::MaskEditorPropertyPanel(QWidget* parent)
     : DataAccessWidget(parent)
     , m_listView(new QListView)
diff --git a/GUI/View/Mask/MaskEditorPropertyPanel.h b/GUI/View/Mask/MaskEditorPropertyPanel.h
index 08cbcd34e58..d88c977bc83 100644
--- a/GUI/View/Mask/MaskEditorPropertyPanel.h
+++ b/GUI/View/Mask/MaskEditorPropertyPanel.h
@@ -64,8 +64,8 @@ private:
     void addMaskSpinBox(DoubleDescriptor d);
 
     //! Add a checkbox to edit a mask's boolean value
-    void addMaskCheckBox(const QString& title, function<bool()> getter,
-                         function<void(bool)> setter);
+    void addMaskCheckBox(const QString& title, std::function<bool()> getter,
+                         std::function<void(bool)> setter);
 
     //! Return the mask item for the given index. nullptr if index invalid or not pointing to a mask
     //! item.
diff --git a/GUI/View/SampleDesigner/FormLayouter.cpp b/GUI/View/SampleDesigner/FormLayouter.cpp
index 32875725a36..67ef7bd10d2 100644
--- a/GUI/View/SampleDesigner/FormLayouter.cpp
+++ b/GUI/View/SampleDesigner/FormLayouter.cpp
@@ -25,6 +25,8 @@
 #include <QLabel>
 #include <QPushButton>
 
+using std::function;
+
 namespace {
 
 QWidget* createSpinBox(QWidget* parentWidget, const UIntDescriptor& d, SampleEditorController* ec)
diff --git a/GUI/View/SampleDesigner/FormLayouter.h b/GUI/View/SampleDesigner/FormLayouter.h
index 4061b9c2192..e603ce7447b 100644
--- a/GUI/View/SampleDesigner/FormLayouter.h
+++ b/GUI/View/SampleDesigner/FormLayouter.h
@@ -103,7 +103,7 @@ public:
     //! Same as above, but the called slot in case of a value change has to be overhanded.
     //! Use this only if the standard (calling SampleEditorController::setDouble()) is not
     //! sufficient.
-    int addValue(const DoubleDescriptor& d, function<void(double)> onValueChange);
+    int addValue(const DoubleDescriptor& d, std::function<void(double)> onValueChange);
 
     //! Adds a row with a bold printed label and a QSpinBox.
     //!
@@ -120,7 +120,7 @@ public:
     //! Inserts a row with a bold printed label and a DoubleSpinBox.
     //!
     //! Same functionality as addValue(), please read there.
-    void insertValue(int row, const DoubleDescriptor& d, function<void(double)> onValueChange);
+    void insertValue(int row, const DoubleDescriptor& d, std::function<void(double)> onValueChange);
 
     //! Adds a row with a bold printed label and a set of DoubleDescriptors.
     //!
diff --git a/GUI/View/SampleDesigner/LayerEditorUtils.cpp b/GUI/View/SampleDesigner/LayerEditorUtils.cpp
index 4bacabe3aee..4eea3d89d99 100644
--- a/GUI/View/SampleDesigner/LayerEditorUtils.cpp
+++ b/GUI/View/SampleDesigner/LayerEditorUtils.cpp
@@ -32,6 +32,8 @@
 #include <QMenu>
 #include <QPushButton>
 
+using std::function;
+
 namespace {
 
 void updateLabelUnit(QLabel* label, const QString& unit)
diff --git a/GUI/View/SampleDesigner/LayerEditorUtils.h b/GUI/View/SampleDesigner/LayerEditorUtils.h
index 5e7f21225fd..8e00e1276bc 100644
--- a/GUI/View/SampleDesigner/LayerEditorUtils.h
+++ b/GUI/View/SampleDesigner/LayerEditorUtils.h
@@ -53,7 +53,7 @@ void addMultiPropertyToGrid(QGridLayout* m_gridLayout, int firstCol,
 //! Create DoubleSpinBoxes for the DoubeDescriptors and connect them to the given setNewValue()
 void addMultiPropertyToGrid(QGridLayout* m_gridLayout, int firstCol,
                             const DoubleDescriptors& valueDescriptors,
-                            function<void(double, DoubleDescriptor)> setNewValue, bool vertically,
+                            std::function<void(double, DoubleDescriptor)> setNewValue, bool vertically,
                             bool addSpacer);
 
 void addMultiPropertyToGrid(QGridLayout* m_gridLayout, int firstCol,
@@ -67,7 +67,7 @@ void addVectorToGrid(QGridLayout* m_gridLayout, int firstCol, const VectorDescri
 
 //! Create DoubleSpinBoxes for the DoubeDescriptors and connect them to the given setNewValue()
 void addVectorToGrid(QGridLayout* m_gridLayout, int firstCol, const VectorDescriptor& v,
-                     function<void(double, DoubleDescriptor)> setNewValue, bool vertically,
+                     std::function<void(double, DoubleDescriptor)> setNewValue, bool vertically,
                      bool addSpacer);
 
 
diff --git a/GUI/View/SampleDesigner/SelectionContainerForm.h b/GUI/View/SampleDesigner/SelectionContainerForm.h
index 37159d92230..482c36dd271 100644
--- a/GUI/View/SampleDesigner/SelectionContainerForm.h
+++ b/GUI/View/SampleDesigner/SelectionContainerForm.h
@@ -121,7 +121,7 @@ public:
     }
 
 private:
-    function<DoubleDescriptors()> currentValues = nullptr;
+    std::function<DoubleDescriptors()> currentValues = nullptr;
 };
 
 #endif // BORNAGAIN_GUI_VIEW_SAMPLEDESIGNER_SELECTIONCONTAINERFORM_H
diff --git a/GUI/View/Tool/WidgetUtils.cpp b/GUI/View/Tool/WidgetUtils.cpp
index 87081b2c1c0..6f4533b9594 100644
--- a/GUI/View/Tool/WidgetUtils.cpp
+++ b/GUI/View/Tool/WidgetUtils.cpp
@@ -24,9 +24,12 @@
 #include <QLineEdit>
 #include <QSpinBox>
 
+using std::function;
+using std::variant;
+
 SafeSpinBox* GUI::Util::createSpinBox(const UIntDescriptor& d,
                                       QList<function<void()>>* updaters,
-                                      std::function<void(uint)> slot,
+                                      function<void(uint)> slot,
                                       bool easyScrollable)
 {
     auto* spinBox = new SafeSpinBox(easyScrollable);
@@ -57,8 +60,8 @@ SafeSpinBox* GUI::Util::createSpinBox(const UIntDescriptor& d,
 }
 
 SafeSpinBox* GUI::Util::createSpinBoxScroll(const UIntDescriptor& d,
-                                            QList<std::function<void()>>* updaters,
-                                            std::function<void(uint)> slot)
+                                            QList<function<void()>>* updaters,
+                                            function<void(uint)> slot)
 {
     return GUI::Util::createSpinBox(d, updaters, slot, true);
 }
@@ -73,7 +76,7 @@ SafeSpinBox* GUI::Util::createSpinBoxRow(QFormLayout* parentLayout,
 
 DoubleSpinBox* GUI::Util::createDoubleSpinBoxRow(QFormLayout* parentLayout,
                                                  const DoubleDescriptor& d,
-                                                 std::function<void(double)> slot)
+                                                 function<void(double)> slot)
 {
     auto* sb = new DoubleSpinBox(d);
     parentLayout->addRow(labelWithUnit(d.label, d.unit) + ":", sb);
@@ -102,7 +105,7 @@ QString GUI::Util::labelWithUnit(const DoubleDescriptor& d)
 
 ScientificSpinBox* GUI::Util::createScientificSpinBox(QFormLayout* parentLayout,
                                                       const DoubleDescriptor& d,
-                                                      std::function<void(double)> slot)
+                                                      function<void(double)> slot)
 {
     auto* spinBox = new ScientificSpinBox(parentLayout->parentWidget());
     spinBox->setFocusPolicy(Qt::StrongFocus);
@@ -119,9 +122,9 @@ ScientificSpinBox* GUI::Util::createScientificSpinBox(QFormLayout* parentLayout,
 }
 
 QCheckBox* GUI::Util::createCheckBox(const QString& title,
-                                     std::function<bool()> getter,
-                                     std::function<void(bool)> setter,
-                                     QList<std::function<void()>>* updaters)
+                                     function<bool()> getter,
+                                     function<void(bool)> setter,
+                                     QList<function<void()>>* updaters)
 {
     QCheckBox* checkBox = new QCheckBox(title);
     checkBox->setChecked(getter());
@@ -137,9 +140,9 @@ QCheckBox* GUI::Util::createCheckBox(const QString& title,
     return checkBox;
 }
 
-QLineEdit* GUI::Util::createTextEdit(std::function<QString()> getter,
-                                     std::function<void(QString)> setter,
-                                     QList<std::function<void()>>* updaters)
+QLineEdit* GUI::Util::createTextEdit(function<QString()> getter,
+                                     function<void(QString)> setter,
+                                     QList<function<void()>>* updaters)
 {
     QLineEdit* edit = new QLineEdit;
     edit->setText(getter());
@@ -156,8 +159,8 @@ QLineEdit* GUI::Util::createTextEdit(std::function<QString()> getter,
 }
 
 DoubleSpinBox* GUI::Util::createDoubleSpinbox(DoubleDescriptor d,
-                                              QList<std::function<void()>>* updaters,
-                                              std::function<void(double)> slot,
+                                              QList<function<void()>>* updaters,
+                                              function<void(double)> slot,
                                               bool easyScrollable)
 {
     DoubleSpinBox* spinBox = new DoubleSpinBox(d, easyScrollable);
@@ -177,8 +180,8 @@ DoubleSpinBox* GUI::Util::createDoubleSpinbox(DoubleDescriptor d,
 }
 
 DoubleSpinBox* GUI::Util::createDoubleSpinboxScroll(DoubleDescriptor d,
-                                                    QList<std::function<void()>>* updaters,
-                                                    std::function<void(double)> slot)
+                                                    QList<function<void()>>* updaters,
+                                                    function<void(double)> slot)
 {
     return GUI::Util::createDoubleSpinbox(d, updaters, slot, true);
 }
-- 
GitLab


From 89991b8cd48089ca7e4c6b29f7d4723a690a06c8 Mon Sep 17 00:00:00 2001
From: Mikhail Svechnikov <m.svechnikov@fz-juelich.de>
Date: Fri, 29 Jul 2022 16:03:27 +0200
Subject: [PATCH 32/32] clang-format

---
 GUI/Model/Descriptor/AxisProperty.h        |  5 +++-
 GUI/Model/Descriptor/DoubleDescriptor.h    | 29 +++++++++++++---------
 GUI/Model/Descriptor/DoubleProperty.h      | 10 ++++++--
 GUI/Model/Descriptor/SelectionDescriptor.h |  6 ++---
 GUI/Model/Descriptor/UIntDescriptor.cpp    |  2 +-
 GUI/Model/Descriptor/UIntDescriptor.h      | 12 +++++----
 GUI/Model/Descriptor/UIntProperty.h        | 20 ++++++++++++---
 GUI/Model/Descriptor/VectorProperty.h      | 10 ++++++--
 GUI/View/SampleDesigner/LayerEditorUtils.h |  4 +--
 9 files changed, 66 insertions(+), 32 deletions(-)

diff --git a/GUI/Model/Descriptor/AxisProperty.h b/GUI/Model/Descriptor/AxisProperty.h
index d69bc2b21b0..6ace7b48b1f 100644
--- a/GUI/Model/Descriptor/AxisProperty.h
+++ b/GUI/Model/Descriptor/AxisProperty.h
@@ -65,6 +65,9 @@ protected:
     AxisProperty m_##nameLower;                                                                    \
                                                                                                    \
 public:                                                                                            \
-    AxisProperty& nameLower() const { return *const_cast<AxisProperty*>(&m_##nameLower); }
+    AxisProperty& nameLower() const                                                                \
+    {                                                                                              \
+        return *const_cast<AxisProperty*>(&m_##nameLower);                                         \
+    }
 
 #endif // BORNAGAIN_GUI_MODEL_DESCRIPTOR_AXISPROPERTY_H
diff --git a/GUI/Model/Descriptor/DoubleDescriptor.h b/GUI/Model/Descriptor/DoubleDescriptor.h
index 4199999f5d2..b4a544596fa 100644
--- a/GUI/Model/Descriptor/DoubleDescriptor.h
+++ b/GUI/Model/Descriptor/DoubleDescriptor.h
@@ -48,7 +48,8 @@ private: // private as long as path initialization is not included in params (to
          // SessionItem migration)
     //! Operates on a double value (e.g a member variable).
     DoubleDescriptor(const QString& label, const QString& tooltip, int decimals,
-                     const RealLimits& limits, double* var, const std::variant<QString, Unit>& unit);
+                     const RealLimits& limits, double* var,
+                     const std::variant<QString, Unit>& unit);
 
     //! Operates on a double value (e.g a member variable).
     //! Decimals is set to 3, limits is set to nonnegative
@@ -58,20 +59,23 @@ private: // private as long as path initialization is not included in params (to
 public:
     //! Operates on any kind of storage (e.g. session items), by using setter/getter methods
     //! decimals is set to 3, limits is set to nonnegative
-    DoubleDescriptor(const QString& label, const QString& tooltip, std::function<void(double)> setter,
-                     std::function<double()> getter, const std::variant<QString, Unit>& unit);
+    DoubleDescriptor(const QString& label, const QString& tooltip,
+                     std::function<void(double)> setter, std::function<double()> getter,
+                     const std::variant<QString, Unit>& unit);
 
     //! Operates on any kind of storage (e.g. session items), by using setter/getter methods
     DoubleDescriptor(QString label, QString tooltip, int decimals, const RealLimits& limits,
                      std::function<void(double)> setter, std::function<double()> getter,
                      const std::variant<QString, Unit>& unit);
 
-    DoubleDescriptor(const QString& label, const double* var, const std::variant<QString, Unit>& unit);
+    DoubleDescriptor(const QString& label, const double* var,
+                     const std::variant<QString, Unit>& unit);
 
     //! Operates on a session item. The settings (like decimals, limits) are taken from the session
     //! item.
     //! Only for easier migration. Should be removed after SessionItem refactoring.
-    DoubleDescriptor(const QString& label, SessionItem* item, const std::variant<QString, Unit>& unit);
+    DoubleDescriptor(const QString& label, SessionItem* item,
+                     const std::variant<QString, Unit>& unit);
 
     //! Operates on a session item. The settings (like decimals, limits) are taken from the session
     //! item.
@@ -86,14 +90,15 @@ public:
     //! Return the current value of the handled parameter.
     operator double() const;
 
-    QString label;                        //!< A label text (short, no trailing colon)
-    QString tooltip;                      //!< Tooltip text
-    int decimals = 0;                     //!< numbers of decimals to be shown in an edit control
-    RealLimits limits;                    //!< Limits of the value.
-    std::function<void(double)> set = nullptr; //!< function to set the value
-    std::function<double()> get = nullptr;     //!< function to get the current value
+    QString label;     //!< A label text (short, no trailing colon)
+    QString tooltip;   //!< Tooltip text
+    int decimals = 0;  //!< numbers of decimals to be shown in an edit control
+    RealLimits limits; //!< Limits of the value.
+    std::function<void(double)> set = nullptr;         //!< function to set the value
+    std::function<double()> get = nullptr;             //!< function to get the current value
     std::variant<QString, Unit> unit = Unit::unitless; //!< Unit of the value (internal unit only!)
-    std::function<QString()> path = nullptr; //!< Path describing  this value. Used e.g. for undo/redo
+    std::function<QString()> path =
+        nullptr; //!< Path describing this value. Used e.g. for undo/redo
 };
 
 using DoubleDescriptors = QList<DoubleDescriptor>;
diff --git a/GUI/Model/Descriptor/DoubleProperty.h b/GUI/Model/Descriptor/DoubleProperty.h
index 3581fd838c6..472a98ddc2f 100644
--- a/GUI/Model/Descriptor/DoubleProperty.h
+++ b/GUI/Model/Descriptor/DoubleProperty.h
@@ -109,8 +109,14 @@ protected:
     DoubleProperty m_##nameLower;                                                                  \
                                                                                                    \
 public:                                                                                            \
-    DoubleDescriptor nameLower() const { return m_##nameLower; }                                   \
-    void set##nameUpper(double v) { m_##nameLower.set(v); }
+    DoubleDescriptor nameLower() const                                                             \
+    {                                                                                              \
+        return m_##nameLower;                                                                      \
+    }                                                                                              \
+    void set##nameUpper(double v)                                                                  \
+    {                                                                                              \
+        m_##nameLower.set(v);                                                                      \
+    }
 
 
 #endif // BORNAGAIN_GUI_MODEL_DESCRIPTOR_DOUBLEPROPERTY_H
diff --git a/GUI/Model/Descriptor/SelectionDescriptor.h b/GUI/Model/Descriptor/SelectionDescriptor.h
index 1cd99633fd2..a89a9abd222 100644
--- a/GUI/Model/Descriptor/SelectionDescriptor.h
+++ b/GUI/Model/Descriptor/SelectionDescriptor.h
@@ -103,9 +103,9 @@ public:
 
     int currentIndex() const override { return currentIndexGetter(); }
 
-    QString label;                          //!< A label text (short, no trailing colon)
-    QString tooltip;                        //!< Tooltip text
-    QStringList options;                    //!< List of options, usually presented as combo entries
+    QString label;       //!< A label text (short, no trailing colon)
+    QString tooltip;     //!< Tooltip text
+    QStringList options; //!< List of options, usually presented as combo entries
     std::function<void(int)> currentIndexSetter; //!< Function to set currently selected option
     std::function<int()> currentIndexGetter;     //!< Function to get currently selected option
     std::function<T()> currentItem;              //!< Function to get currently selected item
diff --git a/GUI/Model/Descriptor/UIntDescriptor.cpp b/GUI/Model/Descriptor/UIntDescriptor.cpp
index 688c083afd7..8e402d1dbe9 100644
--- a/GUI/Model/Descriptor/UIntDescriptor.cpp
+++ b/GUI/Model/Descriptor/UIntDescriptor.cpp
@@ -28,7 +28,7 @@ UIntDescriptor::UIntDescriptor(const QString& label, SessionItem* item,
 {
 }
 
-UIntDescriptor::UIntDescriptor(SessionItem* item, const variant<QString, Unit> &unit)
+UIntDescriptor::UIntDescriptor(SessionItem* item, const variant<QString, Unit>& unit)
     : UIntDescriptor(item->displayName(), item, unit)
 {
 }
diff --git a/GUI/Model/Descriptor/UIntDescriptor.h b/GUI/Model/Descriptor/UIntDescriptor.h
index 91480877693..19c0d3e2a55 100644
--- a/GUI/Model/Descriptor/UIntDescriptor.h
+++ b/GUI/Model/Descriptor/UIntDescriptor.h
@@ -40,7 +40,8 @@ public:
     //! Operates on a session item. The settings (like limits) are taken from the session
     //! item.
     //! Only for easier migration. Should be removed after SessionItem refactoring.
-    UIntDescriptor(const QString& label, SessionItem* item, const std::variant<QString, Unit>& unit);
+    UIntDescriptor(const QString& label, SessionItem* item,
+                   const std::variant<QString, Unit>& unit);
 
     UIntDescriptor(const QString& label, const uint* var, const std::variant<QString, Unit>& unit);
 
@@ -59,13 +60,14 @@ public:
     //! Return the current value of the handled parameter.
     operator uint() const;
 
-    QString label;                                //!< A label text (short, no trailing colon)
-    QString tooltip;                              //!< Tooltip text
-    RealLimits limits;                            //!< Limits of the value.
+    QString label;                                     //!< A label text (short, no trailing colon)
+    QString tooltip;                                   //!< Tooltip text
+    RealLimits limits;                                 //!< Limits of the value.
     std::function<void(uint)> set = nullptr;           //!< function to set the value
     std::function<uint()> get = nullptr;               //!< function to get the current value
     std::variant<QString, Unit> unit = Unit::unitless; //!< Unit of the value (internal unit only!)
-    std::function<QString()> path = nullptr; //!< Path describing  this value. Used e.g. for undo/redo
+    std::function<QString()> path =
+        nullptr; //!< Path describing  this value. Used e.g. for undo/redo
 };
 
 #endif // BORNAGAIN_GUI_MODEL_DESCRIPTOR_UINTDESCRIPTOR_H
diff --git a/GUI/Model/Descriptor/UIntProperty.h b/GUI/Model/Descriptor/UIntProperty.h
index 924c4329556..81487b605c4 100644
--- a/GUI/Model/Descriptor/UIntProperty.h
+++ b/GUI/Model/Descriptor/UIntProperty.h
@@ -66,10 +66,22 @@ private:
     UIntProperty m_##nameLower;                                                                    \
                                                                                                    \
 public:                                                                                            \
-    UIntDescriptor nameLower() const { return m_##nameLower; }                                     \
-    void set##nameUpper(int v) { m_##nameLower.set(v); }                                           \
-    void set##nameUpper(uint v) { m_##nameLower.set(v); }                                          \
-    void set##nameUpper(size_t v) { m_##nameLower.set((int)v); }
+    UIntDescriptor nameLower() const                                                               \
+    {                                                                                              \
+        return m_##nameLower;                                                                      \
+    }                                                                                              \
+    void set##nameUpper(int v)                                                                     \
+    {                                                                                              \
+        m_##nameLower.set(v);                                                                      \
+    }                                                                                              \
+    void set##nameUpper(uint v)                                                                    \
+    {                                                                                              \
+        m_##nameLower.set(v);                                                                      \
+    }                                                                                              \
+    void set##nameUpper(size_t v)                                                                  \
+    {                                                                                              \
+        m_##nameLower.set((int)v);                                                                 \
+    }
 
 
 #endif // BORNAGAIN_GUI_MODEL_DESCRIPTOR_UINTPROPERTY_H
diff --git a/GUI/Model/Descriptor/VectorProperty.h b/GUI/Model/Descriptor/VectorProperty.h
index 120ff6747d4..4670f2ce2fc 100644
--- a/GUI/Model/Descriptor/VectorProperty.h
+++ b/GUI/Model/Descriptor/VectorProperty.h
@@ -65,8 +65,14 @@ protected:
     VectorProperty m_##nameLower;                                                                  \
                                                                                                    \
 public:                                                                                            \
-    VectorDescriptor nameLower() const { return m_##nameLower; }                                   \
-    void set##nameUpper(const R3& v) { m_##nameLower.set(v); }
+    VectorDescriptor nameLower() const                                                             \
+    {                                                                                              \
+        return m_##nameLower;                                                                      \
+    }                                                                                              \
+    void set##nameUpper(const R3& v)                                                               \
+    {                                                                                              \
+        m_##nameLower.set(v);                                                                      \
+    }
 ;
 
 
diff --git a/GUI/View/SampleDesigner/LayerEditorUtils.h b/GUI/View/SampleDesigner/LayerEditorUtils.h
index 8e00e1276bc..18c04e26892 100644
--- a/GUI/View/SampleDesigner/LayerEditorUtils.h
+++ b/GUI/View/SampleDesigner/LayerEditorUtils.h
@@ -53,8 +53,8 @@ void addMultiPropertyToGrid(QGridLayout* m_gridLayout, int firstCol,
 //! Create DoubleSpinBoxes for the DoubeDescriptors and connect them to the given setNewValue()
 void addMultiPropertyToGrid(QGridLayout* m_gridLayout, int firstCol,
                             const DoubleDescriptors& valueDescriptors,
-                            std::function<void(double, DoubleDescriptor)> setNewValue, bool vertically,
-                            bool addSpacer);
+                            std::function<void(double, DoubleDescriptor)> setNewValue,
+                            bool vertically, bool addSpacer);
 
 void addMultiPropertyToGrid(QGridLayout* m_gridLayout, int firstCol,
                             const DoubleDescriptors& valueDescriptors, SampleEditorController* ec,
-- 
GitLab