From 629e73876f22e3f6e97269693665ca82c62f694c Mon Sep 17 00:00:00 2001
From: Mikhail Svechnikov <m.svechnikov@fz-juelich.de>
Date: Mon, 23 May 2022 19:52:11 +0200
Subject: [PATCH] doing IntensityDataPropertyWidget connections

---
 GUI/Model/Job/JobItem.cpp                     | 11 ++++----
 GUI/View/Common/ItemComboWidget.cpp           |  1 -
 GUI/View/Plot2D/IntensityDataWidget.cpp       |  4 +--
 .../PlotComparison/FitComparisonWidget.cpp    |  2 +-
 .../PlotUtil/IntensityDataPropertyWidget.cpp  | 28 +++++++++++++++++--
 .../PlotUtil/IntensityDataPropertyWidget.h    |  8 ++++--
 .../IntensityDataProjectionsWidget.cpp        |  5 ++--
 GUI/View/Projection/ProjectionsEditor.cpp     |  4 +--
 GUI/View/Projection/ProjectionsEditor.h       |  3 +-
 9 files changed, 45 insertions(+), 21 deletions(-)

diff --git a/GUI/Model/Job/JobItem.cpp b/GUI/Model/Job/JobItem.cpp
index 5bf8691d7cf..3a71c8eb053 100644
--- a/GUI/Model/Job/JobItem.cpp
+++ b/GUI/Model/Job/JobItem.cpp
@@ -41,7 +41,6 @@ const QString Instrument("Instrument");
 } // namespace Tags
 } // namespace
 
-
 JobItem::JobItem()
     : SessionItem(M_TYPE)
 {
@@ -65,11 +64,11 @@ JobItem::JobItem()
 
     registerTag(T_FIT_SUITE, 1, 1, {FitSuiteItem::M_TYPE});
 
-    mapper()->setOnChildPropertyChange([this](SessionItem* item, const QString& name) {
-        if (item->parent() == this && dynamic_cast<DataItem*>(item)
-            && DataItem::isAxesUnitsPropertyName(name))
-            dynamic_cast<DataItem*>(item)->updateCoords(instrumentItem());
-    });
+//    mapper()->setOnChildPropertyChange([this](SessionItem* item, const QString& name) {
+//        if (item->parent() == this && dynamic_cast<DataItem*>(item)
+//            && DataItem::isAxesUnitsPropertyName(name))
+//            dynamic_cast<DataItem*>(item)->updateCoords(instrumentItem());
+//    });
 }
 
 QString JobItem::getIdentifier() const
diff --git a/GUI/View/Common/ItemComboWidget.cpp b/GUI/View/Common/ItemComboWidget.cpp
index 7ae926256c7..860b8e30ab8 100644
--- a/GUI/View/Common/ItemComboWidget.cpp
+++ b/GUI/View/Common/ItemComboWidget.cpp
@@ -47,7 +47,6 @@ void ItemComboWidget::registerWidget(const QString& presentationType, factory_fu
 }
 
 //! Sets stack to show widget corresponding to given presentation
