From 9b2834818decfa91cf43e01e762fc4e39d353d6e Mon Sep 17 00:00:00 2001
From: Mikhail Svechnikov <m.svechnikov@fz-juelich.de>
Date: Wed, 25 Jan 2023 15:19:51 +0100
Subject: [PATCH] JOBS: remember z-lock and slider range

---
 GUI/Model/Job/JobItem.cpp                  | 41 +++++------------
 GUI/Model/Job/JobItem.h                    | 16 ++++---
 GUI/View/Fit/ParameterTuningDelegate.cpp   |  4 +-
 GUI/View/Fit/ParameterTuningDelegate.h     |  2 +-
 GUI/View/Fit/ParameterTuningWidget.cpp     |  3 +-
 GUI/View/Fit/ParameterTuningWidget.h       |  2 +-
 GUI/View/Fit/SliderSettingsWidget.cpp      | 53 ++++++++++++++++++----
 GUI/View/Fit/SliderSettingsWidget.h        | 18 +++++---
 GUI/View/Instrument/InstrumentListView.cpp |  2 +-
 GUI/View/SampleDesigner/SampleListView.cpp |  2 +-
 10 files changed, 84 insertions(+), 59 deletions(-)

diff --git a/GUI/Model/Job/JobItem.cpp b/GUI/Model/Job/JobItem.cpp
index 900655dcb9b..b6f7c31c6f5 100644
--- a/GUI/Model/Job/JobItem.cpp
+++ b/GUI/Model/Job/JobItem.cpp
@@ -48,6 +48,7 @@ const QString Name("Name");
 const QString Identifier("Id");
 const QString Comments("Comments");
 const QString PresentationType("PresentationType");
+const QString SliderRange("SliderRange");
 const QString Activity("Activity");
 const QString Duration("Duration");
 const QString BeginTime("Begin");
@@ -72,16 +73,6 @@ JobItem::JobItem()
 
 JobItem::~JobItem() = default;
 
-QString JobItem::identifier() const
-{
-    return m_identifier;
-}
-
-void JobItem::setIdentifier(const QString& identifier)
-{
-    m_identifier = identifier;
-}
-
 QString JobItem::jobName() const
 {
     return m_name;
@@ -210,26 +201,6 @@ bool JobItem::runInBackground() const
     return simulationOptionsItem().runInBackground();
 }
 
