diff --git a/GUI/Model/Data/DataItem.cpp b/GUI/Model/Data/DataItem.cpp index 0554b635bc2e3d5887c4cb16b49acfc6528249c3..e2a6db597f4ed3e4dbbf05046ad3a5bb86a86536 100644 --- a/GUI/Model/Data/DataItem.cpp +++ b/GUI/Model/Data/DataItem.cpp @@ -105,6 +105,14 @@ bool DataItem::isAxesUnitsPropertyName(const QString& name) return name == P_AXES_UNITS; } +void DataItem::updateAxesUnits(SessionItem* item, const QString& name, InstrumentItem* instrumentItem) +{ + DataItem* dataItem = dynamic_cast<DataItem*>(item); + if (dataItem && isAxesUnitsPropertyName(name)) { + dataItem->updateCoords(instrumentItem); + } +} + DataItem::DataItem(const QString& modelType) : SessionItem(modelType) { diff --git a/GUI/Model/Data/DataItem.h b/GUI/Model/Data/DataItem.h index 1dc7ebf8cf3f09f513a9c40c6216e4eaf01e63b2..f5c3875a9003e47db528ae7214c63bb4b0f69183 100644 --- a/GUI/Model/Data/DataItem.h +++ b/GUI/Model/Data/DataItem.h @@ -63,6 +63,7 @@ public: SessionItem* getAxesUnitsItem() const; SelectionDescriptor<QString> axesUnits() const; static bool isAxesUnitsPropertyName(const QString& name); + static void updateAxesUnits(SessionItem* item, const QString& name, InstrumentItem* instrumentItem); virtual void setXaxisTitle(const QString& title) = 0; virtual void setYaxisTitle(const QString& title) = 0; diff --git a/GUI/Model/Job/JobItem.cpp b/GUI/Model/Job/JobItem.cpp index 3a71c8eb05326247920431499a2ae85e4b325163..789cf3278ee067e6dde03a0782bf782adfc6720d 100644 --- a/GUI/Model/Job/JobItem.cpp +++ b/GUI/Model/Job/JobItem.cpp @@ -63,12 +63,6 @@ JobItem::JobItem() registerTag(T_DATAVIEW, 1, 1, {Data1DViewItem::M_TYPE}); 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()); -// }); } QString JobItem::getIdentifier() const diff --git a/GUI/View/Plot2D/IntensityDataWidget.cpp b/GUI/View/Plot2D/IntensityDataWidget.cpp index cdd24da65742dbd2a05688442c5b43cdf5289006..cefd52c4852e316756d4f07f909e9deac9b428f1 100644 --- a/GUI/View/Plot2D/IntensityDataWidget.cpp +++ b/GUI/View/Plot2D/IntensityDataWidget.cpp @@ -14,6 +14,8 @@ #include "GUI/View/Plot2D/IntensityDataWidget.h" #include "GUI/Model/Data/IntensityDataItem.h" +#include "GUI/Model/Job/JobItem.h" +#include "GUI/Model/Data/RealDataItem.h" #include "GUI/Util/ActionFactory.h" #include "GUI/View/Plot2D/IntensityDataCanvas.h" #include "GUI/View/Plot2D/IntensityDataFFTPresenter.h" diff --git a/GUI/View/PlotComparison/FitComparisonWidget.cpp b/GUI/View/PlotComparison/FitComparisonWidget.cpp index c50f97a3f8eb4d91f94970b49b4804f5a9e4cb15..bec7ec149a1eaac12026a2908548c973d12b4fc3 100644 --- a/GUI/View/PlotComparison/FitComparisonWidget.cpp +++ b/GUI/View/PlotComparison/FitComparisonWidget.cpp @@ -107,7 +107,7 @@ void FitComparisonWidget::subscribeToItem() m_statusLabel->addPlot(m_simulatedDataPlot->colorMap()); m_statusLabel->addPlot(m_relativeDiffPlot->colorMap()); - m_propertyWidget->setItem(simulatedDataItem()); + m_propertyWidget->setItem(simulatedDataItem(), realDataItem()); } void FitComparisonWidget::unsubscribeFromItem() diff --git a/GUI/View/PlotComparison/FitComparisonWidget1D.cpp b/GUI/View/PlotComparison/FitComparisonWidget1D.cpp index f27491926c334f681ff5ae1fee58ab927fa9cb55..b012b937477fb4557da92212aea4341fbcd2d943 100644 --- a/GUI/View/PlotComparison/FitComparisonWidget1D.cpp +++ b/GUI/View/PlotComparison/FitComparisonWidget1D.cpp @@ -34,7 +34,7 @@ FitComparisonWidget1D::FitComparisonWidget1D(QWidget* parent) , m_diff_plot(new Plot1DCanvas) , m_fitFlowWidget(new FitFlowWidget) , m_statusLabel(new PlotStatusLabel(nullptr, this)) - , m_propertyWidget(new SpecularDataPropertyWidget) + , m_propertyWidget(new SpecularDataPropertyWidget(this)) , m_resetViewAction(new QAction(this)) , m_comparisonController(new FitComparison1DViewController(this)) { diff --git a/GUI/View/PlotSpecular/SpecularDataWidget.cpp b/GUI/View/PlotSpecular/SpecularDataWidget.cpp index 1e13794c2a055ed9ef5597c1e21e9a6655c1c1eb..a6b4b40aa90bdf86f4b49b6cb6601ca305d8e084 100644 --- a/GUI/View/PlotSpecular/SpecularDataWidget.cpp +++ b/GUI/View/PlotSpecular/SpecularDataWidget.cpp @@ -24,7 +24,7 @@ SpecularDataWidget::SpecularDataWidget(QWidget* parent) : SessionItemWidget(parent) , m_intensity_canvas(new SpecularDataCanvas) - , m_propertyWidget(new SpecularDataPropertyWidget) + , m_propertyWidget(new SpecularDataPropertyWidget(this)) { setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); m_propertyWidget->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::MinimumExpanding); diff --git a/GUI/View/PlotUtil/IntensityDataPropertyWidget.cpp b/GUI/View/PlotUtil/IntensityDataPropertyWidget.cpp index a63050dfb0dd77a58c35c1c50fe82ebf21344208..f795e79ec7be4777a426d54929fc81e02434e591 100644 --- a/GUI/View/PlotUtil/IntensityDataPropertyWidget.cpp +++ b/GUI/View/PlotUtil/IntensityDataPropertyWidget.cpp @@ -47,36 +47,24 @@ IntensityDataPropertyWidget::~IntensityDataPropertyWidget() m_item->mapper()->unsubscribe(this); } -#include <QDebug> -void IntensityDataPropertyWidget::setItem(IntensityDataItem* item) +void IntensityDataPropertyWidget::setItem(IntensityDataItem* mainItem, IntensityDataItem* realItem) { if (m_item) m_item->mapper()->unsubscribe(this); GUI::Util::Layout::clearLayout(m_mainLayout); m_updaters.clear(); - m_item = item; + m_item = mainItem; - if (!item) + if (!m_item) return; - 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("Axes units:", createComboBox(m_item->axesUnits())); + m_mainLayout->addRow("Color scheme:", createComboBox(m_item->gradient())); m_mainLayout->addRow(createCheckBox( - "Interpolate", [=]() { return item->isInterpolated(); }, - [=](bool b) { item->setInterpolated(b); })); + "Interpolate", [=]() { return m_item->isInterpolated(); }, + [=](bool b) { m_item->setInterpolated(b); })); // -- x-axis auto* xGroup = new QGroupBox("X axis", this); @@ -84,9 +72,9 @@ void IntensityDataPropertyWidget::setItem(IntensityDataItem* item) xFormLayout->setContentsMargins(0, 0, 0, 0); xFormLayout->setSpacing(5); - xFormLayout->addRow("Min:", createDoubleSpinbox(item->xAxisItem()->min())); - xFormLayout->addRow("Max:", createDoubleSpinbox(item->xAxisItem()->max())); - xFormLayout->addRow("Title:", createTextEdit(item->xAxisItem()->titleItem())); + xFormLayout->addRow("Min:", createDoubleSpinbox(m_item->xAxisItem()->min())); + xFormLayout->addRow("Max:", createDoubleSpinbox(m_item->xAxisItem()->max())); + xFormLayout->addRow("Title:", createTextEdit(m_item->xAxisItem()->titleItem())); m_mainLayout->addRow(xGroup); @@ -96,9 +84,9 @@ void IntensityDataPropertyWidget::setItem(IntensityDataItem* item) yFormLayout->setContentsMargins(0, 0, 0, 0); yFormLayout->setSpacing(5); - yFormLayout->addRow("Min:", createDoubleSpinbox(item->yAxisItem()->min())); - yFormLayout->addRow("Max:", createDoubleSpinbox(item->yAxisItem()->max())); - yFormLayout->addRow("Title:", createTextEdit(item->yAxisItem()->titleItem())); + yFormLayout->addRow("Min:", createDoubleSpinbox(m_item->yAxisItem()->min())); + yFormLayout->addRow("Max:", createDoubleSpinbox(m_item->yAxisItem()->max())); + yFormLayout->addRow("Title:", createTextEdit(m_item->yAxisItem()->titleItem())); m_mainLayout->addRow(yGroup); @@ -108,20 +96,27 @@ void IntensityDataPropertyWidget::setItem(IntensityDataItem* item) zFormLayout->setContentsMargins(0, 0, 0, 0); zFormLayout->setSpacing(5); - zFormLayout->addRow("Min:", createDoubleSpinbox(item->zAxisItem()->min())); - zFormLayout->addRow("Max:", createDoubleSpinbox(item->zAxisItem()->max())); - zFormLayout->addRow(createCheckBox("log10", item->zAxisItem()->logScaleItem())); - zFormLayout->addRow(createCheckBox("Visible", item->zAxisItem()->visibilityItem())); + zFormLayout->addRow("Min:", createDoubleSpinbox(m_item->zAxisItem()->min())); + zFormLayout->addRow("Max:", createDoubleSpinbox(m_item->zAxisItem()->max())); + zFormLayout->addRow(createCheckBox("log10", m_item->zAxisItem()->logScaleItem())); + zFormLayout->addRow(createCheckBox("Visible", m_item->zAxisItem()->visibilityItem())); m_mainLayout->addRow(zGroup); updateUIValues(); // react on external changes (e.g. zooming in customplot shall update the axis values) - item->mapper()->setOnChildPropertyChange( - [=](SessionItem*, const QString&) { updateUIValues(); }, this); + m_item->mapper()->setOnChildPropertyChange([=](SessionItem*, const QString&) { + updateUIValues(); }, this); + + // update coordinates on axes units change + m_item->mapper()->setOnPropertyChange([this](SessionItem* item, const QString& name) { + DataItem::updateAxesUnits(item, name, jobItem()->instrumentItem()); }, this); + if(realItem) + realItem->mapper()->setOnPropertyChange([this](SessionItem* item, const QString& name) { + DataItem::updateAxesUnits(item, name, jobItem()->instrumentItem()); }, this); - item->mapper()->setOnItemDestroy([this](SessionItem*) { m_item = nullptr; }, this); + m_item->mapper()->setOnItemDestroy([this](SessionItem*) { m_item = nullptr; }, this); } const JobItem* IntensityDataPropertyWidget::jobItem() const @@ -130,7 +125,7 @@ const JobItem* IntensityDataPropertyWidget::jobItem() const if(!sessionItemWidget) return nullptr; - return dynamic_cast<JobItem*>(sessionItemWidget->currentItem()); + return dynamic_cast<JobItem*>(sessionItemWidget->currentItem()); } QWidget* IntensityDataPropertyWidget::createDoubleSpinbox(DoubleDescriptor d) @@ -175,7 +170,7 @@ QWidget* IntensityDataPropertyWidget::createCheckBox(const QString& title, funct return checkBox; } -QComboBox* IntensityDataPropertyWidget::createComboBox(SelectionDescriptor<QString> d) +QWidget* 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 fb5fca9a7d65d4c5645a9fabd9a5f91987d8e9aa..47bdaf24876346d9f701c56eacba8080f8c415c7 100644 --- a/GUI/View/PlotUtil/IntensityDataPropertyWidget.h +++ b/GUI/View/PlotUtil/IntensityDataPropertyWidget.h @@ -36,7 +36,7 @@ public: explicit IntensityDataPropertyWidget(QWidget* parent = nullptr); ~IntensityDataPropertyWidget(); - void setItem(IntensityDataItem* item); + void setItem(IntensityDataItem* mainItem, IntensityDataItem* realItem = nullptr); const JobItem* jobItem() const; private: @@ -45,7 +45,7 @@ private: QWidget* createCheckBox(const QString& title, SessionItem* item); QWidget* createCheckBox(const QString& title, function<bool()> getter, function<void(bool)> setter); - QComboBox* createComboBox(SelectionDescriptor<QString> d); + QWidget* createComboBox(SelectionDescriptor<QString> d); void updateUIValues(); diff --git a/GUI/View/PropertyEditor/SpecularDataPropertyWidget.cpp b/GUI/View/PropertyEditor/SpecularDataPropertyWidget.cpp index f39236e28949d83f22cefb71b59f90dabea3fd03..792b24d7864a4a8faeba25aec6fe72b9acfd3c21 100644 --- a/GUI/View/PropertyEditor/SpecularDataPropertyWidget.cpp +++ b/GUI/View/PropertyEditor/SpecularDataPropertyWidget.cpp @@ -13,6 +13,8 @@ // ************************************************************************************************ #include "GUI/View/PropertyEditor/SpecularDataPropertyWidget.h" +#include "GUI/View/Common/SessionItemWidget.h" +#include "GUI/Model/Job/JobItem.h" #include "GUI/Model/Data/Data1DViewItem.h" #include "GUI/Model/Data/SpecularDataItem.h" #include "GUI/Model/Device/AxesItems.h" @@ -28,6 +30,7 @@ SpecularDataPropertyWidget::SpecularDataPropertyWidget(QWidget* parent) : QWidget(parent) + , parent(parent) , m_item(nullptr) { setWindowTitle("Properties"); @@ -49,6 +52,15 @@ void SpecularDataPropertyWidget::setItem(Data1DViewItem* item) setCurrentItem(item); } +const JobItem* SpecularDataPropertyWidget::jobItem() const +{ + SessionItemWidget* sessionItemWidget = dynamic_cast<SessionItemWidget*>(parent); + if(!sessionItemWidget) + return nullptr; + + return dynamic_cast<JobItem*>(sessionItemWidget->currentItem()); +} + void SpecularDataPropertyWidget::setCurrentItem(SessionItem* item) { if (m_item) @@ -105,8 +117,12 @@ void SpecularDataPropertyWidget::setCurrentItem(SessionItem* item) updateUIValues(); // react on external changes (e.g. zooming in customplot shall update the axis values) - m_item->mapper()->setOnChildPropertyChange( - [=](SessionItem*, const QString&) { updateUIValues(); }, this); + m_item->mapper()->setOnChildPropertyChange([=](SessionItem*, const QString&) { + updateUIValues(); }, this); + + // update coordinates on axes units change + m_item->mapper()->setOnPropertyChange([this](SessionItem* item, const QString& name) { + DataItem::updateAxesUnits(item, name, jobItem()->instrumentItem()); }, this); } QWidget* SpecularDataPropertyWidget::createDoubleSpinbox(DoubleDescriptor d) diff --git a/GUI/View/PropertyEditor/SpecularDataPropertyWidget.h b/GUI/View/PropertyEditor/SpecularDataPropertyWidget.h index f3979a0ed0280f0b00209a40ff7aec9d6ff0bbb8..9e764592c9a2bb9ffc0ee9cd36c14a770f8bc022 100644 --- a/GUI/View/PropertyEditor/SpecularDataPropertyWidget.h +++ b/GUI/View/PropertyEditor/SpecularDataPropertyWidget.h @@ -26,6 +26,7 @@ class SessionItem; class QFormLayout; class DoubleDescriptor; class Data1DViewItem; +class JobItem; using std::function; @@ -38,6 +39,7 @@ public: void setItem(SpecularDataItem* item); void setItem(Data1DViewItem* item); + const JobItem* jobItem() const; private: QWidget* createDoubleSpinbox(DoubleDescriptor d); @@ -51,6 +53,7 @@ private: void setCurrentItem(SessionItem* item); private: + QWidget* parent; SessionItem* m_item; QFormLayout* m_mainLayout; QList<function<void()>> m_updaters;