-
 void ItemComboWidget::setPresentation(const QString& presentationType)
 {
     if (presentationType.isEmpty()) {
diff --git a/GUI/View/Plot2D/IntensityDataWidget.cpp b/GUI/View/Plot2D/IntensityDataWidget.cpp
index 71db6e22223..cdd24da6574 100644
--- a/GUI/View/Plot2D/IntensityDataWidget.cpp
+++ b/GUI/View/Plot2D/IntensityDataWidget.cpp
@@ -25,9 +25,9 @@
 IntensityDataWidget::IntensityDataWidget(QWidget* parent)
     : SessionItemWidget(parent)
     , m_intensityCanvas(new IntensityDataCanvas)
-    , m_propertyWidget(new IntensityDataPropertyWidget)
+    , m_propertyWidget(new IntensityDataPropertyWidget(this))
     , m_fftPresenter(new IntensityDataFFTPresenter(this))
-{
+{    
     setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
 
     m_propertyWidget->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Minimum);
diff --git a/GUI/View/PlotComparison/FitComparisonWidget.cpp b/GUI/View/PlotComparison/FitComparisonWidget.cpp
index d700e6a86cc..c50f97a3f8e 100644
--- a/GUI/View/PlotComparison/FitComparisonWidget.cpp
+++ b/GUI/View/PlotComparison/FitComparisonWidget.cpp
@@ -35,7 +35,7 @@ FitComparisonWidget::FitComparisonWidget(QWidget* parent)
     , m_relativeDiffPlot(new ColorMapCanvas)
     , m_fitFlowWidget(new FitFlowWidget)
     , m_statusLabel(new PlotStatusLabel(nullptr, this))
-    , m_propertyWidget(new IntensityDataPropertyWidget)
+    , m_propertyWidget(new IntensityDataPropertyWidget(this))
     , m_resetViewAction(new QAction(this))
     , m_comparisonController(new FitComparisonController2D(this))
 {
diff --git a/GUI/View/PlotUtil/IntensityDataPropertyWidget.cpp b/GUI/View/PlotUtil/IntensityDataPropertyWidget.cpp
index 0cbcbd88ba7..a63050dfb0d 100644
--- a/GUI/View/PlotUtil/IntensityDataPropertyWidget.cpp
+++ b/GUI/View/PlotUtil/IntensityDataPropertyWidget.cpp
@@ -14,6 +14,8 @@
 
 #include "GUI/View/PlotUtil/IntensityDataPropertyWidget.h"
 #include "GUI/Model/Data/IntensityDataItem.h"
+#include "GUI/View/Common/SessionItemWidget.h"
+#include "GUI/Model/Job/JobItem.h"
 #include "GUI/Model/Device/AxesItems.h"
 #include "GUI/Util/ComboProperty.h"
 #include "GUI/View/Common/DoubleSpinBox.h"
@@ -27,6 +29,7 @@
 
 IntensityDataPropertyWidget::IntensityDataPropertyWidget(QWidget* parent)
     : QWidget(parent)
+    , parent(parent)
     , m_item(nullptr)
 {
     setWindowTitle("Properties");
@@ -44,6 +47,7 @@ IntensityDataPropertyWidget::~IntensityDataPropertyWidget()
         m_item->mapper()->unsubscribe(this);
 }
 
+#include <QDebug>
 void IntensityDataPropertyWidget::setItem(IntensityDataItem* item)
 {
     if (m_item)
@@ -56,7 +60,18 @@ void IntensityDataPropertyWidget::setItem(IntensityDataItem* item)
     if (!item)
         return;
 
-    m_mainLayout->addRow("Axes units:", createComboBox(item->axesUnits()));
+    QComboBox* axesUnitsCombo = createComboBox(item->axesUnits());
+    // Connection instead of using sessionItem mapper
+    connect(axesUnitsCombo, &QComboBox::currentTextChanged, this, [=](QString currentText) {
+        Q_UNUSED(currentText)
+        // It doesn't work for real data map and diff data map
+        // Also need to connect other intensity data items
+        if(jobItem())
+            item->updateCoords(jobItem()->instrumentItem());
+    });
+    qInfo() << "IntensityDataPropertyWidget : jobItem is" << jobItem() << endl;
+
+    m_mainLayout->addRow("Axes units:", axesUnitsCombo);
     m_mainLayout->addRow("Color scheme:", createComboBox(item->gradient()));
 
     m_mainLayout->addRow(createCheckBox(
@@ -109,6 +124,15 @@ void IntensityDataPropertyWidget::setItem(IntensityDataItem* item)
     item->mapper()->setOnItemDestroy([this](SessionItem*) { m_item = nullptr; }, this);
 }
 
+const JobItem* IntensityDataPropertyWidget::jobItem() const
+{
+    SessionItemWidget* sessionItemWidget = dynamic_cast<SessionItemWidget*>(parent);
+    if(!sessionItemWidget)
+        return nullptr;
+
+   return dynamic_cast<JobItem*>(sessionItemWidget->currentItem());
+}
+
 QWidget* IntensityDataPropertyWidget::createDoubleSpinbox(DoubleDescriptor d)
 {
     auto* spinBox = new DoubleSpinBox(this, d);
@@ -151,7 +175,7 @@ QWidget* IntensityDataPropertyWidget::createCheckBox(const QString& title, funct
     return checkBox;
 }
 
-QWidget* IntensityDataPropertyWidget::createComboBox(SelectionDescriptor<QString> d)
+QComboBox* IntensityDataPropertyWidget::createComboBox(SelectionDescriptor<QString> d)
 {
     auto* combo = new QComboBox(this);
     combo->addItems(d.options);
diff --git a/GUI/View/PlotUtil/IntensityDataPropertyWidget.h b/GUI/View/PlotUtil/IntensityDataPropertyWidget.h
index b6753446fc6..fb5fca9a7d6 100644
--- a/GUI/View/PlotUtil/IntensityDataPropertyWidget.h
+++ b/GUI/View/PlotUtil/IntensityDataPropertyWidget.h
@@ -18,11 +18,11 @@
 #include "GUI/Model/Descriptor/SelectionDescriptor.h"
 #include <QList>
 #include <QString>
-#include <QWidget>
+#include <QComboBox>
 #include <functional>
 
 class IntensityDataItem;
-class SessionItem;
+class JobItem;
 class QFormLayout;
 class DoubleDescriptor;
 
@@ -37,6 +37,7 @@ public:
     ~IntensityDataPropertyWidget();
 
     void setItem(IntensityDataItem* item);
+    const JobItem* jobItem() const;
 
 private:
     QWidget* createDoubleSpinbox(DoubleDescriptor d);
@@ -44,11 +45,12 @@ private:
     QWidget* createCheckBox(const QString& title, SessionItem* item);
     QWidget* createCheckBox(const QString& title, function<bool()> getter,
                             function<void(bool)> setter);
-    QWidget* createComboBox(SelectionDescriptor<QString> d);
+    QComboBox* createComboBox(SelectionDescriptor<QString> d);
 
     void updateUIValues();
 
 private:
+    QWidget* parent;
     IntensityDataItem* m_item;
     QFormLayout* m_mainLayout;
     QList<function<void()>> m_updaters;
diff --git a/GUI/View/Projection/IntensityDataProjectionsWidget.cpp b/GUI/View/Projection/IntensityDataProjectionsWidget.cpp
index 0870a5a163a..14b1a715fb0 100644
--- a/GUI/View/Projection/IntensityDataProjectionsWidget.cpp
+++ b/GUI/View/Projection/IntensityDataProjectionsWidget.cpp
@@ -21,13 +21,12 @@
 
 IntensityDataProjectionsWidget::IntensityDataProjectionsWidget(QWidget* parent)
     : SessionItemWidget(parent)
-    , m_projectionsEditor(new ProjectionsEditor)
+    , m_projectionsEditor(new ProjectionsEditor(this))
 {
-    auto* vlayout = new QVBoxLayout(this);
+    auto* vlayout = new QVBoxLayout;
     vlayout->setMargin(0);
     vlayout->setSpacing(0);
     vlayout->addWidget(m_projectionsEditor);
-
     setLayout(vlayout);
 }
 
diff --git a/GUI/View/Projection/ProjectionsEditor.cpp b/GUI/View/Projection/ProjectionsEditor.cpp
index 2ba6dc4370f..930375038db 100644
--- a/GUI/View/Projection/ProjectionsEditor.cpp
+++ b/GUI/View/Projection/ProjectionsEditor.cpp
@@ -24,13 +24,13 @@
 #include <QItemSelectionModel>
 #include <QSplitter>
 
-ProjectionsEditor::ProjectionsEditor(QWidget* parent)
+ProjectionsEditor::ProjectionsEditor(SessionItemWidget* upperSessionItemWidget, QWidget* parent)
     : QMainWindow(parent)
     , m_editorActions(new ProjectionsEditorActions(this))
     , m_toolbar(new ProjectionsToolbar(m_editorActions))
     , m_projectionsCanvas(new ProjectionsEditorCanvas)
     , m_projectionsWidget(new ProjectionsWidget)
-    , m_propertyPanel(new IntensityDataPropertyWidget)
+    , m_propertyPanel(new IntensityDataPropertyWidget(upperSessionItemWidget)) // here not "this", because IntensityDataPropertyWidget requires access to jobItem
     , m_selectionModel(nullptr)
 {
     addToolBar(Qt::RightToolBarArea, m_toolbar);
diff --git a/GUI/View/Projection/ProjectionsEditor.h b/GUI/View/Projection/ProjectionsEditor.h
index bb4d3900f99..a565f954401 100644
--- a/GUI/View/Projection/ProjectionsEditor.h
+++ b/GUI/View/Projection/ProjectionsEditor.h
@@ -27,6 +27,7 @@ class ProjectionsEditorCanvas;
 class ProjectionsWidget;
 class QItemSelectionModel;
 class IntensityDataPropertyWidget;
+class SessionItemWidget;
 
 //! Editor to draw projections on top of intensity plot. Part of
 
@@ -34,7 +35,7 @@ class ProjectionsEditor : public QMainWindow {
     Q_OBJECT
 
 public:
-    ProjectionsEditor(QWidget* parent = nullptr);
+    ProjectionsEditor(SessionItemWidget* upperSessionItemWidget = nullptr, QWidget* parent = nullptr);
 
     void setContext(SessionModel* model, const QModelIndex& shapeContainerIndex,
                     IntensityDataItem* intensityItem);
-- 
GitLab