-QString JobItem::presentationType() const
-{
-    return m_presentationType;
-}
-
-void JobItem::setPresentationType(const QString& type)
-{
-    m_presentationType = type;
-}
-
-QString JobItem::activity() const
-{
-    return m_activity;
-}
-
-void JobItem::setActivity(const QString& activity)
-{
-    m_activity = activity;
-}
-
 bool JobItem::isSpecularJob() const
 {
     return instrumentItem()->is<SpecularInstrumentItem>();
@@ -482,6 +453,11 @@ void JobItem::writeTo(QXmlStreamWriter* w, const QString& projectDir) const
     XML::writeAttribute(w, XML::Attrib::value, m_presentationType);
     w->writeEndElement();
 
+    // slider range
+    w->writeStartElement(Tag::SliderRange);
+    XML::writeAttribute(w, XML::Attrib::value, m_sliderRange);
+    w->writeEndElement();
+
     // begin time
     w->writeStartElement(Tag::BeginTime);
     XML::writeAttribute(w, XML::Attrib::value, m_beginTime.toString(Qt::ISODateWithMs));
@@ -575,6 +551,11 @@ void JobItem::readFrom(QXmlStreamReader* r, const QString& projectDir,
             XML::readAttribute(r, XML::Attrib::value, &m_presentationType);
             XML::gotoEndElementOfTag(r, tag);
 
+            // slider range
+        } else if (tag == Tag::SliderRange) {
+            XML::readAttribute(r, XML::Attrib::value, &m_sliderRange);
+            XML::gotoEndElementOfTag(r, tag);
+
             // comments
         } else if (tag == Tag::Comments) {
             XML::readAttribute(r, XML::Attrib::value, &m_comments);
diff --git a/GUI/Model/Job/JobItem.h b/GUI/Model/Job/JobItem.h
index 7955206cebd..6f14787b288 100644
--- a/GUI/Model/Job/JobItem.h
+++ b/GUI/Model/Job/JobItem.h
@@ -46,8 +46,8 @@ public:
 
     // job properties
 
-    QString identifier() const;
-    void setIdentifier(const QString& identifier);
+    QString identifier() const { return m_identifier; }
+    void setIdentifier(const QString& identifier) { m_identifier = identifier; }
 
     QString jobName() const;
     void setJobName(const QString& name);
@@ -81,11 +81,14 @@ public:
     bool runImmediately() const;
     bool runInBackground() const;
 
-    QString presentationType() const;
-    void setPresentationType(const QString& type);
+    QString presentationType() const { return m_presentationType; }
+    void setPresentationType(const QString& type) { m_presentationType = type; }
 
-    QString activity() const;
-    void setActivity(const QString& activity);
+    QString activity() const { return m_activity; }
+    void setActivity(const QString& activity) { m_activity = activity; }
+
+    int sliderRange() const { return m_sliderRange; }
+    void setSliderRange(int range) { m_sliderRange = range; }
 
     bool isSpecularJob() const;
     bool isIntensityJob() const;
@@ -159,6 +162,7 @@ private:
     QString m_comments;
     QString m_activity;
     QString m_presentationType;
+    int m_sliderRange = 100;
     QDateTime m_beginTime;
     QDateTime m_endTime;
     int m_progress;
diff --git a/GUI/View/Fit/ParameterTuningDelegate.cpp b/GUI/View/Fit/ParameterTuningDelegate.cpp
index 9e0f640642f..56d7d295460 100644
--- a/GUI/View/Fit/ParameterTuningDelegate.cpp
+++ b/GUI/View/Fit/ParameterTuningDelegate.cpp
@@ -253,9 +253,9 @@ void ParameterTuningDelegate::emitSignals(double value)
     gProjectDocument.value()->setModified();
 }
 
-void ParameterTuningDelegate::setSliderRangeFactor(double value)
+void ParameterTuningDelegate::setSliderRangeFactor(int value)
 {
-    m_tuning_info.setRangeFactor(value);
+    m_tuning_info.setRangeFactor(double(value));
 }
 
 void ParameterTuningDelegate::setReadOnly(bool isReadOnly)
diff --git a/GUI/View/Fit/ParameterTuningDelegate.h b/GUI/View/Fit/ParameterTuningDelegate.h
index 5f75ecaaf1c..9a4b66a70fb 100644
--- a/GUI/View/Fit/ParameterTuningDelegate.h
+++ b/GUI/View/Fit/ParameterTuningDelegate.h
@@ -59,7 +59,7 @@ public:
     void setEditorData(QWidget* editor, const QModelIndex& index) const override;
     void setModelData(QWidget* editor, QAbstractItemModel* model,
                       const QModelIndex& index) const override;
-    void setSliderRangeFactor(double value);
+    void setSliderRangeFactor(int value);
 
     void setValueColumn(int valueColumn) { m_valueColumn = valueColumn; }
 
diff --git a/GUI/View/Fit/ParameterTuningWidget.cpp b/GUI/View/Fit/ParameterTuningWidget.cpp
index ef46aa5027e..e5f6867659a 100644
--- a/GUI/View/Fit/ParameterTuningWidget.cpp
+++ b/GUI/View/Fit/ParameterTuningWidget.cpp
@@ -73,6 +73,7 @@ ParameterTuningWidget::ParameterTuningWidget(QWidget* parent)
 void ParameterTuningWidget::setJobOrRealItem(JobRealBase* job_item)
 {
     DataAccessWidget::setJobOrRealItem(job_item);
+    m_sliderSettingsWidget->setJobOrRealItem(job_item);
     m_jobModel = dynamic_cast<JobModel*>(jobItem()->model());
 
     updateParameterModel();
@@ -113,7 +114,7 @@ void ParameterTuningWidget::onCurrentLinkChanged(ParameterItem* item)
         m_jobModel->runJob(jobItem());
 }
 
-void ParameterTuningWidget::onSliderRangeChanged(double value)
+void ParameterTuningWidget::onSliderRangeChanged(int value)
 {
     m_delegate->setSliderRangeFactor(value);
 }
diff --git a/GUI/View/Fit/ParameterTuningWidget.h b/GUI/View/Fit/ParameterTuningWidget.h
index 826d3f25d5a..3e8a08899d0 100644
--- a/GUI/View/Fit/ParameterTuningWidget.h
+++ b/GUI/View/Fit/ParameterTuningWidget.h
@@ -45,7 +45,7 @@ signals:
 
 public slots:
     void onCurrentLinkChanged(ParameterItem* item);
-    void onSliderRangeChanged(double value);
+    void onSliderRangeChanged(int value);
     void onLockZValueChanged(bool value);
     void restoreModelsOfCurrentJobItem();
     void makeSelected(ParameterItem* item);
diff --git a/GUI/View/Fit/SliderSettingsWidget.cpp b/GUI/View/Fit/SliderSettingsWidget.cpp
index 90214b63194..f7e43da2d42 100644
--- a/GUI/View/Fit/SliderSettingsWidget.cpp
+++ b/GUI/View/Fit/SliderSettingsWidget.cpp
@@ -12,18 +12,16 @@
 //
 //  ************************************************************************************************
 
-#include "GUI/View/Fit/SliderSettingsWidget.h"
+#include "GUI/Model/Data/IntensityDataItem.h"
 #include "GUI/Model/Project/ProjectDocument.h"
-#include <QCheckBox>
+#include "GUI/View/Fit/SliderSettingsWidget.h"
 #include <QGroupBox>
 #include <QHBoxLayout>
 #include <QLabel>
-#include <QRadioButton>
 #include <QVBoxLayout>
 
 SliderSettingsWidget::SliderSettingsWidget(QWidget* parent)
-    : QWidget(parent)
-    , m_currentSliderRange(100.0)
+    : DataAccessWidget(parent)
     , m_radio1(nullptr)
     , m_radio2(nullptr)
     , m_radio3(nullptr)
@@ -70,16 +68,27 @@ SliderSettingsWidget::SliderSettingsWidget(QWidget* parent)
     setLayout(hbox);
 }
 
