From 78f237c4fa7877ade96320fdda78da2b6222083d Mon Sep 17 00:00:00 2001 From: Gennady Pospelov <g.pospelov@fz-juelich.de> Date: Wed, 20 Apr 2016 15:37:01 +0200 Subject: [PATCH] All widgets switched to mapper belonging to an item --- .../Views/InfoWidgets/DistributionEditor.cpp | 38 +++++---- .../Views/InfoWidgets/DistributionEditor.h | 2 - .../Views/InfoWidgets/DistributionWidget.cpp | 53 ++++++++---- .../Views/InfoWidgets/DistributionWidget.h | 2 - .../DetectorEditorWidget.cpp | 49 ++++++++--- .../InstrumentWidgets/DetectorEditorWidget.h | 2 - .../RectangularDetectorWidget.cpp | 45 +++++++--- .../RectangularDetectorWidget.h | 2 - .../IntensityDataWidgets/ColorMapPlot.cpp | 74 ++++++++++------- .../Views/IntensityDataWidgets/ColorMapPlot.h | 2 - .../HorizontalSlicePlot.cpp | 72 ++++++++++------ .../HorizontalSlicePlot.h | 2 - .../IntensityDataPlotWidget.cpp | 82 +++++++++++++------ .../IntensityDataPlotWidget.h | 2 - .../IntensityDataWidget.cpp | 62 ++++++++++---- .../IntensityDataWidget.h | 4 +- .../VerticalSlicePlot.cpp | 70 ++++++++++------ .../IntensityDataWidgets/VerticalSlicePlot.h | 3 - .../Views/JobWidgets/JobPropertiesWidget.cpp | 56 +++++++++---- .../Views/JobWidgets/JobPropertiesWidget.h | 2 - .../Views/JobWidgets/ModelTuningDelegate.cpp | 10 ++- .../Views/JobWidgets/ModelTuningWidget.cpp | 52 ++++++++---- .../Views/JobWidgets/ModelTuningWidget.h | 2 - GUI/coregui/Views/MaskWidgets/IMaskView.cpp | 74 +++++++++++------ GUI/coregui/Views/MaskWidgets/IMaskView.h | 3 - .../Views/SampleDesigner/DesignerScene.cpp | 16 ++-- .../Views/SampleDesigner/ILayerView.cpp | 10 +-- GUI/coregui/Views/SampleDesigner/IView.cpp | 34 ++++---- GUI/coregui/Views/SampleDesigner/IView.h | 6 +- .../Views/SampleDesigner/LayerView.cpp | 2 +- .../Views/SampleDesigner/MultiLayerView.cpp | 6 +- .../ParticleCompositionView.cpp | 2 +- .../SampleDesigner/ParticleCoreShellView.cpp | 4 +- .../SampleDesigner/ParticleLayoutView.cpp | 2 +- .../Views/SampleDesigner/ParticleView.cpp | 2 +- .../SampleDesigner/SampleViewAligner.cpp | 2 +- Tests/UnitTests/TestGUI/TestMapperForItem.h | 31 ++++++- 37 files changed, 572 insertions(+), 310 deletions(-) diff --git a/GUI/coregui/Views/InfoWidgets/DistributionEditor.cpp b/GUI/coregui/Views/InfoWidgets/DistributionEditor.cpp index b1ba821069d..98c9a6ba68c 100644 --- a/GUI/coregui/Views/InfoWidgets/DistributionEditor.cpp +++ b/GUI/coregui/Views/InfoWidgets/DistributionEditor.cpp @@ -57,35 +57,37 @@ DistributionEditor::DistributionEditor(QWidget *parent) setLayout(mainLayout); } -DistributionEditor::~DistributionEditor() {} +DistributionEditor::~DistributionEditor() +{ + if(m_item) m_item->mapper()->unsubscribe(this); +} void DistributionEditor::setItem(SessionItem *item) { m_propertyEditor->clearEditor(); m_propertyEditor->addPropertyItems(item); - if (m_item == item) - return; - - m_item = dynamic_cast<GroupItem *>(item); - - if (!m_item) + if (m_item == item) { return; - m_mapper.reset(new ModelMapper); + } else { + if(m_item) + m_item->mapper()->unsubscribe(this); - m_mapper->setItem(m_item); - m_mapper->setOnPropertyChange( - [this](const QString &name) - { - onPropertyChanged(name); - }); + m_item = dynamic_cast<GroupItem *>(item); + if(!m_item) return; - DistributionItem *distrItem = dynamic_cast<DistributionItem *>( - m_item->getCurrentItem()); + m_item->mapper()->setOnPropertyChange( + [this](const QString &name) + { + onPropertyChanged(name); + }, this); - Q_ASSERT(distrItem); - m_plotwidget->setItem(distrItem); + DistributionItem *distrItem = dynamic_cast<DistributionItem *>( + m_item->getCurrentItem()); + Q_ASSERT(distrItem); + m_plotwidget->setItem(distrItem); + } } void DistributionEditor::onPropertyChanged(const QString &property_name) diff --git a/GUI/coregui/Views/InfoWidgets/DistributionEditor.h b/GUI/coregui/Views/InfoWidgets/DistributionEditor.h index 606a52187b1..9fd419948d3 100644 --- a/GUI/coregui/Views/InfoWidgets/DistributionEditor.h +++ b/GUI/coregui/Views/InfoWidgets/DistributionEditor.h @@ -25,7 +25,6 @@ class QGroupBox; class DistributionWidget; class GroupItem; class ComponentBoxEditor; -class ModelMapper; //! The DistributionEditor class, being a child of DistributionDialog, contains a widget //! to show Distribution1D and awesome property editor to change distribution parameters @@ -49,7 +48,6 @@ private: DistributionWidget *m_plotwidget; QString m_nameOfEditor; QGroupBox *m_box; - std::unique_ptr<ModelMapper> m_mapper; }; #endif diff --git a/GUI/coregui/Views/InfoWidgets/DistributionWidget.cpp b/GUI/coregui/Views/InfoWidgets/DistributionWidget.cpp index 2191afb983f..18348ed0c6f 100644 --- a/GUI/coregui/Views/InfoWidgets/DistributionWidget.cpp +++ b/GUI/coregui/Views/InfoWidgets/DistributionWidget.cpp @@ -69,26 +69,51 @@ DistributionWidget::DistributionWidget(QWidget *parent) void DistributionWidget::setItem(DistributionItem *item) { - if (m_item == item) + if (m_item == item) { return; - if (m_item) { - disconnect(); + } else { + if (m_item) { + disconnect(); + m_item->mapper()->unsubscribe(this); + } + + m_item = item; + if (!m_item) return; + + plotItem(); + + m_item->mapper()->setOnPropertyChange( + [this](QString) + { + plotItem(); + }, this); + } - m_item = item; - if (!m_item) - return; - plotItem(); - m_mapper.reset(new ModelMapper); - m_mapper->setItem(item); - m_mapper->setOnPropertyChange( - [this](QString) - { - plotItem(); - }); +// if (m_item == item) +// return; +// if (m_item) { + +// disconnect(); +// } +// m_item = item; + +// if (!m_item) +// return; + +// plotItem(); + +// m_mapper.reset(new ModelMapper); +// m_mapper->setItem(item); +// m_mapper->setOnPropertyChange( +// [this](QString) +// { +// plotItem(); +// }); + } void DistributionWidget::plotItem() diff --git a/GUI/coregui/Views/InfoWidgets/DistributionWidget.h b/GUI/coregui/Views/InfoWidgets/DistributionWidget.h index 8b028014fce..b80c405381a 100644 --- a/GUI/coregui/Views/InfoWidgets/DistributionWidget.h +++ b/GUI/coregui/Views/InfoWidgets/DistributionWidget.h @@ -29,7 +29,6 @@ class QCustomPlot; class DistributionItem; class QCPRange; class QAction; -class ModelMapper; //! The DistributionWidget class plots 1d functions corresponding to domain's Distribution1D class DistributionWidget : public QWidget @@ -64,7 +63,6 @@ private: QCPRange *m_xRange; QCPRange *m_yRange; WarningSignWidget *m_warningSign; - std::unique_ptr<ModelMapper> m_mapper; }; #endif diff --git a/GUI/coregui/Views/InstrumentWidgets/DetectorEditorWidget.cpp b/GUI/coregui/Views/InstrumentWidgets/DetectorEditorWidget.cpp index ee21111da9d..0c78091d2b3 100644 --- a/GUI/coregui/Views/InstrumentWidgets/DetectorEditorWidget.cpp +++ b/GUI/coregui/Views/InstrumentWidgets/DetectorEditorWidget.cpp @@ -58,23 +58,46 @@ DetectorEditorWidget::~DetectorEditorWidget() void DetectorEditorWidget::setDetectorItem(DetectorItem *detectorItem) { - qDebug() << "DetectorEditorWidget::setDetectorItem() -> XXX"; + if(m_detectorItem == detectorItem) { + return; - m_detectorItem = detectorItem; - if(!m_detectorItem) return; + } else { + if(m_detectorItem) + m_detectorItem->mapper()->unsubscribe(this); + + m_detectorItem = detectorItem; + if(!m_detectorItem) return; + + m_detectorItem->mapper()->setOnPropertyChange( + [this](const QString &name) + { + onPropertyChanged(name); + }, this); + + m_detectorTypeEditor->clearEditor(); + m_detectorTypeEditor->addItem(m_detectorItem->getItem(DetectorItem::P_DETECTOR)); + + init_SubDetector_Widget(); + } + + + +// qDebug() << "DetectorEditorWidget::setDetectorItem() -> XXX"; +// m_detectorItem = detectorItem; +// if(!m_detectorItem) return; - m_mapper.reset(new ModelMapper); - m_mapper->setItem(m_detectorItem); - m_mapper->setOnPropertyChange( - [this](const QString &name) - { - onPropertyChanged(name); - }); +// m_mapper.reset(new ModelMapper); +// m_mapper->setItem(m_detectorItem); +// m_mapper->setOnPropertyChange( +// [this](const QString &name) +// { +// onPropertyChanged(name); +// }); - m_detectorTypeEditor->clearEditor(); - m_detectorTypeEditor->addItem(m_detectorItem->getItem(DetectorItem::P_DETECTOR)); +// m_detectorTypeEditor->clearEditor(); +// m_detectorTypeEditor->addItem(m_detectorItem->getItem(DetectorItem::P_DETECTOR)); - init_SubDetector_Widget(); +// init_SubDetector_Widget(); } void DetectorEditorWidget::onPropertyChanged(const QString &propertyName) diff --git a/GUI/coregui/Views/InstrumentWidgets/DetectorEditorWidget.h b/GUI/coregui/Views/InstrumentWidgets/DetectorEditorWidget.h index 57318847821..411f8b19ef2 100644 --- a/GUI/coregui/Views/InstrumentWidgets/DetectorEditorWidget.h +++ b/GUI/coregui/Views/InstrumentWidgets/DetectorEditorWidget.h @@ -27,7 +27,6 @@ class ComponentBoxEditor; class QGridLayout; class SphericalDetectorWidget; class ColumnResizer; -class ModelMapper; class BA_CORE_API_ DetectorEditorWidget : public QWidget { @@ -54,7 +53,6 @@ private: GroupInfoBox *m_groupBox; DetectorItem *m_detectorItem; QWidget *m_subDetectorWidget; - std::unique_ptr<ModelMapper> m_mapper; }; #endif diff --git a/GUI/coregui/Views/InstrumentWidgets/RectangularDetectorWidget.cpp b/GUI/coregui/Views/InstrumentWidgets/RectangularDetectorWidget.cpp index 41ffc5a8859..2586d477264 100644 --- a/GUI/coregui/Views/InstrumentWidgets/RectangularDetectorWidget.cpp +++ b/GUI/coregui/Views/InstrumentWidgets/RectangularDetectorWidget.cpp @@ -60,18 +60,39 @@ RectangularDetectorWidget::~RectangularDetectorWidget() void RectangularDetectorWidget::setDetectorItem(RectangularDetectorItem *detectorItem) { - m_detectorItem = detectorItem; - if(!m_detectorItem) return; - - m_mapper.reset(new ModelMapper); - m_mapper->setItem(m_detectorItem); - m_mapper->setOnPropertyChange( - [this](const QString &name) - { - onPropertyChanged(name); - }); - - init_editors(); + if(m_detectorItem == detectorItem) { + return; + + } else { + if(m_detectorItem) + m_detectorItem->mapper()->unsubscribe(this); + + m_detectorItem = detectorItem; + if(!m_detectorItem) return; + + m_detectorItem->mapper()->setOnPropertyChange( + [this](const QString &name) + { + onPropertyChanged(name); + }, this); + + init_editors(); + } + + + +// m_detectorItem = detectorItem; +// if(!m_detectorItem) return; + +// m_mapper.reset(new ModelMapper); +// m_mapper->setItem(m_detectorItem); +// m_mapper->setOnPropertyChange( +// [this](const QString &name) +// { +// onPropertyChanged(name); +// }); + +// init_editors(); } void RectangularDetectorWidget::onPropertyChanged(const QString &propertyName) diff --git a/GUI/coregui/Views/InstrumentWidgets/RectangularDetectorWidget.h b/GUI/coregui/Views/InstrumentWidgets/RectangularDetectorWidget.h index 63eadb3b499..603bd27e589 100644 --- a/GUI/coregui/Views/InstrumentWidgets/RectangularDetectorWidget.h +++ b/GUI/coregui/Views/InstrumentWidgets/RectangularDetectorWidget.h @@ -28,7 +28,6 @@ class AwesomePropertyEditor; class ComponentBoxEditor; class QGridLayout; class ColumnResizer; -class ModelMapper; class BA_CORE_API_ RectangularDetectorWidget : public QWidget { @@ -63,7 +62,6 @@ private: QGridLayout *m_gridLayout; RectangularDetectorItem *m_detectorItem; - std::unique_ptr<ModelMapper> m_mapper; }; #endif diff --git a/GUI/coregui/Views/IntensityDataWidgets/ColorMapPlot.cpp b/GUI/coregui/Views/IntensityDataWidgets/ColorMapPlot.cpp index d35ee15fe0b..2dad456db99 100644 --- a/GUI/coregui/Views/IntensityDataWidgets/ColorMapPlot.cpp +++ b/GUI/coregui/Views/IntensityDataWidgets/ColorMapPlot.cpp @@ -46,41 +46,59 @@ ColorMapPlot::~ColorMapPlot() //! initializes everything with new IntensityDataItem or plot it, if it was already the case void ColorMapPlot::setItem(IntensityDataItem *item) { - if (item && (m_item == item)) { - // qDebug() << "ColorMapPlot::setItem(NIntensityDataItem *item) item==m_item"; - plotItem(m_item); + if(item == m_item) { + if(m_item) + plotItem(m_item); return; + + } else { + if(m_item) + m_item->mapper()->unsubscribe(this); + + m_item = item; + if(!m_item) return; + + plotItem(m_item); + + m_item->mapper()->setOnPropertyChange( + [this](const QString &name) + { + onPropertyChanged(name); + onIntensityModified(); + }, this); + m_item->mapper()->setOnChildPropertyChange( + [this](SessionItem* item, const QString name) + { + onSubItemPropertyChanged(item->itemName(), name); + }, this); + } -// if (m_item) { -// disconnect(m_item, SIGNAL(intensityModified()), this, -// SLOT(onIntensityModified())); -// } - m_item = item; +// m_item = item; - if (!m_item) - return; +// if (!m_item) +// return; - plotItem(m_item); +// plotItem(m_item); + +//// connect(m_item, SIGNAL(intensityModified()), this, +//// SLOT(onIntensityModified())); +// m_mapper.reset(new ModelMapper); -// connect(m_item, SIGNAL(intensityModified()), this, -// SLOT(onIntensityModified())); - m_mapper.reset(new ModelMapper); - - m_mapper->setItem(item); - m_mapper->setOnPropertyChange( - [this](const QString &name) - { - onPropertyChanged(name); - onIntensityModified(); - }); - m_mapper->setOnChildPropertyChange( - [this](SessionItem* item, const QString name) - { -// if (item->parent() && item->parent()->modelType() == Constants::GroupItemType) - onSubItemPropertyChanged(item->itemName(), name); - }); +// m_mapper->setItem(item); +// m_mapper->setOnPropertyChange( +// [this](const QString &name) +// { +// onPropertyChanged(name); +// onIntensityModified(); +// }); +// m_mapper->setOnChildPropertyChange( +// [this](SessionItem* item, const QString name) +// { +//// if (item->parent() && item->parent()->modelType() == Constants::GroupItemType) +// onSubItemPropertyChanged(item->itemName(), name); +// }); } //! returns string containing bin content information diff --git a/GUI/coregui/Views/IntensityDataWidgets/ColorMapPlot.h b/GUI/coregui/Views/IntensityDataWidgets/ColorMapPlot.h index 7b4bef0c50b..bfcf7d04f1b 100644 --- a/GUI/coregui/Views/IntensityDataWidgets/ColorMapPlot.h +++ b/GUI/coregui/Views/IntensityDataWidgets/ColorMapPlot.h @@ -28,7 +28,6 @@ class IntensityDataItem; class QCustomPlot; class QCPColorMap; class QCPColorScale; -class ModelMapper; //! 2D color map widget for IntensityData class BA_CORE_API_ ColorMapPlot : public QWidget @@ -119,7 +118,6 @@ private: QMap<QString, QCPColorGradient > m_gradient_map; bool m_block_update; PositionData m_posData; - std::unique_ptr<ModelMapper> m_mapper; }; diff --git a/GUI/coregui/Views/IntensityDataWidgets/HorizontalSlicePlot.cpp b/GUI/coregui/Views/IntensityDataWidgets/HorizontalSlicePlot.cpp index 4b0ff0fe25b..08293e71748 100644 --- a/GUI/coregui/Views/IntensityDataWidgets/HorizontalSlicePlot.cpp +++ b/GUI/coregui/Views/IntensityDataWidgets/HorizontalSlicePlot.cpp @@ -42,40 +42,64 @@ HorizontalSlicePlot::HorizontalSlicePlot(QWidget *parent) void HorizontalSlicePlot::setItem(IntensityDataItem *item) { - if (m_item == item) return; + if(m_item == item) { + return; - if (m_item) { -// disconnect(m_item, SIGNAL(propertyChanged(QString)), -// this, SLOT(onPropertyChanged(QString))); -// disconnect(m_item, SIGNAL(subItemPropertyChanged(QString,QString)), -// this, SLOT(onSubItemPropertyChanged(QString,QString))); + } else { + if(m_item) + m_item->mapper()->unsubscribe(this); + + m_item = item; + if (!m_item) return; + + plotItem(m_item); + + m_item->mapper()->setOnChildPropertyChange( + [this](SessionItem* item, const QString name) + { + if (item->parent() && item->parent()->modelType() == Constants::GroupItemType) + onSubItemPropertyChanged(item->itemName(), name); + }, this); } - m_item = item; - if (!m_item) return; - plotItem(m_item); -// connect(m_item, SIGNAL(propertyChanged(QString)), -// this, SLOT(onPropertyChanged(QString))); -// if (m_mapper) -// m_mapper->deleteLater(); -// m_mapper = new ModelMapper(this); +// if (m_item == item) return; + +// if (m_item) { +//// disconnect(m_item, SIGNAL(propertyChanged(QString)), +//// this, SLOT(onPropertyChanged(QString))); +//// disconnect(m_item, SIGNAL(subItemPropertyChanged(QString,QString)), +//// this, SLOT(onSubItemPropertyChanged(QString,QString))); +// } + +// m_item = item; + +// if (!m_item) return; + +// plotItem(m_item); + +//// connect(m_item, SIGNAL(propertyChanged(QString)), +//// this, SLOT(onPropertyChanged(QString))); + +//// if (m_mapper) +//// m_mapper->deleteLater(); +//// m_mapper = new ModelMapper(this); - m_mapper.reset(new ModelMapper); - m_mapper->setItem(item); - m_mapper->setOnChildPropertyChange( - [this](SessionItem* item, const QString name) - { - if (item->parent() && item->parent()->modelType() == Constants::GroupItemType) - onSubItemPropertyChanged(item->itemName(), name); - }); +// m_mapper.reset(new ModelMapper); +// m_mapper->setItem(item); +// m_mapper->setOnChildPropertyChange( +// [this](SessionItem* item, const QString name) +// { +// if (item->parent() && item->parent()->modelType() == Constants::GroupItemType) +// onSubItemPropertyChanged(item->itemName(), name); +// }); -// connect(m_item, SIGNAL(subItemPropertyChanged(QString,QString)), -// this, SLOT(onSubItemPropertyChanged(QString,QString))); +//// connect(m_item, SIGNAL(subItemPropertyChanged(QString,QString)), +//// this, SLOT(onSubItemPropertyChanged(QString,QString))); } diff --git a/GUI/coregui/Views/IntensityDataWidgets/HorizontalSlicePlot.h b/GUI/coregui/Views/IntensityDataWidgets/HorizontalSlicePlot.h index 4457388be37..0cbe2693e30 100644 --- a/GUI/coregui/Views/IntensityDataWidgets/HorizontalSlicePlot.h +++ b/GUI/coregui/Views/IntensityDataWidgets/HorizontalSlicePlot.h @@ -24,7 +24,6 @@ class IntensityDataItem; class QCustomPlot; class QCPBars; -class ModelMapper; //! Slice of 2D IntensityData along x-axis //! FIXME functionality has to be merged with VerticalSlicePlot (code duplication) @@ -59,7 +58,6 @@ private: QCustomPlot *m_customPlot; QCPBars *m_bars; IntensityDataItem *m_item; - std::unique_ptr<ModelMapper> m_mapper; }; #endif diff --git a/GUI/coregui/Views/IntensityDataWidgets/IntensityDataPlotWidget.cpp b/GUI/coregui/Views/IntensityDataWidgets/IntensityDataPlotWidget.cpp index 79f9539e293..2ad6de86892 100644 --- a/GUI/coregui/Views/IntensityDataWidgets/IntensityDataPlotWidget.cpp +++ b/GUI/coregui/Views/IntensityDataWidgets/IntensityDataPlotWidget.cpp @@ -94,43 +94,75 @@ IntensityDataPlotWidget::~IntensityDataPlotWidget() //! initializes the class with NIntensityDataItem void IntensityDataPlotWidget::setItem(IntensityDataItem *item) { - //qDebug() << "IntensityDataPlotWidget::setItem(NIntensityDataItem *item)"; - m_centralPlot->setItem(item); m_horizontalPlot->setItem(item); m_verticalPlot->setItem(item); - if (m_item == item) return; + if (m_item == item) { + return; - if (m_item) { -// disconnect(m_item, SIGNAL(propertyChanged(QString)), -// this, SLOT(onPropertyChanged(QString))); -// disconnect(m_item, SIGNAL(intensityModified()), this, SLOT(onIntensityModified())); + } else { + if(m_item) + m_item->mapper()->unsubscribe(this); + + m_item = item; + if (!m_item) return; + + updateItem(m_item); + + m_item->mapper()->setOnPropertyChange( + [this](const QString &name) + { + if(name == IntensityDataItem::P_PROJECTIONS_FLAG) { + showProjections(m_item->getItemValue(IntensityDataItem::P_PROJECTIONS_FLAG).toBool()); + } + }, this); + m_item->mapper()->setOnValueChange([this](void){ + onIntensityModified(); + }, this); } - m_item = item; - if (!m_item) return; - updateItem(m_item); -// if (m_mapper) -// m_mapper->deleteLater(); -// m_mapper = new ModelMapper(this); +// //qDebug() << "IntensityDataPlotWidget::setItem(NIntensityDataItem *item)"; + +// m_centralPlot->setItem(item); +// m_horizontalPlot->setItem(item); +// m_verticalPlot->setItem(item); + +// if (m_item == item) return; + +// if (m_item) { +//// disconnect(m_item, SIGNAL(propertyChanged(QString)), +//// this, SLOT(onPropertyChanged(QString))); +//// disconnect(m_item, SIGNAL(intensityModified()), this, SLOT(onIntensityModified())); +// } + +// m_item = item; + +// if (!m_item) return; + +// updateItem(m_item); + +//// if (m_mapper) +//// m_mapper->deleteLater(); +//// m_mapper = new ModelMapper(this); + +// m_mapper.reset(new ModelMapper); +// m_mapper->setItem(item); +// m_mapper->setOnPropertyChange( +// [this](const QString &name) +// { +// if(name == IntensityDataItem::P_PROJECTIONS_FLAG) { +// showProjections(m_item->getItemValue(IntensityDataItem::P_PROJECTIONS_FLAG).toBool()); +// } +// }); +// m_mapper->setOnValueChange([this](void){ +// onIntensityModified(); +// }); - m_mapper.reset(new ModelMapper); - m_mapper->setItem(item); - m_mapper->setOnPropertyChange( - [this](const QString &name) - { - if(name == IntensityDataItem::P_PROJECTIONS_FLAG) { - showProjections(m_item->getItemValue(IntensityDataItem::P_PROJECTIONS_FLAG).toBool()); - } - }); - m_mapper->setOnValueChange([this](void){ - onIntensityModified(); - }); } //! provide syncronious move of top and bottom splitters diff --git a/GUI/coregui/Views/IntensityDataWidgets/IntensityDataPlotWidget.h b/GUI/coregui/Views/IntensityDataWidgets/IntensityDataPlotWidget.h index 7ee0f993bbf..6f5e0b54db8 100644 --- a/GUI/coregui/Views/IntensityDataWidgets/IntensityDataPlotWidget.h +++ b/GUI/coregui/Views/IntensityDataWidgets/IntensityDataPlotWidget.h @@ -27,7 +27,6 @@ class VerticalSlicePlot; class ColorMapPlot; class QLabel; class IntensityDataItem; -class ModelMapper; //! The widget contains IntensityDataItem color map, two projections and all //! logic. Belongs to IntensityDataWidget. @@ -82,7 +81,6 @@ private: int m_leftHistogramArea; int m_bottomHistogramArea; IntensityDataItem *m_item; - std::unique_ptr<ModelMapper> m_mapper; }; #endif diff --git a/GUI/coregui/Views/IntensityDataWidgets/IntensityDataWidget.cpp b/GUI/coregui/Views/IntensityDataWidgets/IntensityDataWidget.cpp index 588db865406..d454aa38dbc 100644 --- a/GUI/coregui/Views/IntensityDataWidgets/IntensityDataWidget.cpp +++ b/GUI/coregui/Views/IntensityDataWidgets/IntensityDataWidget.cpp @@ -59,14 +59,40 @@ void IntensityDataWidget::setItem(IntensityDataItem *item) m_plotWidget->setItem(item); m_propertyWidget->setItem(item); - if (m_currentItem == item) return; + if (m_currentItem == item) { + return; + + } else { + if(m_currentItem) + m_currentItem->mapper()->unsubscribe(this); + + m_currentItem = item; + if (!m_currentItem) return; + + setPropertyPanelVisible(m_currentItem->getItemValue(IntensityDataItem::P_PROPERTY_PANEL_FLAG).toBool()); + + m_currentItem->mapper()->setOnPropertyChange( + [this](const QString &name) + { + if(name == IntensityDataItem::P_PROPERTY_PANEL_FLAG) { + setPropertyPanelVisible(m_currentItem->getItemValue(IntensityDataItem::P_PROPERTY_PANEL_FLAG).toBool()); + } + }, this); + } - m_currentItem = item; +// m_plotWidget->setItem(item); +// m_propertyWidget->setItem(item); - if (!m_currentItem) return; +// if (m_currentItem == item) return; + + +// m_currentItem = item; + +// if (!m_currentItem) return; + +// updateItem(m_currentItem); - updateItem(m_currentItem); } void IntensityDataWidget::togglePropertyPanel() @@ -88,20 +114,20 @@ void IntensityDataWidget::setPropertyPanelVisible(bool visible) m_propertyWidget->setVisible(visible); } -void IntensityDataWidget::updateItem(IntensityDataItem *item) -{ - setPropertyPanelVisible(item->getItemValue(IntensityDataItem::P_PROPERTY_PANEL_FLAG).toBool()); - - m_mapper.reset(new ModelMapper); - m_mapper->setItem(item); - m_mapper->setOnPropertyChange( - [this](const QString &name) - { - if(name == IntensityDataItem::P_PROPERTY_PANEL_FLAG) { - setPropertyPanelVisible(m_currentItem->getItemValue(IntensityDataItem::P_PROPERTY_PANEL_FLAG).toBool()); - } - }); -} +//void IntensityDataWidget::updateItem(IntensityDataItem *item) +//{ +// setPropertyPanelVisible(item->getItemValue(IntensityDataItem::P_PROPERTY_PANEL_FLAG).toBool()); + +// m_mapper.reset(new ModelMapper); +// m_mapper->setItem(item); +// m_mapper->setOnPropertyChange( +// [this](const QString &name) +// { +// if(name == IntensityDataItem::P_PROPERTY_PANEL_FLAG) { +// setPropertyPanelVisible(m_currentItem->getItemValue(IntensityDataItem::P_PROPERTY_PANEL_FLAG).toBool()); +// } +// }); +//} void IntensityDataWidget::toggleProjections() { diff --git a/GUI/coregui/Views/IntensityDataWidgets/IntensityDataWidget.h b/GUI/coregui/Views/IntensityDataWidgets/IntensityDataWidget.h index 054bbe684cb..0a8ec8c974d 100644 --- a/GUI/coregui/Views/IntensityDataWidgets/IntensityDataWidget.h +++ b/GUI/coregui/Views/IntensityDataWidgets/IntensityDataWidget.h @@ -24,7 +24,6 @@ class IntensityDataPropertyWidget; class IntensityDataItem; class IntensityDataPlotWidget; -class ModelMapper; //! The widget presents IntensityData color map and property editor. //! Belongs to the stack handled by JobOutputDataWidget @@ -50,12 +49,11 @@ public slots: void setPropertyPanelVisible(bool visible); private: - void updateItem(IntensityDataItem *item); +// void updateItem(IntensityDataItem *item); IntensityDataPlotWidget *m_plotWidget; IntensityDataPropertyWidget *m_propertyWidget; IntensityDataItem *m_currentItem; - std::unique_ptr<ModelMapper> m_mapper; }; diff --git a/GUI/coregui/Views/IntensityDataWidgets/VerticalSlicePlot.cpp b/GUI/coregui/Views/IntensityDataWidgets/VerticalSlicePlot.cpp index 9f408bdf539..1f28dc92b0b 100644 --- a/GUI/coregui/Views/IntensityDataWidgets/VerticalSlicePlot.cpp +++ b/GUI/coregui/Views/IntensityDataWidgets/VerticalSlicePlot.cpp @@ -42,38 +42,60 @@ VerticalSlicePlot::VerticalSlicePlot(QWidget *parent) void VerticalSlicePlot::setItem(IntensityDataItem *item) { - if (m_item == item) return; + if (m_item == item) { + return; - if (m_item) { -// disconnect(m_item, SIGNAL(propertyChanged(QString)), -// this, SLOT(onPropertyChanged(QString))); -// disconnect(m_item, SIGNAL(subItemPropertyChanged(QString,QString)), -// this, SLOT(onSubItemPropertyChanged(QString,QString))); + } else { + if(m_item) + m_item->mapper()->unsubscribe(this); + + m_item = item; + if (!m_item) return; + + plotItem(m_item); + + m_item->mapper()->setOnChildPropertyChange( + [this](SessionItem* item, const QString name) + { + if (item->parent() && item->parent()->modelType() == Constants::GroupItemType) + onSubItemPropertyChanged(item->itemName(), name); + }, this); } - m_item = item; - if (!m_item) return; - plotItem(m_item); -// if (m_mapper) -// m_mapper->deleteLater(); -// m_mapper = new ModelMapper(this); +// if (m_item == item) return; + +// if (m_item) { +//// disconnect(m_item, SIGNAL(propertyChanged(QString)), +//// this, SLOT(onPropertyChanged(QString))); +//// disconnect(m_item, SIGNAL(subItemPropertyChanged(QString,QString)), +//// this, SLOT(onSubItemPropertyChanged(QString,QString))); +// } + +// m_item = item; + +// if (!m_item) return; + +// plotItem(m_item); +//// if (m_mapper) +//// m_mapper->deleteLater(); +//// m_mapper = new ModelMapper(this); - m_mapper.reset(new ModelMapper); - m_mapper->setItem(item); - m_mapper->setOnChildPropertyChange( - [this](SessionItem* item, const QString name) - { - if (item->parent() && item->parent()->modelType() == Constants::GroupItemType) - onSubItemPropertyChanged(item->itemName(), name); - }); +// m_mapper.reset(new ModelMapper); +// m_mapper->setItem(item); +// m_mapper->setOnChildPropertyChange( +// [this](SessionItem* item, const QString name) +// { +// if (item->parent() && item->parent()->modelType() == Constants::GroupItemType) +// onSubItemPropertyChanged(item->itemName(), name); +// }); -// connect(m_item, SIGNAL(propertyChanged(QString)), -// this, SLOT(onPropertyChanged(QString))); +//// connect(m_item, SIGNAL(propertyChanged(QString)), +//// this, SLOT(onPropertyChanged(QString))); -// connect(m_item, SIGNAL(subItemPropertyChanged(QString,QString)), -// this, SLOT(onSubItemPropertyChanged(QString,QString))); +//// connect(m_item, SIGNAL(subItemPropertyChanged(QString,QString)), +//// this, SLOT(onSubItemPropertyChanged(QString,QString))); } diff --git a/GUI/coregui/Views/IntensityDataWidgets/VerticalSlicePlot.h b/GUI/coregui/Views/IntensityDataWidgets/VerticalSlicePlot.h index 5fd94ce644c..970cd27a221 100644 --- a/GUI/coregui/Views/IntensityDataWidgets/VerticalSlicePlot.h +++ b/GUI/coregui/Views/IntensityDataWidgets/VerticalSlicePlot.h @@ -24,7 +24,6 @@ class IntensityDataItem; class QCustomPlot; class QCPBars; -class ModelMapper; //! Slice of 2D IntensityData along x-axis class BA_CORE_API_ VerticalSlicePlot : public QWidget @@ -58,8 +57,6 @@ private: QCustomPlot *m_customPlot; QCPBars *m_bars; IntensityDataItem *m_item; -// ModelMapper *m_mapper; - std::unique_ptr<ModelMapper> m_mapper; }; diff --git a/GUI/coregui/Views/JobWidgets/JobPropertiesWidget.cpp b/GUI/coregui/Views/JobWidgets/JobPropertiesWidget.cpp index 8fa46dd4e76..9b814bb6529 100644 --- a/GUI/coregui/Views/JobWidgets/JobPropertiesWidget.cpp +++ b/GUI/coregui/Views/JobWidgets/JobPropertiesWidget.cpp @@ -85,26 +85,50 @@ void JobPropertiesWidget::setItem(JobItem *jobItem) { m_propertyEditor->setItem(jobItem); - if (m_currentItem == jobItem) return; + if (m_currentItem == jobItem) { + return; - m_currentItem = jobItem; + } else { + if(m_currentItem) + m_currentItem->mapper()->unsubscribe(this); - if (!m_currentItem) return; + m_currentItem = jobItem; + if (!m_currentItem) return; - updateItem(m_currentItem); -// if (m_mapper) -// m_mapper->deleteLater(); -// m_mapper = new ModelMapper(this); + updateItem(m_currentItem); - m_mapper.reset(new ModelMapper); - m_mapper->setItem(jobItem); - m_mapper->setOnPropertyChange( - [this](const QString &name) - { - if(name == JobItem::P_COMMENTS) { - updateItem(m_currentItem); - } - }); + m_currentItem->mapper()->setOnPropertyChange( + [this](const QString &name) + { + if(name == JobItem::P_COMMENTS) { + updateItem(m_currentItem); + } + }, this); + } + + +// m_propertyEditor->setItem(jobItem); + +// if (m_currentItem == jobItem) return; + +// m_currentItem = jobItem; + +// if (!m_currentItem) return; + +// updateItem(m_currentItem); +//// if (m_mapper) +//// m_mapper->deleteLater(); +//// m_mapper = new ModelMapper(this); + +// m_mapper.reset(new ModelMapper); +// m_mapper->setItem(jobItem); +// m_mapper->setOnPropertyChange( +// [this](const QString &name) +// { +// if(name == JobItem::P_COMMENTS) { +// updateItem(m_currentItem); +// } +// }); } diff --git a/GUI/coregui/Views/JobWidgets/JobPropertiesWidget.h b/GUI/coregui/Views/JobWidgets/JobPropertiesWidget.h index 753361e39fb..b75fb0b3d31 100644 --- a/GUI/coregui/Views/JobWidgets/JobPropertiesWidget.h +++ b/GUI/coregui/Views/JobWidgets/JobPropertiesWidget.h @@ -27,7 +27,6 @@ class JobItem; class QTextEdit; class QTabWidget; class ComponentEditor; -class ModelMapper; //! Widget to show and change properties of currently selected JobItem //! Left buttom corner of JobView @@ -58,7 +57,6 @@ private: ComponentEditor *m_propertyEditor; QTextEdit *m_commentsEditor; bool m_block_update; - std::unique_ptr<ModelMapper> m_mapper; }; #endif diff --git a/GUI/coregui/Views/JobWidgets/ModelTuningDelegate.cpp b/GUI/coregui/Views/JobWidgets/ModelTuningDelegate.cpp index 57cf198b717..aa11bce1c4e 100644 --- a/GUI/coregui/Views/JobWidgets/ModelTuningDelegate.cpp +++ b/GUI/coregui/Views/JobWidgets/ModelTuningDelegate.cpp @@ -183,7 +183,7 @@ QWidget *ModelTuningDelegate::createEditor(QWidget *parent, m_contentLayout->addWidget(m_valueBox); m_contentLayout->addWidget(m_slider); -// ModelMapper *mapper = new ModelMapper(m_contentWidget); +//// ModelMapper *mapper = new ModelMapper(m_contentWidget); m_mapper.reset(new ModelMapper); m_mapper->setItem(m_currentItem); @@ -192,6 +192,14 @@ QWidget *ModelTuningDelegate::createEditor(QWidget *parent, m_valueBox->setValue(m_currentItem->value().toDouble()); }); +// m_currentItem->mapper()->unsubscribe(this); +// m_currentItem->mapper()->setOnValueChange( +// [this](){ +// m_valueBox->setValue(m_currentItem->value().toDouble()); +// }, this); + + + m_contentWidget->setLayout(m_contentLayout); return m_contentWidget; diff --git a/GUI/coregui/Views/JobWidgets/ModelTuningWidget.cpp b/GUI/coregui/Views/JobWidgets/ModelTuningWidget.cpp index 28064f7caac..9da9cc621ea 100644 --- a/GUI/coregui/Views/JobWidgets/ModelTuningWidget.cpp +++ b/GUI/coregui/Views/JobWidgets/ModelTuningWidget.cpp @@ -95,29 +95,51 @@ ModelTuningWidget::~ModelTuningWidget() void ModelTuningWidget::setCurrentItem(JobItem *item) { - if (m_currentJobItem == item) return; + if (m_currentJobItem == item) { + return; + + } else { + if(m_currentJobItem) + m_currentJobItem->mapper()->unsubscribe(this); + + m_currentJobItem = item; + if (!m_currentJobItem) return; + updateParameterModel(); - m_currentJobItem = item; + m_currentJobItem->mapper()->setOnPropertyChange( + [this](const QString &name) + { + onPropertyChanged(name); + }, this); - if (!m_currentJobItem) return; + m_fitTools->setCurrentItem(m_currentJobItem, m_treeView->selectionModel()); + } - updateParameterModel(); +// if (m_currentJobItem == item) return; -// if (m_mapper) -// m_mapper->deleteLater(); -// m_mapper = new ModelMapper(this); - m_mapper.reset(new ModelMapper); - m_mapper->setItem(item); - m_mapper->setOnPropertyChange( - [this](const QString &name) - { - onPropertyChanged(name); - }); +// m_currentJobItem = item; + +// if (!m_currentJobItem) return; + +// updateParameterModel(); + +//// if (m_mapper) +//// m_mapper->deleteLater(); +//// m_mapper = new ModelMapper(this); + +// m_mapper.reset(new ModelMapper); +// m_mapper->setItem(item); +// m_mapper->setOnPropertyChange( +// [this](const QString &name) +// { +// onPropertyChanged(name); +// }); + +// m_fitTools->setCurrentItem(item, m_treeView->selectionModel()); - m_fitTools->setCurrentItem(item, m_treeView->selectionModel()); } void ModelTuningWidget::onCurrentLinkChanged(SessionItem *item) diff --git a/GUI/coregui/Views/JobWidgets/ModelTuningWidget.h b/GUI/coregui/Views/JobWidgets/ModelTuningWidget.h index 85b24754c94..d3f82474e8b 100644 --- a/GUI/coregui/Views/JobWidgets/ModelTuningWidget.h +++ b/GUI/coregui/Views/JobWidgets/ModelTuningWidget.h @@ -28,7 +28,6 @@ class QTreeView; class SampleModel; class InstrumentModel; class WarningSignWidget; -class ModelMapper; class SessionItem; class FitTools; @@ -65,7 +64,6 @@ private: ModelTuningDelegate *m_delegate; WarningSignWidget *m_warningSign; FitTools *m_fitTools; - std::unique_ptr<ModelMapper> m_mapper; }; #endif diff --git a/GUI/coregui/Views/MaskWidgets/IMaskView.cpp b/GUI/coregui/Views/MaskWidgets/IMaskView.cpp index 680b4d41c39..4e2cd4626a3 100644 --- a/GUI/coregui/Views/MaskWidgets/IMaskView.cpp +++ b/GUI/coregui/Views/MaskWidgets/IMaskView.cpp @@ -41,44 +41,64 @@ QRectF IMaskView::boundingRect() const void IMaskView::setParameterizedItem(SessionItem *item) { -// if(m_item != item) { -// if(m_item) { -// disconnect(m_item, SIGNAL(propertyChanged(const QString &)), this, -// SLOT(onPropertyChange(const QString &))); -// disconnect(m_item, SIGNAL(subItemChanged(const QString &)), this, -// SLOT(onPropertyChange(const QString &))); - -// } - -// m_item = item; + if(m_item == item) { + return; -// if(m_item) { -// connect(m_item, SIGNAL(propertyChanged(const QString &)), this, -// SLOT(onPropertyChange(const QString &))); -// connect(m_item, SIGNAL(subItemChanged(const QString &)), this, -// SLOT(onPropertyChange(const QString &))); -// } -// } + } else { + if(m_item) + m_item->mapper()->unsubscribe(this); - if(m_item != item) { m_item = item; + if(!m_item) return; -// if (m_mapper) -// m_mapper->deleteLater(); -// m_mapper = new ModelMapper(this); - - m_mapper.reset(new ModelMapper); - m_mapper->setItem(item); - m_mapper->setOnPropertyChange( + m_item->mapper()->setOnPropertyChange( [this](const QString &name) { onPropertyChange(name); - }); - + }, this); } + +//// if(m_item != item) { +//// if(m_item) { +//// disconnect(m_item, SIGNAL(propertyChanged(const QString &)), this, +//// SLOT(onPropertyChange(const QString &))); +//// disconnect(m_item, SIGNAL(subItemChanged(const QString &)), this, +//// SLOT(onPropertyChange(const QString &))); + +//// } + +//// m_item = item; + +//// if(m_item) { +//// connect(m_item, SIGNAL(propertyChanged(const QString &)), this, +//// SLOT(onPropertyChange(const QString &))); +//// connect(m_item, SIGNAL(subItemChanged(const QString &)), this, +//// SLOT(onPropertyChange(const QString &))); +//// } +//// } + +// if(m_item != item) { +// m_item = item; + +//// if (m_mapper) +//// m_mapper->deleteLater(); +//// m_mapper = new ModelMapper(this); + +// m_mapper.reset(new ModelMapper); +// m_mapper->setItem(item); +// m_mapper->setOnPropertyChange( +// [this](const QString &name) +// { +// onPropertyChange(name); +// }); + +// } + + + } SessionItem *IMaskView::getParameterizedItem() diff --git a/GUI/coregui/Views/MaskWidgets/IMaskView.h b/GUI/coregui/Views/MaskWidgets/IMaskView.h index 3c89bbeb805..e98286eb672 100644 --- a/GUI/coregui/Views/MaskWidgets/IMaskView.h +++ b/GUI/coregui/Views/MaskWidgets/IMaskView.h @@ -25,7 +25,6 @@ class SessionItem; class ISceneAdaptor; class QPainter; -class ModelMapper; //! Main interface class for views representing MaskItems on graphics scene @@ -73,8 +72,6 @@ protected: SessionItem *m_item; const ISceneAdaptor *m_adaptor; QRectF m_bounding_rect; -// ModelMapper *m_mapper; - std::unique_ptr<ModelMapper> m_mapper; }; diff --git a/GUI/coregui/Views/SampleDesigner/DesignerScene.cpp b/GUI/coregui/Views/SampleDesigner/DesignerScene.cpp index 4d3a162d79f..114fa5b1b85 100644 --- a/GUI/coregui/Views/SampleDesigner/DesignerScene.cpp +++ b/GUI/coregui/Views/SampleDesigner/DesignerScene.cpp @@ -204,7 +204,7 @@ void DesignerScene::onSceneSelectionChanged() for (int i = 0; i < selected.size(); ++i) { IView *view = dynamic_cast<IView *>(selected[i]); if (view) { - SessionItem *sampleItem = view->getParameterizedItem(); + SessionItem *sampleItem = view->getItem(); QModelIndex itemIndex = m_sampleModel->indexOfItem(sampleItem); Q_ASSERT(itemIndex.isValid()); if (!m_selectionModel->isSelected(m_proxy->mapFromSource(itemIndex))) @@ -241,7 +241,7 @@ void DesignerScene::updateViews(const QModelIndex &parentIndex, IView *parentVie if (parentView) { qDebug() << " DesignerScene::updateViews() -> adding child " << item->modelType() << " to parent" - << parentView->getParameterizedItem()->modelType(); + << parentView->getItem()->modelType(); parentView->addView(childView, childCount++); } } @@ -380,11 +380,11 @@ void DesignerScene::onEstablishedConnection(NodeEditorConnection *connection) // childView->getParameterizedItem()->setPort(input_port_index); qDebug() << parentView->getInputPortIndex(connection->getInputPort()); QString tag; - if (connection->getParentView()->getParameterizedItem()->modelType() == Constants::ParticleLayoutType) { + if (connection->getParentView()->getItem()->modelType() == Constants::ParticleLayoutType) { if (connection->getInputPort()->getPortType() == NodeEditorPort::INTERFERENCE) tag = ParticleLayoutItem::T_INTERFERENCE; } - else if (connection->getParentView()->getParameterizedItem()->modelType() == Constants::ParticleCoreShellType) { + else if (connection->getParentView()->getItem()->modelType() == Constants::ParticleCoreShellType) { if (parentView->getInputPortIndex(connection->getInputPort()) == 0) tag = ParticleCoreShellItem::T_CORE; else if (parentView->getInputPortIndex(connection->getInputPort()) == 1) @@ -392,14 +392,14 @@ void DesignerScene::onEstablishedConnection(NodeEditorConnection *connection) else if (connection->getInputPort()->getPortType() == NodeEditorPort::TRANSFORMATION) tag = ParticleItem::T_TRANSFORMATION; - } else if (connection->getParentView()->getParameterizedItem()->modelType() == Constants::ParticleCompositionType) { + } else if (connection->getParentView()->getItem()->modelType() == Constants::ParticleCompositionType) { if (connection->getInputPort()->getPortType() == NodeEditorPort::TRANSFORMATION) tag = ParticleItem::T_TRANSFORMATION; } delete connection; // deleting just created connection because it will be recreated from the // model - m_sampleModel->moveParameterizedItem(childView->getParameterizedItem(), - parentView->getParameterizedItem(), -1, tag); + m_sampleModel->moveParameterizedItem(childView->getItem(), + parentView->getItem(), -1, tag); } //! propagates break of connection between views on scene to the model @@ -407,7 +407,7 @@ void DesignerScene::removeConnection(NodeEditorConnection *connection) { qDebug() << "DesignerScene::removeConnection()"; IView *childView = dynamic_cast<IView *>(connection->getOutputPort()->parentItem()); - m_sampleModel->moveParameterizedItem(childView->getParameterizedItem(), 0); + m_sampleModel->moveParameterizedItem(childView->getItem(), 0); } //! handles drag event diff --git a/GUI/coregui/Views/SampleDesigner/ILayerView.cpp b/GUI/coregui/Views/SampleDesigner/ILayerView.cpp index 690e11eebd0..40474d28784 100644 --- a/GUI/coregui/Views/SampleDesigner/ILayerView.cpp +++ b/GUI/coregui/Views/SampleDesigner/ILayerView.cpp @@ -107,7 +107,7 @@ void ILayerView::mousePressEvent(QGraphicsSceneMouseEvent *event) void ILayerView::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) { qDebug() << "ILayerView::mouseReleaseEvent() this:" << this - << getParameterizedItem()->itemName() << " parentItem: " << parentItem(); + << getItem()->itemName() << " parentItem: " << parentItem(); DesignerScene *designerScene = dynamic_cast<DesignerScene *>(scene()); Q_ASSERT(designerScene); @@ -145,7 +145,7 @@ void ILayerView::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) // Layer was moved only slightly, to the same row of his own MultiLayer: returning back. if (requested_parent == parentItem() - && requested_row == getParameterizedItem()->parent()->getItems().indexOf(getParameterizedItem())) { + && requested_row == getItem()->parent()->getItems().indexOf(getItem())) { qDebug() << "1.2 Layer->MultiLayer (same), same drop area"; setPos(m_drag_start_position); QGraphicsItem::mouseReleaseEvent(event); @@ -157,7 +157,7 @@ void ILayerView::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) if (parentItem() && !requested_parent) { qDebug() << "1.3 Layer->Scene"; setPos(mapToScene(event->pos()) - event->pos()); - model->moveParameterizedItem(this->getParameterizedItem(), 0); + model->moveParameterizedItem(this->getItem(), 0); QGraphicsItem::mouseReleaseEvent(event); return; } @@ -166,8 +166,8 @@ void ILayerView::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) // one multilayer: changing ownership or row within same ownership. if (requested_parent) { qDebug() << "1.4 ILayerView->MultiLayer"; - model->moveParameterizedItem(this->getParameterizedItem(), - requested_parent->getParameterizedItem(), requested_row); + model->moveParameterizedItem(this->getItem(), + requested_parent->getItem(), requested_row); QGraphicsItem::mouseReleaseEvent(event); return; } diff --git a/GUI/coregui/Views/SampleDesigner/IView.cpp b/GUI/coregui/Views/SampleDesigner/IView.cpp index e18b5a5741a..ae8a4f3ac51 100644 --- a/GUI/coregui/Views/SampleDesigner/IView.cpp +++ b/GUI/coregui/Views/SampleDesigner/IView.cpp @@ -36,34 +36,30 @@ void IView::setParameterizedItem(SessionItem *item) Q_ASSERT(item); Q_ASSERT(m_item == nullptr); - if (item) { - m_item = item; - setX(m_item->getItemValue(SessionGraphicsItem::P_XPOS).toReal()); - setY(m_item->getItemValue(SessionGraphicsItem::P_YPOS).toReal()); + m_item = item; + setX(m_item->getItemValue(SessionGraphicsItem::P_XPOS).toReal()); + setY(m_item->getItemValue(SessionGraphicsItem::P_YPOS).toReal()); - m_mapper.reset(new ModelMapper); - m_mapper->setItem(item); - m_mapper->setOnPropertyChange( - [this] (const QString &name) - { - onPropertyChange(name); - }); + m_item->mapper()->setOnPropertyChange( + [this] (const QString &name) + { + onPropertyChange(name); + }, this); - m_mapper->setOnSiblingsChange( - [this]() - { - onSiblingsChange(); - }); + m_item->mapper()->setOnSiblingsChange( + [this]() + { + onSiblingsChange(); + }, this); - update_appearance(); - } + update_appearance(); } void IView::addView(IView *childView, int row) { qDebug() << "IView::addView() " << m_item->itemName() - << childView->getParameterizedItem()->itemName() << " row:" << row; + << childView->getItem()->itemName() << " row:" << row; } void IView::onChangedX() diff --git a/GUI/coregui/Views/SampleDesigner/IView.h b/GUI/coregui/Views/SampleDesigner/IView.h index 9f56ecdc61e..0889d6d0765 100644 --- a/GUI/coregui/Views/SampleDesigner/IView.h +++ b/GUI/coregui/Views/SampleDesigner/IView.h @@ -22,7 +22,6 @@ #include <memory> class SessionItem; -class ModelMapper; //! parent class for graphic representation of all ISample's class BA_CORE_API_ IView : public QGraphicsObject @@ -38,7 +37,7 @@ public: virtual void setParameterizedItem(SessionItem *item); - virtual SessionItem *getParameterizedItem(); + virtual SessionItem *getItem(); virtual void addView(IView *childView, int row = 0); @@ -55,7 +54,6 @@ protected: virtual void onSiblingsChange(); SessionItem *m_item; - std::unique_ptr<ModelMapper> m_mapper; }; inline int IView::type() const @@ -63,7 +61,7 @@ inline int IView::type() const return TYPE; } -inline SessionItem *IView::getParameterizedItem() +inline SessionItem *IView::getItem() { return m_item; } diff --git a/GUI/coregui/Views/SampleDesigner/LayerView.cpp b/GUI/coregui/Views/SampleDesigner/LayerView.cpp index b24beeebe91..35b336a2a70 100644 --- a/GUI/coregui/Views/SampleDesigner/LayerView.cpp +++ b/GUI/coregui/Views/SampleDesigner/LayerView.cpp @@ -54,7 +54,7 @@ void LayerView::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, void LayerView::addView(IView *childView, int /* row */) { - qDebug() << "LayerView::addView() " << m_item->itemName() << childView->getParameterizedItem()->itemName(); + qDebug() << "LayerView::addView() " << m_item->itemName() << childView->getItem()->itemName(); ParticleLayoutView *layout = dynamic_cast<ParticleLayoutView *>(childView); Q_ASSERT(layout); connectInputPort(layout, 0); diff --git a/GUI/coregui/Views/SampleDesigner/MultiLayerView.cpp b/GUI/coregui/Views/SampleDesigner/MultiLayerView.cpp index bf881f5d623..474eb431718 100644 --- a/GUI/coregui/Views/SampleDesigner/MultiLayerView.cpp +++ b/GUI/coregui/Views/SampleDesigner/MultiLayerView.cpp @@ -57,7 +57,7 @@ void MultiLayerView::paint(QPainter *painter, const QStyleOptionGraphicsItem *op void MultiLayerView::addView(IView *childView, int row) { - qDebug() << "MultiLayerView::addView() " << m_item->itemName() << childView->getParameterizedItem()->itemName() << "row" << row; + qDebug() << "MultiLayerView::addView() " << m_item->itemName() << childView->getItem()->itemName() << "row" << row; ILayerView *layer = dynamic_cast<ILayerView *>(childView); Q_ASSERT(layer); @@ -254,7 +254,7 @@ void MultiLayerView::dropEvent(QGraphicsSceneDragDropEvent *event) qDebug() << "\n XXX" << getDropArea(event->scenePos()) << event->scenePos(); sampleModel->insertNewItem( mimeData->getClassName(), - sampleModel->indexOfItem(this->getParameterizedItem()), + sampleModel->indexOfItem(this->getItem()), getDropArea(event->pos()) ); } @@ -272,7 +272,7 @@ const DesignerMimeData *MultiLayerView::checkDragEvent(QGraphicsSceneDragDropEve int row = getDropArea(event->pos()); if(mimeData->hasFormat("bornagain/widget") - && getParameterizedItem()->acceptsAsDefaultItem(mimeData->getClassName()) + && getItem()->acceptsAsDefaultItem(mimeData->getClassName()) && row!=-1 ) { qDebug() << "MultiLayerView::checkDragEvent -> yes" << row << getDropAreaRectangle(row); diff --git a/GUI/coregui/Views/SampleDesigner/ParticleCompositionView.cpp b/GUI/coregui/Views/SampleDesigner/ParticleCompositionView.cpp index 1a43e63cb59..bfce10b47e3 100644 --- a/GUI/coregui/Views/SampleDesigner/ParticleCompositionView.cpp +++ b/GUI/coregui/Views/SampleDesigner/ParticleCompositionView.cpp @@ -38,7 +38,7 @@ void ParticleCompositionView::addView(IView *childView, int /* row */) int index = 0;//int(childView->getParameterizedItem()->port()); // ->getRegisteredProperty(ParameterizedItem::OBSOLETE_P_PORT) // .toInt(); - if (this->getParameterizedItem()->tagFromItem(childView->getParameterizedItem()) == ParticleItem::T_TRANSFORMATION) + if (this->getItem()->tagFromItem(childView->getItem()) == ParticleItem::T_TRANSFORMATION) index = 1; qDebug() << "ParticleCompositionView::addView()" << index; connectInputPort(dynamic_cast<ConnectableView *>(childView), index); diff --git a/GUI/coregui/Views/SampleDesigner/ParticleCoreShellView.cpp b/GUI/coregui/Views/SampleDesigner/ParticleCoreShellView.cpp index 7cf675063e1..eea4e9e1ed0 100644 --- a/GUI/coregui/Views/SampleDesigner/ParticleCoreShellView.cpp +++ b/GUI/coregui/Views/SampleDesigner/ParticleCoreShellView.cpp @@ -42,9 +42,9 @@ void ParticleCoreShellView::addView(IView *childView, int /* row */) // ->getRegisteredProperty(ParameterizedItem::OBSOLETE_P_PORT) // .toInt(); int index = 0; - if (this->getParameterizedItem()->tagFromItem(childView->getParameterizedItem()) == ParticleCoreShellItem::T_CORE) { + if (this->getItem()->tagFromItem(childView->getItem()) == ParticleCoreShellItem::T_CORE) { index = 0; - } else if (this->getParameterizedItem()->tagFromItem(childView->getParameterizedItem()) == ParticleCoreShellItem::T_SHELL) { + } else if (this->getItem()->tagFromItem(childView->getItem()) == ParticleCoreShellItem::T_SHELL) { index = 1; } else { index = 2; diff --git a/GUI/coregui/Views/SampleDesigner/ParticleLayoutView.cpp b/GUI/coregui/Views/SampleDesigner/ParticleLayoutView.cpp index bb11920aec4..ac0105fe54f 100644 --- a/GUI/coregui/Views/SampleDesigner/ParticleLayoutView.cpp +++ b/GUI/coregui/Views/SampleDesigner/ParticleLayoutView.cpp @@ -37,7 +37,7 @@ ParticleLayoutView::ParticleLayoutView(QGraphicsItem *parent) void ParticleLayoutView::addView(IView *childView, int /* row */) { qDebug() << "ParticleLayoutView::addView() xxx " << m_item->itemName() - << childView->getParameterizedItem()->itemName() << childView->type() + << childView->getItem()->itemName() << childView->type() << DesignerHelper::PARTICLE; if(childView->type() == DesignerHelper::PARTICLE) { connectInputPort(dynamic_cast<ConnectableView *>(childView), 0); diff --git a/GUI/coregui/Views/SampleDesigner/ParticleView.cpp b/GUI/coregui/Views/SampleDesigner/ParticleView.cpp index 09a065cc270..08109d4a6c9 100644 --- a/GUI/coregui/Views/SampleDesigner/ParticleView.cpp +++ b/GUI/coregui/Views/SampleDesigner/ParticleView.cpp @@ -100,7 +100,7 @@ void ParticleView::updatePixmap() { GroupProperty_t group_property = dynamic_cast<GroupItem *>( - getParameterizedItem()->getItem(ParticleItem::P_FORM_FACTOR)) + getItem()->getItem(ParticleItem::P_FORM_FACTOR)) ->group(); QString current_ff_type = group_property->getCurrentType(); QString filename diff --git a/GUI/coregui/Views/SampleDesigner/SampleViewAligner.cpp b/GUI/coregui/Views/SampleDesigner/SampleViewAligner.cpp index 4bc107554af..4b7d7b8128a 100644 --- a/GUI/coregui/Views/SampleDesigner/SampleViewAligner.cpp +++ b/GUI/coregui/Views/SampleDesigner/SampleViewAligner.cpp @@ -118,7 +118,7 @@ QList<IView *> SampleViewAligner::getConnectedViews(IView *view) { QList<IView *> result; - SessionItem *itemOfView = view->getParameterizedItem(); + SessionItem *itemOfView = view->getItem(); QList<SessionItem *> connected_items; diff --git a/Tests/UnitTests/TestGUI/TestMapperForItem.h b/Tests/UnitTests/TestGUI/TestMapperForItem.h index 1a5ae46a3c5..e52bad89977 100644 --- a/Tests/UnitTests/TestGUI/TestMapperForItem.h +++ b/Tests/UnitTests/TestGUI/TestMapperForItem.h @@ -124,12 +124,12 @@ public: , m_mapped_item(0) { } - void setItem(SessionItem *item, Widget *widget, bool with_subscription = false) + void setItem(SessionItem *item, Widget *widget = 0, bool with_subscription = false) { m_mapped_item = item; m_mapper.reset(new ModelMapper); m_mapper->setItem(item); - widget->subscribe(m_mapper.get(), with_subscription); + if(widget) widget->subscribe(m_mapper.get(), with_subscription); } private: @@ -143,6 +143,7 @@ private slots: void test_onChildrenChange(); void test_onSiblingsChange(); void test_Subscription(); + void test_TwoWidgetsSubscription(); }; inline void TestMapperForItem::test_initialCondition() @@ -310,11 +311,37 @@ inline void TestMapperForItem::test_Subscription() layer->setItemValue(LayerItem::P_THICKNESS, 2.0); QCOMPARE(w.m_onPropertyChangeCount, 2); + // unsubscribe widget and check that it doesn't react on item value change w.unsubscribe(m_mapper.get()); layer->setItemValue(LayerItem::P_THICKNESS, 3.0); QCOMPARE(w.m_onPropertyChangeCount, 2); } +inline void TestMapperForItem::test_TwoWidgetsSubscription() +{ + Widget w1, w2; + SampleModel model; + SessionItem *multilayer = model.insertNewItem(Constants::MultiLayerType); + SessionItem *layer = model.insertNewItem(Constants::LayerType, model.indexOfItem(multilayer)); + + // Mapper is looking on child; set property of child + setItem(layer); + w1.subscribe(m_mapper.get(), true); + w2.subscribe(m_mapper.get(), true); + QCOMPARE(w1.m_onPropertyChangeCount, 0); + QCOMPARE(w2.m_onPropertyChangeCount, 0); + + layer->setItemValue(LayerItem::P_THICKNESS, 1.0); + QCOMPARE(w1.m_onPropertyChangeCount, 1); + QCOMPARE(w2.m_onPropertyChangeCount, 1); + + w1.unsubscribe(m_mapper.get()); + layer->setItemValue(LayerItem::P_THICKNESS, 2.0); + QCOMPARE(w1.m_onPropertyChangeCount, 1); + QCOMPARE(w2.m_onPropertyChangeCount, 2); + +} + #endif -- GitLab