+void SliderSettingsWidget::setJobOrRealItem(JobRealBase* job_item)
+{
+    DataAccessWidget::setJobOrRealItem(job_item);
+
+    initSlider();
+    initZlock();
+}
+
 void SliderSettingsWidget::rangeChanged()
 {
+    if (!jobItem())
+        return;
+
     if (m_radio1->isChecked())
-        m_currentSliderRange = 10.0;
+        jobItem()->setSliderRange(10);
     else if (m_radio2->isChecked())
-        m_currentSliderRange = 100.0;
+        jobItem()->setSliderRange(100);
     else if (m_radio3->isChecked())
-        m_currentSliderRange = 1000.0;
+        jobItem()->setSliderRange(1000);
 
-    emit sliderRangeFactorChanged(m_currentSliderRange);
+    emit sliderRangeFactorChanged(jobItem()->sliderRange());
     gProjectDocument.value()->setModified();
 }
 
@@ -91,3 +100,29 @@ void SliderSettingsWidget::onLockZChanged(int state)
         emit lockzChanged(true);
     gProjectDocument.value()->setModified();
 }
+
+void SliderSettingsWidget::initSlider()
+{
+    if (!jobItem())
+        return;
+
+    if (jobItem()->sliderRange() == 10)
+        m_radio1->setChecked(true);
+    else if (jobItem()->sliderRange() == 1000)
+        m_radio3->setChecked(true);
+    else {
+        if(jobItem()->sliderRange() != 100)
+            jobItem()->setSliderRange(100);
+        m_radio2->setChecked(true);
+    }
+    emit sliderRangeFactorChanged(jobItem()->sliderRange());
+}
+
+void SliderSettingsWidget::initZlock()
+{
+    if (!jobItem())
+        return;
+
+    if (auto* intensityItem = jobItem()->intensityDataItem())
+        m_lockzCheckBox->setChecked(intensityItem->isZaxisLocked());
+}
diff --git a/GUI/View/Fit/SliderSettingsWidget.h b/GUI/View/Fit/SliderSettingsWidget.h
index 70bbb2d4cbf..6d35b2d1fb4 100644
--- a/GUI/View/Fit/SliderSettingsWidget.h
+++ b/GUI/View/Fit/SliderSettingsWidget.h
@@ -15,19 +15,20 @@
 #ifndef BORNAGAIN_GUI_VIEW_FIT_SLIDERSETTINGSWIDGET_H
 #define BORNAGAIN_GUI_VIEW_FIT_SLIDERSETTINGSWIDGET_H
 
-#include <QWidget>
+#include "GUI/View/Common/DataAccessWidget.h"
+#include <QCheckBox>
+#include <QRadioButton>
 
-class QRadioButton;
-class QCheckBox;
-
-class SliderSettingsWidget : public QWidget {
+class SliderSettingsWidget : public DataAccessWidget {
     Q_OBJECT
 
 public:
     SliderSettingsWidget(QWidget* parent = nullptr);
 
+    void setJobOrRealItem(JobRealBase* job_item) override;
+
 signals:
-    void sliderRangeFactorChanged(double value);
+    void sliderRangeFactorChanged(int value);
     void lockzChanged(bool value);
 
 private slots:
@@ -35,7 +36,10 @@ private slots:
     void onLockZChanged(int state);
 
 private:
-    double m_currentSliderRange;
+    void initSlider();
+    void initZlock();
+
+private:
     QRadioButton* m_radio1;
     QRadioButton* m_radio2;
     QRadioButton* m_radio3;
diff --git a/GUI/View/Instrument/InstrumentListView.cpp b/GUI/View/Instrument/InstrumentListView.cpp
index 85a9c67fde7..f1d3b7f9e41 100644
--- a/GUI/View/Instrument/InstrumentListView.cpp
+++ b/GUI/View/Instrument/InstrumentListView.cpp
@@ -284,7 +284,7 @@ void InstrumentListView::ensureItemSelected()
 void InstrumentListView::restoreSelection()
 {
     int lastUsed = m_document->instrumentModel()->selectedIndex();
-    if (lastUsed >=0 && lastUsed < m_model->rowCount()) {
+    if (lastUsed >= 0 && lastUsed < m_model->rowCount()) {
         QModelIndex lastUsedIndex = m_model->index(lastUsed, 0, QModelIndex());
         m_listView->selectionModel()->select(lastUsedIndex, QItemSelectionModel::ClearAndSelect);
     } else
diff --git a/GUI/View/SampleDesigner/SampleListView.cpp b/GUI/View/SampleDesigner/SampleListView.cpp
index 9dbb429fa86..22a9c6c4f60 100644
--- a/GUI/View/SampleDesigner/SampleListView.cpp
+++ b/GUI/View/SampleDesigner/SampleListView.cpp
@@ -215,7 +215,7 @@ void SampleListView::onCurrentChanged(const QModelIndex& index)
 void SampleListView::restoreSelection()
 {
     int lastUsed = m_document->sampleModel()->selectedIndex();
-    if (lastUsed >=0 && lastUsed < m_model->rowCount()) {
+    if (lastUsed >= 0 && lastUsed < m_model->rowCount()) {
         QModelIndex lastUsedIndex = m_model->index(lastUsed, 0, QModelIndex());
         selectionModel()->select(lastUsedIndex, QItemSelectionModel::ClearAndSelect);
         setCurrentSample(m_document->sampleModel()->sampleItems()[lastUsed]);
-- 
GitLab