diff --git a/GUI/coregui/Models/JobModel.cpp b/GUI/coregui/Models/JobModel.cpp index d855ac967f15ce30d0eac6f65a375be71a092a34..5743f0579146e9516b4a137a85af009bf53bbff8 100644 --- a/GUI/coregui/Models/JobModel.cpp +++ b/GUI/coregui/Models/JobModel.cpp @@ -110,6 +110,16 @@ bool JobModel::hasUnfinishedJobs() return m_queue_data->hasUnfinishedJobs(); } +void JobModel::clear() +{ + QMap<QString, SessionItem *> jobs = getTopItemMap(Constants::JobItemType); + for(auto it = jobs.begin(); it!=jobs.end(); ++it) { + removeJob(it.value()->index()); + } + + SessionModel::clear(); +} + void JobModel::runJob(const QModelIndex &index) { m_queue_data->runJob(getJobItemForIndex(index)); @@ -125,6 +135,7 @@ void JobModel::removeJob(const QModelIndex &index) { qDebug() << "NJobModel::removeJob(const QModelIndex &index)"; JobItem *jobItem = getJobItemForIndex(index); + Q_ASSERT(jobItem); m_queue_data->removeJob(jobItem->getIdentifier()); emit aboutToDeleteJobItem(jobItem); diff --git a/GUI/coregui/Models/JobModel.h b/GUI/coregui/Models/JobModel.h index 75b1821b70bfbb3a77333fcf84e6fd2085e8892c..d997399488b0cdcecd19b4305e87e6f39994d27a 100644 --- a/GUI/coregui/Models/JobModel.h +++ b/GUI/coregui/Models/JobModel.h @@ -48,6 +48,8 @@ public: bool hasUnfinishedJobs(); + void clear(); + signals: void selectionChanged(JobItem *item); void aboutToDeleteJobItem(JobItem *item); diff --git a/GUI/coregui/Models/ModelMapper.cpp b/GUI/coregui/Models/ModelMapper.cpp index 348597cb030cd8d7e95603f00d2b7bf70011cdaf..55f3da04154c17c7893c85c0f31dc189072f44b6 100644 --- a/GUI/coregui/Models/ModelMapper.cpp +++ b/GUI/coregui/Models/ModelMapper.cpp @@ -37,39 +37,51 @@ void ModelMapper::setItem(SessionItem *item) } } -void ModelMapper::setOnValueChange(std::function<void ()> f) +void ModelMapper::setOnValueChange(std::function<void(void)> f, const void *caller) { - m_onValueChange.push_back(f); + m_onValueChange.push_back(call_t(f, caller)); } -void ModelMapper::setOnPropertyChange(std::function<void (QString)> f) +void ModelMapper::setOnPropertyChange(std::function<void(QString)> f, const void *caller) { - m_onPropertyChange.push_back(f); + m_onPropertyChange.push_back(call_str_t(f, caller)); } -void ModelMapper::setOnChildPropertyChange(std::function<void (SessionItem *, QString)> f) +void ModelMapper::setOnChildPropertyChange(std::function<void (SessionItem *, QString)> f, const void *caller) { - m_onChildPropertyChange.push_back(f); + m_onChildPropertyChange.push_back(call_item_str_t(f, caller)); } -void ModelMapper::setOnParentChange(std::function<void (SessionItem *)> f) +void ModelMapper::setOnParentChange(std::function<void (SessionItem *)> f, const void *caller) { - m_onParentChange.push_back(f); + m_onParentChange.push_back(call_item_t(f, caller)); } -void ModelMapper::setOnChildrenChange(std::function<void(SessionItem *)> f) +void ModelMapper::setOnChildrenChange(std::function<void(SessionItem *)> f, const void *caller) { - m_onChildrenChange.push_back(f); + m_onChildrenChange.push_back(call_item_t(f, caller)); } -void ModelMapper::setOnSiblingsChange(std::function<void ()> f) +void ModelMapper::setOnSiblingsChange(std::function<void ()> f, const void *caller) { - m_onSiblingsChange.push_back(f); + m_onSiblingsChange.push_back(call_t(f, caller)); } -void ModelMapper::setOnAnyChildChange(std::function<void (SessionItem *)> f) +void ModelMapper::setOnAnyChildChange(std::function<void (SessionItem *)> f, const void *caller) { - m_onAnyChildChange.push_back(f); + m_onAnyChildChange.push_back(call_item_t(f, caller)); +} + +//! Cancells all subscribtion of given caller +void ModelMapper::unsubscribe(const void *caller) +{ + clean_container(m_onValueChange, caller); + clean_container(m_onPropertyChange, caller); + clean_container(m_onChildPropertyChange, caller); + clean_container(m_onParentChange, caller); + clean_container(m_onChildrenChange, caller); + clean_container(m_onSiblingsChange, caller); + clean_container(m_onAnyChildChange, caller); } void ModelMapper::setModel(SessionModel *model) @@ -113,63 +125,70 @@ void ModelMapper::callOnValueChange() { if (m_active && m_onValueChange.size() > 0) { for (auto f : m_onValueChange) { - f(); + f.first(); } } + if(m_active) emit valueChange(); } void ModelMapper::callOnPropertyChange(const QString &name) { if (m_active && m_onPropertyChange.size() > 0) { for (auto f : m_onPropertyChange) { - f(name); + f.first(name); } } + if(m_active) emit propertyChange(name); } void ModelMapper::callOnChildPropertyChange(SessionItem *item, const QString &name) { if (m_active && m_onChildPropertyChange.size() > 0) { for (auto f : m_onChildPropertyChange) { - f(item, name); + f.first(item, name); } } + if(m_active) emit childPropertyChange(item, name); } void ModelMapper::callOnParentChange(SessionItem *new_parent) { if (m_active && m_onParentChange.size() > 0) { for (auto f : m_onParentChange) { - f(new_parent); + f.first(new_parent); } } + if(m_active) emit parentChange(new_parent); } void ModelMapper::callOnChildrenChange(SessionItem *item) { if (m_active && m_onChildrenChange.size() > 0) { for (auto f : m_onChildrenChange) { - f(item); + f.first(item); } } + if(m_active) emit childrenChange(item); } void ModelMapper::callOnSiblingsChange() { if (m_active && m_onSiblingsChange.size() > 0) { for (auto f : m_onSiblingsChange) { - f(); + f.first(); } } + if(m_active) emit siblingsChange(); } void ModelMapper::callOnAnyChildChange(SessionItem *item) { if (m_active && m_onAnyChildChange.size() > 0) { for (auto f : m_onAnyChildChange) { - f(item); + f.first(item); } } + if(m_active) emit anyChildChange(item); } void ModelMapper::clearMapper() @@ -224,6 +243,7 @@ void ModelMapper::onDataChanged(const QModelIndex &topLeft, const QModelIndex &b void ModelMapper::onRowsInserted(const QModelIndex &parent, int first, int /*last*/) { + qDebug() << "OOO-> ModelMapper::onRowsInserted -> begin()"; Q_ASSERT(m_item); SessionItem *newChild = m_model->itemForIndex(parent.child(first, 0)); @@ -264,14 +284,16 @@ void ModelMapper::onRowsInserted(const QModelIndex &parent, int first, int /*las callOnAnyChildChange(newChild); } + qDebug() << "OOO-> ModelMapper::onRowsInserted -> end()"; } void ModelMapper::onBeginRemoveRows(const QModelIndex &parent, int first, int /*last*/) { + qDebug() << "OOO-> ModelMapper::onBeginRemoveRows -> begin()"; Q_ASSERT(m_item); SessionItem *oldChild = m_model->itemForIndex(parent.child(first, 0)); - qDebug() << "AAA 1.1" << m_item << m_item->displayName(); - qDebug() << "AAA 1.2" << oldChild << oldChild->displayName(); +// qDebug() << "AAA 1.1" << m_item << m_item->displayName(); +// qDebug() << "AAA 1.2" << oldChild << oldChild->displayName(); int nestling = nestlingDepth(m_model->itemForIndex(parent)); @@ -305,14 +327,16 @@ void ModelMapper::onBeginRemoveRows(const QModelIndex &parent, int first, int /* if (m_item == oldChild) { m_aboutToDelete = parent.child(first, 0); + qDebug() << "---------------------------->>>"; + qDebug() << "ModelMapper::onBeginRemoveRows() -> preparing m_aboutToDelete" << m_aboutToDelete; } - + qDebug() << "OOO-> ModelMapper::onBeginRemoveRows -> end()"; } void ModelMapper::onRowRemoved(const QModelIndex &parent, int first, int /*last*/) { - + qDebug() << "OOO-> ModelMapper::onRowRemoved -> begin()"; int nestling = nestlingDepth(m_model->itemForIndex(parent)); @@ -323,6 +347,11 @@ void ModelMapper::onRowRemoved(const QModelIndex &parent, int first, int /*last* } if(m_aboutToDelete.isValid() && m_aboutToDelete == parent.child(first, 0)) { + qDebug() << "ModelMapper::onRowRemoved() -> clearingMapper"; clearMapper(); + qDebug() << "<<<- done ---------------------------"; + } + qDebug() << "OOO-> ModelMapper::onRowRemoved -> end()"; + } diff --git a/GUI/coregui/Models/ModelMapper.h b/GUI/coregui/Models/ModelMapper.h index 9dc5cf69df45083d9a59187098c483370c5ee7c1..d685d6ed2537f3547adda028da77e2494083f876 100644 --- a/GUI/coregui/Models/ModelMapper.h +++ b/GUI/coregui/Models/ModelMapper.h @@ -23,6 +23,7 @@ #include <QVector> #include <functional> #include <QModelIndex> +#include <vector> class QModelIndex; class SessionModel; @@ -37,22 +38,33 @@ public: void setItem(SessionItem* item); - void setOnValueChange(std::function<void(void)> f); + void setOnValueChange(std::function<void(void)> f, const void *caller=0); - void setOnPropertyChange(std::function<void(QString)> f); + void setOnPropertyChange(std::function<void(QString)> f, const void *caller=0); - void setOnChildPropertyChange(std::function<void(SessionItem*,QString)> f); + void setOnChildPropertyChange(std::function<void(SessionItem*,QString)> f, const void *caller=0); - void setOnParentChange(std::function<void(SessionItem*)> f); + void setOnParentChange(std::function<void(SessionItem*)> f, const void *caller=0); - void setOnChildrenChange(std::function<void(SessionItem*)> f); + void setOnChildrenChange(std::function<void(SessionItem*)> f, const void *caller=0); - void setOnSiblingsChange(std::function<void(void)> f); + void setOnSiblingsChange(std::function<void(void)> f, const void *caller=0); - void setOnAnyChildChange(std::function<void(SessionItem*)> f); + void setOnAnyChildChange(std::function<void(SessionItem*)> f, const void *caller=0); void setActive(bool state) {m_active = state;} + void unsubscribe(const void *caller); + +signals: + void valueChange(); + void propertyChange(const QString &name); + void childPropertyChange(SessionItem *item, const QString &name); + void parentChange(SessionItem *item); + void childrenChange(SessionItem *item); + void siblingsChange(); + void anyChildChange(SessionItem *item); + public slots: void onDataChanged(const QModelIndex & topLeft, const QModelIndex & bottomRight, const QVector<int> & roles = QVector<int> ()); @@ -64,6 +76,9 @@ public slots: void onRowRemoved(const QModelIndex & parent, int first, int last); private: + //! removes all callbacks related to given caller + template<class U> void clean_container(U& v, const void *caller); + void setModel(SessionModel *model); int nestlingDepth(SessionItem* item, int level = 0); @@ -80,14 +95,29 @@ private: bool m_active; SessionModel *m_model; SessionItem *m_item; - std::vector<std::function<void(void)>> m_onValueChange; - std::vector<std::function<void(QString)>> m_onPropertyChange; - std::vector<std::function<void(SessionItem*,QString)>> m_onChildPropertyChange; - std::vector<std::function<void(SessionItem*)>> m_onParentChange; - std::vector<std::function<void(SessionItem*)>> m_onChildrenChange; - std::vector<std::function<void(void)>> m_onSiblingsChange; - std::vector<std::function<void(SessionItem*)>> m_onAnyChildChange; + + using call_t = std::pair<std::function<void(void)>, const void *>; + using call_str_t = std::pair<std::function<void(QString)>, const void *>; + using call_item_t = std::pair<std::function<void(SessionItem *)>, const void *>; + using call_item_str_t = std::pair<std::function<void(SessionItem*,QString)>, const void *>; + + std::vector<call_t> m_onValueChange; + std::vector<call_str_t> m_onPropertyChange; + std::vector<call_item_str_t> m_onChildPropertyChange; + std::vector<call_item_t> m_onParentChange; + std::vector<call_item_t> m_onChildrenChange; + std::vector<call_t> m_onSiblingsChange; + std::vector<call_item_t> m_onAnyChildChange; QModelIndex m_aboutToDelete; }; + +template<class U> +inline void ModelMapper::clean_container(U& v, const void *caller) { + v.erase(std::remove_if(v.begin(), v.end(), + [caller](typename U::value_type const &x) -> bool { return (x.second == caller ? true : false); }), + v.end()); +} + + #endif diff --git a/GUI/coregui/Models/SessionModel.h b/GUI/coregui/Models/SessionModel.h index 8a8267396177f6ea90883bcf14ba9d3c6214a542..55fb504d7e9c8f379f6e75a4b20fdaa0ffb52f59 100644 --- a/GUI/coregui/Models/SessionModel.h +++ b/GUI/coregui/Models/SessionModel.h @@ -79,7 +79,7 @@ public: QVector<QString> getAcceptableDefaultItemTypes(const QModelIndex &parent) const; - void clear(); + virtual void clear(); void load(const QString &filename = QString()); void save(const QString &filename = QString()); diff --git a/GUI/coregui/Views/FitWidgets/FitTools.h b/GUI/coregui/Views/FitWidgets/FitTools.h index a8ba6510942bb50e4a756f053589e50f12a64a9f..f53bc114b6a836e8a90cf671c7ff13931c4b7243 100644 --- a/GUI/coregui/Views/FitWidgets/FitTools.h +++ b/GUI/coregui/Views/FitWidgets/FitTools.h @@ -23,7 +23,6 @@ class JobItem; class JobModel; -class ModelMapper; class QHBoxLayout; class QItemSelectionModel; class QPushButton; diff --git a/GUI/coregui/Views/InfoWidgets/DistributionEditor.cpp b/GUI/coregui/Views/InfoWidgets/DistributionEditor.cpp index bad06f988e101f53a64085df6447c5d3492bff22..98c9a6ba68c1a20d31c35765cedc71fd71815748 100644 --- a/GUI/coregui/Views/InfoWidgets/DistributionEditor.cpp +++ b/GUI/coregui/Views/InfoWidgets/DistributionEditor.cpp @@ -57,33 +57,37 @@ DistributionEditor::DistributionEditor(QWidget *parent) setLayout(mainLayout); } +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; - ModelMapper *mapper = new ModelMapper(this); - mapper->setItem(m_item); - mapper->setOnPropertyChange( - [this](const QString &name) - { - onPropertyChanged(name); - }); + } else { + if(m_item) + m_item->mapper()->unsubscribe(this); + 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 cf5967f80ffbb8f4c76e07438dcf2877fc18bf4f..506863eb24ffed86449c1a22a1223bb65939c6ce 100644 --- a/GUI/coregui/Views/InfoWidgets/DistributionEditor.h +++ b/GUI/coregui/Views/InfoWidgets/DistributionEditor.h @@ -19,6 +19,7 @@ #include <QWidget> #include "qcustomplot.h" +#include <memory> class QGroupBox; class DistributionWidget; @@ -32,7 +33,8 @@ class DistributionEditor : public QWidget Q_OBJECT public: DistributionEditor(QWidget *parent = 0); - virtual ~DistributionEditor() {} + virtual ~DistributionEditor(); + void setItem(SessionItem *item); void plotItem(SessionItem *item); void setNameOfEditor(QString name); diff --git a/GUI/coregui/Views/InfoWidgets/DistributionWidget.cpp b/GUI/coregui/Views/InfoWidgets/DistributionWidget.cpp index 4cc0f6e2991ac7e396719ced916754c558e5e034..8a3b13f4de159761057dd0b84e1eadbc0a48b16f 100644 --- a/GUI/coregui/Views/InfoWidgets/DistributionWidget.cpp +++ b/GUI/coregui/Views/InfoWidgets/DistributionWidget.cpp @@ -69,26 +69,28 @@ DistributionWidget::DistributionWidget(QWidget *parent) void DistributionWidget::setItem(DistributionItem *item) { - if (m_item == item) + if (m_item == item) { return; - if (m_item) { - disconnect(); - } - m_item = item; - - if (!m_item) - return; + } else { + if (m_item) { + disconnect(); + m_item->mapper()->unsubscribe(this); + } - plotItem(); + m_item = item; + if (!m_item) return; - ModelMapper *mapper = new ModelMapper(this); - mapper->setItem(item); - mapper->setOnPropertyChange( - [this](QString) - { plotItem(); - }); + + m_item->mapper()->setOnPropertyChange( + [this](QString) + { + plotItem(); + }, this); + + } + } void DistributionWidget::plotItem() diff --git a/GUI/coregui/Views/InfoWidgets/DistributionWidget.h b/GUI/coregui/Views/InfoWidgets/DistributionWidget.h index 0c9ddd29e42c2647cd63127f70dcbf646dda9eb5..4dd866e766cbff23574d05778ff3d27e8d9a4910 100644 --- a/GUI/coregui/Views/InfoWidgets/DistributionWidget.h +++ b/GUI/coregui/Views/InfoWidgets/DistributionWidget.h @@ -20,6 +20,7 @@ #include <QWidget> #include "WarningSignWidget.h" #include "qcustomplot.h" +#include <memory> class SessionItem; class AwesomePropertyEditor; diff --git a/GUI/coregui/Views/InstrumentWidgets/DetectorEditorWidget.cpp b/GUI/coregui/Views/InstrumentWidgets/DetectorEditorWidget.cpp index 2f8b99f1cdf8afa8868928299d25e4f8bbe65904..0c78091d2b370be110f595fa06a3d3ff4303d1d5 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; - ModelMapper *mapper = new ModelMapper(this); - mapper->setItem(m_detectorItem); - 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 985293645b092336215d63881395f2cbff21da06..a76fe07b75c57f3e89613fd158cbaa746da4389b 100644 --- a/GUI/coregui/Views/InstrumentWidgets/DetectorEditorWidget.h +++ b/GUI/coregui/Views/InstrumentWidgets/DetectorEditorWidget.h @@ -19,6 +19,7 @@ #include "WinDllMacros.h" #include <QWidget> +#include <memory> class GroupInfoBox; class DetectorItem; diff --git a/GUI/coregui/Views/InstrumentWidgets/RectangularDetectorWidget.cpp b/GUI/coregui/Views/InstrumentWidgets/RectangularDetectorWidget.cpp index b174ec486ad47ae4bf3b52a66b2bbb84ab2f5dd0..82e1663758eeada9913c38f28d7f40e2dfa85d96 100644 --- a/GUI/coregui/Views/InstrumentWidgets/RectangularDetectorWidget.cpp +++ b/GUI/coregui/Views/InstrumentWidgets/RectangularDetectorWidget.cpp @@ -60,18 +60,24 @@ RectangularDetectorWidget::~RectangularDetectorWidget() void RectangularDetectorWidget::setDetectorItem(RectangularDetectorItem *detectorItem) { - m_detectorItem = detectorItem; - if(!m_detectorItem) return; - - ModelMapper *mapper = new ModelMapper(this); - mapper->setItem(m_detectorItem); - 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(); + } } void RectangularDetectorWidget::onPropertyChanged(const QString &propertyName) diff --git a/GUI/coregui/Views/InstrumentWidgets/RectangularDetectorWidget.h b/GUI/coregui/Views/InstrumentWidgets/RectangularDetectorWidget.h index 0015972c2aa6c98baea62bc233c5adc53f3d8658..5268cda7a451f02a8a25923b5a5d6c83c8453954 100644 --- a/GUI/coregui/Views/InstrumentWidgets/RectangularDetectorWidget.h +++ b/GUI/coregui/Views/InstrumentWidgets/RectangularDetectorWidget.h @@ -19,6 +19,7 @@ #include "WinDllMacros.h" #include <QWidget> +#include <memory> class ColumnResizer; class GroupInfoBox; @@ -61,7 +62,6 @@ private: QGridLayout *m_gridLayout; RectangularDetectorItem *m_detectorItem; - }; #endif diff --git a/GUI/coregui/Views/IntensityDataWidgets/ColorMapPlot.cpp b/GUI/coregui/Views/IntensityDataWidgets/ColorMapPlot.cpp index 272167802dde7e1d15b73b6829c086f177d1f648..bb65c652877068ef5903604d319c6fc41e663aa9 100644 --- a/GUI/coregui/Views/IntensityDataWidgets/ColorMapPlot.cpp +++ b/GUI/coregui/Views/IntensityDataWidgets/ColorMapPlot.cpp @@ -35,46 +35,45 @@ ColorMapPlot::ColorMapPlot(QWidget *parent) setMouseTracking(false); m_customPlot->setMouseTracking(false); -// setFixedColorMapMargins(); + // setFixedColorMapMargins(); +} + +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; - } -// if (m_item) { -// disconnect(m_item, SIGNAL(intensityModified()), this, -// SLOT(onIntensityModified())); -// } + } else { + if(m_item) + m_item->mapper()->unsubscribe(this); - m_item = item; + m_item = item; + if(!m_item) return; - if (!m_item) - return; + plotItem(m_item); - 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); + + } -// connect(m_item, SIGNAL(intensityModified()), this, -// SLOT(onIntensityModified())); - ModelMapper *mapper = new ModelMapper(this); - mapper->setItem(item); - mapper->setOnPropertyChange( - [this](const QString &name) - { - onPropertyChanged(name); - onIntensityModified(); - }); - 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 @@ -133,8 +132,6 @@ void ColorMapPlot::drawLinesOverTheMap() //! switches visibility of two crossed lines void ColorMapPlot::showLinesOverTheMap(bool isVisible) { - m_customPlot->setMouseTracking(isVisible); - if (m_customPlot->graph(0) && m_customPlot->graph(1)) { m_customPlot->graph(0)->setVisible(isVisible); m_customPlot->graph(1)->setVisible(isVisible); @@ -223,7 +220,6 @@ void ColorMapPlot::onMouseMove(QMouseEvent *event) double xPos = m_customPlot->xAxis->pixelToCoord(point.x()); double yPos = m_customPlot->yAxis->pixelToCoord(point.y()); -// qDebug() << "AAA ColorMapPlot::onMouseMove() " << point << "xpos:" << xPos << "yPos:" << yPos; if (m_customPlot->xAxis->range().contains(xPos) && m_customPlot->yAxis->range().contains(yPos)) { diff --git a/GUI/coregui/Views/IntensityDataWidgets/ColorMapPlot.h b/GUI/coregui/Views/IntensityDataWidgets/ColorMapPlot.h index ec649bea8a07047f5eb46ff2a4b46cab0138acc7..83bb2c2bbe9fcc74a8c78abebe8b258e51b772e7 100644 --- a/GUI/coregui/Views/IntensityDataWidgets/ColorMapPlot.h +++ b/GUI/coregui/Views/IntensityDataWidgets/ColorMapPlot.h @@ -22,6 +22,7 @@ #include <QWidget> #include <QMap> #include <QPoint> +#include <memory> class IntensityDataItem; class QCustomPlot; @@ -34,6 +35,7 @@ class BA_CORE_API_ ColorMapPlot : public QWidget Q_OBJECT public: explicit ColorMapPlot(QWidget *parent = 0); + ~ColorMapPlot(); QSize sizeHint() const { return QSize(500, 400); } QSize minimumSizeHint() const { return QSize(128, 128); } diff --git a/GUI/coregui/Views/IntensityDataWidgets/HorizontalSlicePlot.cpp b/GUI/coregui/Views/IntensityDataWidgets/HorizontalSlicePlot.cpp index c6bee939eda62006dab2d4cde41e0c71640015ee..24ab840cdf4ca4d36fe514947d816d0a7024d739 100644 --- a/GUI/coregui/Views/IntensityDataWidgets/HorizontalSlicePlot.cpp +++ b/GUI/coregui/Views/IntensityDataWidgets/HorizontalSlicePlot.cpp @@ -26,7 +26,7 @@ HorizontalSlicePlot::HorizontalSlicePlot(QWidget *parent) , m_customPlot(0) , m_bars(0) , m_item(0) - , m_mapper(0) +// , m_mapper(0) { m_customPlot = new QCustomPlot(); m_bars = new QCPBars(m_customPlot->xAxis, m_customPlot->yAxis); @@ -42,37 +42,26 @@ 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))); - } - - m_item = item; - - if (!m_item) return; + } else { + if(m_item) + m_item->mapper()->unsubscribe(this); - plotItem(m_item); + m_item = item; + if (!m_item) return; -// connect(m_item, SIGNAL(propertyChanged(QString)), -// this, SLOT(onPropertyChanged(QString))); - if (m_mapper) - m_mapper->deleteLater(); - m_mapper = new ModelMapper(this); - 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); - }); + 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); + } -// 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 4f8d2231dfe6c4ab205d683a941e7447cd98499c..dfab4e34f1ce0ed8cc9f210891bfbe9568eb1284 100644 --- a/GUI/coregui/Views/IntensityDataWidgets/HorizontalSlicePlot.h +++ b/GUI/coregui/Views/IntensityDataWidgets/HorizontalSlicePlot.h @@ -19,10 +19,11 @@ #include "WinDllMacros.h" #include <QWidget> +#include <memory> + 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) @@ -57,7 +58,6 @@ private: QCustomPlot *m_customPlot; QCPBars *m_bars; IntensityDataItem *m_item; - ModelMapper *m_mapper; }; #endif diff --git a/GUI/coregui/Views/IntensityDataWidgets/IntensityDataPlotWidget.cpp b/GUI/coregui/Views/IntensityDataWidgets/IntensityDataPlotWidget.cpp index 20e760f5864c7696fb88ba0b87ce575c3fcd42bc..91a91388d3f1c860bdd3c558eb6123e52df5c575 100644 --- a/GUI/coregui/Views/IntensityDataWidgets/IntensityDataPlotWidget.cpp +++ b/GUI/coregui/Views/IntensityDataWidgets/IntensityDataPlotWidget.cpp @@ -43,7 +43,7 @@ IntensityDataPlotWidget::IntensityDataPlotWidget(QWidget *parent) , m_leftHistogramArea(150) , m_bottomHistogramArea(150) , m_item(0) - , m_mapper(0) +// , m_mapper(0) { setObjectName(QStringLiteral("IntensityDataPlotWidget")); setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); @@ -86,42 +86,42 @@ IntensityDataPlotWidget::IntensityDataPlotWidget(QWidget *parent) setupContextMenuActions(); } +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); - 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 5eda1bc952ac5f7dfacef55a1359b31aa4436da3..042018d8e2d780ed07a11a3eefde8009cd698ca2 100644 --- a/GUI/coregui/Views/IntensityDataWidgets/IntensityDataPlotWidget.h +++ b/GUI/coregui/Views/IntensityDataWidgets/IntensityDataPlotWidget.h @@ -19,6 +19,7 @@ #include "WinDllMacros.h" #include <QWidget> +#include <memory> class QSplitter; class HorizontalSlicePlot; @@ -26,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. @@ -35,6 +35,7 @@ class BA_CORE_API_ IntensityDataPlotWidget : public QWidget Q_OBJECT public: explicit IntensityDataPlotWidget(QWidget *parent = 0); + ~IntensityDataPlotWidget(); QSize sizeHint() const { return QSize(800, 800); } QSize minimumSizeHint() const { return QSize(512, 512); } @@ -80,7 +81,6 @@ private: int m_leftHistogramArea; int m_bottomHistogramArea; IntensityDataItem *m_item; - ModelMapper *m_mapper; }; #endif diff --git a/GUI/coregui/Views/IntensityDataWidgets/IntensityDataWidget.cpp b/GUI/coregui/Views/IntensityDataWidgets/IntensityDataWidget.cpp index 783995df10d5e2b5f3b05dade2bf8b5b56fc0584..2887cf63feafd3ee9fc378583e73cc9d9d7c3d41 100644 --- a/GUI/coregui/Views/IntensityDataWidgets/IntensityDataWidget.cpp +++ b/GUI/coregui/Views/IntensityDataWidgets/IntensityDataWidget.cpp @@ -59,14 +59,27 @@ 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; - m_currentItem = item; + setPropertyPanelVisible(m_currentItem->getItemValue(IntensityDataItem::P_PROPERTY_PANEL_FLAG).toBool()); - if (!m_currentItem) return; + 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); + } - updateItem(m_currentItem); } void IntensityDataWidget::togglePropertyPanel() @@ -88,20 +101,6 @@ void IntensityDataWidget::setPropertyPanelVisible(bool visible) m_propertyWidget->setVisible(visible); } -void IntensityDataWidget::updateItem(IntensityDataItem *item) -{ - setPropertyPanelVisible(item->getItemValue(IntensityDataItem::P_PROPERTY_PANEL_FLAG).toBool()); - ModelMapper *mapper = new ModelMapper(this); - mapper->setItem(item); - 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() { if(m_currentItem) { diff --git a/GUI/coregui/Views/IntensityDataWidgets/IntensityDataWidget.h b/GUI/coregui/Views/IntensityDataWidgets/IntensityDataWidget.h index 0770ad56eee81657224c0f91d36afb3e0653bc02..abe43abaec27d1871178d43b7a0ac5521ed5ff21 100644 --- a/GUI/coregui/Views/IntensityDataWidgets/IntensityDataWidget.h +++ b/GUI/coregui/Views/IntensityDataWidgets/IntensityDataWidget.h @@ -19,6 +19,7 @@ #include "WinDllMacros.h" #include <QWidget> +#include <memory> class IntensityDataPropertyWidget; class IntensityDataItem; @@ -47,16 +48,10 @@ public slots: void toggleProjections(); void setPropertyPanelVisible(bool visible); - private: - void updateItem(IntensityDataItem *item); - IntensityDataPlotWidget *m_plotWidget; IntensityDataPropertyWidget *m_propertyWidget; IntensityDataItem *m_currentItem; }; - - - #endif diff --git a/GUI/coregui/Views/IntensityDataWidgets/VerticalSlicePlot.cpp b/GUI/coregui/Views/IntensityDataWidgets/VerticalSlicePlot.cpp index edf8bfc4d41a1c2d7a5e7ef810526ac79a4473b5..2b6d84319724d1d2fcf6ca45c7389b3fb24615c6 100644 --- a/GUI/coregui/Views/IntensityDataWidgets/VerticalSlicePlot.cpp +++ b/GUI/coregui/Views/IntensityDataWidgets/VerticalSlicePlot.cpp @@ -26,7 +26,7 @@ VerticalSlicePlot::VerticalSlicePlot(QWidget *parent) , m_customPlot(0) , m_bars(0) , m_item(0) - , m_mapper(0) +// , m_mapper(0) { m_customPlot = new QCustomPlot(); m_bars = new QCPBars(m_customPlot->yAxis, m_customPlot->xAxis); @@ -42,36 +42,25 @@ 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))); - } - - m_item = item; - - if (!m_item) return; + } else { + if(m_item) + m_item->mapper()->unsubscribe(this); - plotItem(m_item); - if (m_mapper) - m_mapper->deleteLater(); - m_mapper = new ModelMapper(this); - 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_item = item; + if (!m_item) return; -// connect(m_item, SIGNAL(propertyChanged(QString)), -// this, SLOT(onPropertyChanged(QString))); + plotItem(m_item); -// connect(m_item, SIGNAL(subItemPropertyChanged(QString,QString)), -// this, SLOT(onSubItemPropertyChanged(QString,QString))); + m_item->mapper()->setOnChildPropertyChange( + [this](SessionItem* item, const QString name) + { + if (item->parent() && item->parent()->modelType() == Constants::GroupItemType) + onSubItemPropertyChanged(item->itemName(), name); + }, this); + } } diff --git a/GUI/coregui/Views/IntensityDataWidgets/VerticalSlicePlot.h b/GUI/coregui/Views/IntensityDataWidgets/VerticalSlicePlot.h index f6a57634024c2322febc46ccbaef916bdc2bef8e..345ff481c6ada1b853de0c6469f7a122e2cc6f91 100644 --- a/GUI/coregui/Views/IntensityDataWidgets/VerticalSlicePlot.h +++ b/GUI/coregui/Views/IntensityDataWidgets/VerticalSlicePlot.h @@ -19,10 +19,11 @@ #include "WinDllMacros.h" #include <QWidget> +#include <memory> + class IntensityDataItem; class QCustomPlot; class QCPBars; -class ModelMapper; //! Slice of 2D IntensityData along x-axis class BA_CORE_API_ VerticalSlicePlot : public QWidget @@ -56,7 +57,6 @@ private: QCustomPlot *m_customPlot; QCPBars *m_bars; IntensityDataItem *m_item; - ModelMapper *m_mapper; }; diff --git a/GUI/coregui/Views/JobWidgets/JobPropertiesWidget.cpp b/GUI/coregui/Views/JobWidgets/JobPropertiesWidget.cpp index 65436c1f26c864ee432398bd421e3e06b6dbdd32..7f3f44930f6349fabb318c93216186bf98836879 100644 --- a/GUI/coregui/Views/JobWidgets/JobPropertiesWidget.cpp +++ b/GUI/coregui/Views/JobWidgets/JobPropertiesWidget.cpp @@ -32,7 +32,6 @@ JobPropertiesWidget::JobPropertiesWidget(QWidget *parent) , m_propertyEditor(0) , m_commentsEditor(0) , m_block_update(false) - , m_mapper(0) { setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); setWindowTitle(QLatin1String("Job Properties")); @@ -86,24 +85,26 @@ 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); - m_mapper->setItem(jobItem); - m_mapper->setOnPropertyChange( - [this](const QString &name) - { - if(name == JobItem::P_COMMENTS) { - updateItem(m_currentItem); - } - }); + updateItem(m_currentItem); + + m_currentItem->mapper()->setOnPropertyChange( + [this](const QString &name) + { + if(name == JobItem::P_COMMENTS) { + updateItem(m_currentItem); + } + }, this); + } } diff --git a/GUI/coregui/Views/JobWidgets/JobPropertiesWidget.h b/GUI/coregui/Views/JobWidgets/JobPropertiesWidget.h index 880b09c9a474649d2117d4075af529f3c6d2b227..7ae55ad03d725edfb6b0e8d383cb50663e8761b3 100644 --- a/GUI/coregui/Views/JobWidgets/JobPropertiesWidget.h +++ b/GUI/coregui/Views/JobWidgets/JobPropertiesWidget.h @@ -20,14 +20,13 @@ #include "WinDllMacros.h" #include <QWidget> #include <QMap> +#include <memory> class JobModel; class JobItem; class QTextEdit; class QTabWidget; -//class AwesomePropertyEditor; class ComponentEditor; -class ModelMapper; //! Widget to show and change properties of currently selected JobItem //! Left buttom corner of JobView @@ -55,11 +54,9 @@ private: JobModel *m_jobModel; JobItem *m_currentItem; QTabWidget *m_tabWidget; -// AwesomePropertyEditor *m_propertyEditor; ComponentEditor *m_propertyEditor; QTextEdit *m_commentsEditor; bool m_block_update; - ModelMapper *m_mapper; }; #endif diff --git a/GUI/coregui/Views/JobWidgets/JobRealTimeWidget.cpp b/GUI/coregui/Views/JobWidgets/JobRealTimeWidget.cpp index fa059eff4b06d7796365819f223bc06c666f8fec..c78d8e1e6a277562a9a64d61af09303259d78108 100644 --- a/GUI/coregui/Views/JobWidgets/JobRealTimeWidget.cpp +++ b/GUI/coregui/Views/JobWidgets/JobRealTimeWidget.cpp @@ -180,6 +180,8 @@ bool JobRealTimeWidget::isValidJobItem(JobItem *item) void JobRealTimeWidget::onJobItemDelete(JobItem *item) { //qDebug() << "JobOutputDataWidget::onJobItemDelete()"; + if(item == m_currentJobItem) m_currentJobItem=0; + ModelTuningWidget *widget = m_jobItemToTuningWidget[item]; if( !widget ) { // this is the case when user removes failed job which doesn't have propper widget diff --git a/GUI/coregui/Views/JobWidgets/ModelTuningDelegate.cpp b/GUI/coregui/Views/JobWidgets/ModelTuningDelegate.cpp index fafe8c37c91083c1137b5c7e18b9fdfab72db19b..00cb1e507bc3a11eed218b136f20f1e6a98f01dc 100644 --- a/GUI/coregui/Views/JobWidgets/ModelTuningDelegate.cpp +++ b/GUI/coregui/Views/JobWidgets/ModelTuningDelegate.cpp @@ -183,12 +183,10 @@ QWidget *ModelTuningDelegate::createEditor(QWidget *parent, m_contentLayout->addWidget(m_valueBox); m_contentLayout->addWidget(m_slider); - ModelMapper *mapper = new ModelMapper(m_contentWidget); - mapper->setItem(m_currentItem); - mapper->setOnValueChange( - [this](){ - m_valueBox->setValue(m_currentItem->value().toDouble()); - }); + m_currentItem->mapper()->setOnValueChange( + [this](){ + m_valueBox->setValue(m_currentItem->value().toDouble()); + }, this); m_contentWidget->setLayout(m_contentLayout); diff --git a/GUI/coregui/Views/JobWidgets/ModelTuningDelegate.h b/GUI/coregui/Views/JobWidgets/ModelTuningDelegate.h index eafc7865463a9632a438eaee6dc7b21e537bf16f..635b1e4163f1ab595c3fc1a7fe49fb498c85ec21 100644 --- a/GUI/coregui/Views/JobWidgets/ModelTuningDelegate.h +++ b/GUI/coregui/Views/JobWidgets/ModelTuningDelegate.h @@ -19,6 +19,7 @@ #include <QItemDelegate> #include "AttLimits.h" +#include <memory> class QDoubleSpinBox; class QHBoxLayout; diff --git a/GUI/coregui/Views/JobWidgets/ModelTuningWidget.cpp b/GUI/coregui/Views/JobWidgets/ModelTuningWidget.cpp index 236531faf8487358f177cbc4dd2f4a3b323383b9..c522f6fb49aa7a2da437a37c2a7bd2dedd0def22 100644 --- a/GUI/coregui/Views/JobWidgets/ModelTuningWidget.cpp +++ b/GUI/coregui/Views/JobWidgets/ModelTuningWidget.cpp @@ -51,7 +51,7 @@ ModelTuningWidget::ModelTuningWidget(JobModel *jobModel, QWidget *parent) , m_sliderSettingsWidget(0) , m_delegate(new ModelTuningDelegate) , m_warningSign(0) - , m_mapper(0) +// , m_mapper(0) , m_fitTools(new FitTools(jobModel, parent)) { setMinimumSize(128, 128); @@ -95,27 +95,26 @@ ModelTuningWidget::~ModelTuningWidget() void ModelTuningWidget::setCurrentItem(JobItem *item) { - if (m_currentJobItem == item) return; - + if (m_currentJobItem == item) { + return; - m_currentJobItem = item; + } else { + if(m_currentJobItem) + m_currentJobItem->mapper()->unsubscribe(this); - if (!m_currentJobItem) return; + m_currentJobItem = item; + if (!m_currentJobItem) return; - updateParameterModel(); + updateParameterModel(); - if (m_mapper) - m_mapper->deleteLater(); - m_mapper = new ModelMapper(this); - m_mapper->setItem(item); - m_mapper->setOnPropertyChange( + m_currentJobItem->mapper()->setOnPropertyChange( [this](const QString &name) - { - onPropertyChanged(name); - }); + { + onPropertyChanged(name); + }, this); - - m_fitTools->setCurrentItem(item, m_treeView->selectionModel()); + m_fitTools->setCurrentItem(m_currentJobItem, 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 2de8840a5c1f1de25e0a14e6e02d0ec09af08306..dfa5fda876c236ce4b12d2520e0a8ca3c0744604 100644 --- a/GUI/coregui/Views/JobWidgets/ModelTuningWidget.h +++ b/GUI/coregui/Views/JobWidgets/ModelTuningWidget.h @@ -18,6 +18,7 @@ #define MODELTUNINGWIDGET_H #include <QWidget> +#include <memory> class JobItem; class SliderSettingsWidget; @@ -27,7 +28,6 @@ class QTreeView; class SampleModel; class InstrumentModel; class WarningSignWidget; -class ModelMapper; class SessionItem; class FitTools; @@ -63,7 +63,6 @@ private: QTreeView *m_treeView; ModelTuningDelegate *m_delegate; WarningSignWidget *m_warningSign; - ModelMapper *m_mapper; FitTools *m_fitTools; }; diff --git a/GUI/coregui/Views/MaskWidgets/IMaskView.cpp b/GUI/coregui/Views/MaskWidgets/IMaskView.cpp index f9a5f0683bf920c1df03b05229c50b35085a30dd..0497a08aa7f4a0f0323471eba788e7d207a9633a 100644 --- a/GUI/coregui/Views/MaskWidgets/IMaskView.cpp +++ b/GUI/coregui/Views/MaskWidgets/IMaskView.cpp @@ -27,12 +27,13 @@ IMaskView::IMaskView() : m_item(0) , m_adaptor(0) - , m_mapper(0) { connect(this, SIGNAL(xChanged()), this, SLOT(onChangedX())); connect(this, SIGNAL(yChanged()), this, SLOT(onChangedY())); } +IMaskView::~IMaskView(){} + QRectF IMaskView::boundingRect() const { return m_bounding_rect; @@ -40,43 +41,23 @@ 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 &))); - -// } + if(m_item == item) { + return; -// m_item = item; + } else { + if(m_item) + m_item->mapper()->unsubscribe(this); -// 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_item) return; - if (m_mapper) - m_mapper->deleteLater(); - - m_mapper = new ModelMapper(this); - m_mapper->setItem(item); - m_mapper->setOnPropertyChange( + m_item->mapper()->setOnPropertyChange( [this](const QString &name) { onPropertyChange(name); - }); - + }, this); } - - } SessionItem *IMaskView::getParameterizedItem() diff --git a/GUI/coregui/Views/MaskWidgets/IMaskView.h b/GUI/coregui/Views/MaskWidgets/IMaskView.h index b2cc42e01ad0e2cd68ca99996e5988d5fb4e7ddd..ac96da857e8259aae7af67c41870172450e7ab73 100644 --- a/GUI/coregui/Views/MaskWidgets/IMaskView.h +++ b/GUI/coregui/Views/MaskWidgets/IMaskView.h @@ -20,11 +20,11 @@ #include "WinDllMacros.h" #include "MaskEditorHelper.h" #include <QGraphicsObject> +#include <memory> class SessionItem; class ISceneAdaptor; class QPainter; -class ModelMapper; //! Main interface class for views representing MaskItems on graphics scene @@ -35,7 +35,7 @@ public: virtual int type() const { return MaskEditorHelper::IMASKVIEW; } IMaskView(); - virtual ~IMaskView(){} + virtual ~IMaskView(); QRectF boundingRect() const; @@ -72,7 +72,6 @@ protected: SessionItem *m_item; const ISceneAdaptor *m_adaptor; QRectF m_bounding_rect; - ModelMapper *m_mapper; }; diff --git a/GUI/coregui/Views/SampleDesigner/DesignerScene.cpp b/GUI/coregui/Views/SampleDesigner/DesignerScene.cpp index 4d3a162d79f6157676226d257616d4107a222b4f..114fa5b1b8535aa95c7af84983572f09f84e977b 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 690e11eebd0e13294b222ccd5c21956cf5fc8d50..40474d2878413b01fbd8345c1326299827d91951 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 c2278271caf57933395a0be549e2ee36abc0e732..0b00d56c9a203c37070d5a30b11b1a81d6bd217f 100644 --- a/GUI/coregui/Views/SampleDesigner/IView.cpp +++ b/GUI/coregui/Views/SampleDesigner/IView.cpp @@ -36,33 +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()); - mapper()->setItem(item); - mapper()->setOnPropertyChange( - [this] (const QString &name) - { - onPropertyChange(name); - }); + m_item->mapper()->setOnPropertyChange( + [this] (const QString &name) + { + onPropertyChange(name); + }, this); - 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() @@ -77,14 +74,6 @@ void IView::onChangedY() m_item->setItemValue(SessionGraphicsItem::P_YPOS, y()); } -ModelMapper *IView::mapper() -{ - if (!m_mapper) { - m_mapper = std::unique_ptr<ModelMapper>(new ModelMapper); - } - return m_mapper.get(); -} - //! updates visual appearance of the item (color, icons, size etc) void IView::update_appearance() { diff --git a/GUI/coregui/Views/SampleDesigner/IView.h b/GUI/coregui/Views/SampleDesigner/IView.h index 5fa2732bb36b294afd5440af134a5e2b6da23663..540a7737d814349dc664abdb35cebd3017ddc851 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); @@ -50,13 +49,11 @@ public slots: virtual void onChangedY(); protected: - ModelMapper *mapper(); virtual void update_appearance(); virtual void onPropertyChange(const QString &propertyName); virtual void onSiblingsChange(); SessionItem *m_item; - std::unique_ptr<ModelMapper> m_mapper; }; inline int IView::type() const @@ -64,12 +61,9 @@ inline int IView::type() const return TYPE; } -inline SessionItem *IView::getParameterizedItem() +inline SessionItem *IView::getItem() { return m_item; } - - - #endif // IVIEW_H diff --git a/GUI/coregui/Views/SampleDesigner/LayerView.cpp b/GUI/coregui/Views/SampleDesigner/LayerView.cpp index b24beeebe91bce880084f97c9d778f8c42b1c887..35b336a2a7012e93fc2b49f7ed2f3a1a7e06c6cd 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 bf881f5d623876d3e94b440670333c3c7db5d19b..474eb4317184a44825dd11ff4f102dc410689dd6 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 1a43e63cb594f40eb3c11a415d0305a3a76542a8..bfce10b47e3af6cecabff43655e29e72daeaa7e2 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 7cf675063e1e4d36d8ee4b159d6eae8974912ef8..eea4e9e1ed0e2d563c97ea0b0b596c86f904991f 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 bb11920aec4ccefc4e8918bb69a71fb1a897999d..ac0105fe54fedd248190f9d54d78cd30c81bd905 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 09a065cc2706363d08c4d8859b28ffeb7daded93..08109d4a6c985309a7d915bb8a8835683c97add7 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/ParticleView.h b/GUI/coregui/Views/SampleDesigner/ParticleView.h index b06a9a6ea3425dca5d0edc480702f7be2701e2a0..8ebe282b3512b8be8e01804b75611a5aaf8faf36 100644 --- a/GUI/coregui/Views/SampleDesigner/ParticleView.h +++ b/GUI/coregui/Views/SampleDesigner/ParticleView.h @@ -17,12 +17,9 @@ #ifndef PARTICLEVIEW_H #define PARTICLEVIEW_H - #include "ConnectableView.h" #include <QPixmap> -class ModelMapper; - //! Class representing view of Particle item class BA_CORE_API_ ParticleView : public ConnectableView { diff --git a/GUI/coregui/Views/SampleDesigner/SampleViewAligner.cpp b/GUI/coregui/Views/SampleDesigner/SampleViewAligner.cpp index 4bc107554afd9a41203fdf74f41eb908a0202d76..4b7d7b8128a9157e8333a50b8551beb558a940e6 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/TestGUI.cpp b/Tests/UnitTests/TestGUI/TestGUI.cpp index bffe0132159df519ad4e9d76d9176801c0799249..f6ec600751091eab3e81f28da02700660a76f2ec 100644 --- a/Tests/UnitTests/TestGUI/TestGUI.cpp +++ b/Tests/UnitTests/TestGUI/TestGUI.cpp @@ -36,20 +36,20 @@ int main(int argc, char** argv) { bool status(false); - status |= QTest::qExec(&testFormFactorItems, argc, argv); - status |= QTest::qExec(&testFTDistributionItems, argc, argv); - status |= QTest::qExec(&testParameterizedItem, argc, argv); - status |= QTest::qExec(&testParticleItem, argc, argv); - status |= QTest::qExec(&testLayerRoughnessItems, argc, argv); - status |= QTest::qExec(&testParaCrystalItems, argc, argv); - status |= QTest::qExec(&testSessionModel, argc, argv); - status |= QTest::qExec(&testGUICoreObjectCorrespondence, argc, argv); - status |= QTest::qExec(&testSessionItem); - status |= QTest::qExec(&testMapperCases, argc, argv); - status |= QTest::qExec(&testSessionModel, argc, argv); +// status |= QTest::qExec(&testFormFactorItems, argc, argv); +// status |= QTest::qExec(&testFTDistributionItems, argc, argv); +// status |= QTest::qExec(&testParameterizedItem, argc, argv); +// status |= QTest::qExec(&testParticleItem, argc, argv); +// status |= QTest::qExec(&testLayerRoughnessItems, argc, argv); +// status |= QTest::qExec(&testParaCrystalItems, argc, argv); +// status |= QTest::qExec(&testSessionModel, argc, argv); +// status |= QTest::qExec(&testGUICoreObjectCorrespondence, argc, argv); +// status |= QTest::qExec(&testSessionItem); +// status |= QTest::qExec(&testMapperCases, argc, argv); +// status |= QTest::qExec(&testSessionModel, argc, argv); status |= QTest::qExec(&testMapperForItem, argc, argv); - status |= QTest::qExec(&testParticleDistributionItem, argc, argv); - status |= QTest::qExec(&testGUIHelpers, argc, argv); +// status |= QTest::qExec(&testParticleDistributionItem, argc, argv); +// status |= QTest::qExec(&testGUIHelpers, argc, argv); return status; } diff --git a/Tests/UnitTests/TestGUI/TestMapperForItem.h b/Tests/UnitTests/TestGUI/TestMapperForItem.h index b4d9a81a2f7ab3cf7da44b0c58078b6d99db9eb2..e52bad899772cb3cf9b3414871c853b4fbfaa980 100644 --- a/Tests/UnitTests/TestGUI/TestMapperForItem.h +++ b/Tests/UnitTests/TestGUI/TestMapperForItem.h @@ -10,20 +10,15 @@ #include <QtTest> -//! Test if ModelMapper reports correctly (number of callbacks, -//! names of properties and reporting items) -class TestMapperForItem : public QObject { - Q_OBJECT - +//! Test Widget which logs calling activity of ModelMapper +class Widget { public: - TestMapperForItem(QObject *parent = 0) - : QObject(parent) - , m_onPropertyChangeCount(0) + Widget() + : m_onPropertyChangeCount(0) , m_onChildPropertyChangeCount(0) , m_onParentChangeCount(0) , m_onChildrenChangeCount(0) , m_onSiblingsChangeCount(0) - , m_mapped_item(0) { } void clear() @@ -33,51 +28,48 @@ public: m_onParentChangeCount = 0; m_onChildrenChangeCount = 0; m_onSiblingsChangeCount = 0; - m_mapped_item = 0; m_reported_items.clear(); m_reported_names.clear(); } - void setItem(SessionItem *item) + void subscribe(ModelMapper *mapper, bool with_subscription = false) { clear(); - m_mapped_item = item; - m_mapper.reset(new ModelMapper); - m_mapper->setItem(item); - m_mapper->setOnPropertyChange( + void *caller = (with_subscription ? this : 0); + + mapper->setOnPropertyChange( [this] (QString name) { onPropertyChange(name); - }); + }, caller); - m_mapper->setOnChildPropertyChange( + mapper->setOnChildPropertyChange( [this](SessionItem* item, QString name) { onChildPropertyChange(item, name); - }); + }, caller); - m_mapper->setOnParentChange( + mapper->setOnParentChange( [this](SessionItem *parent) { onParentChange(parent); - }); + }, caller); - m_mapper->setOnChildrenChange( + mapper->setOnChildrenChange( [this](SessionItem*) { onChildrenChange(); - }); + }, caller); - m_mapper->setOnSiblingsChange( + mapper->setOnSiblingsChange( [this]() { onSiblingsChange(); - }); + }, caller); } -private: void onPropertyChange(const QString &name) { m_reported_names.append(name); @@ -107,159 +99,247 @@ private: m_onSiblingsChangeCount++; } + void unsubscribe(ModelMapper *mapper) { + mapper->unsubscribe(this); + } + int m_onPropertyChangeCount; int m_onChildPropertyChangeCount; int m_onParentChangeCount; int m_onChildrenChangeCount; int m_onSiblingsChangeCount; - SessionItem *m_mapped_item; QList<SessionItem *> m_reported_items; QStringList m_reported_names; +}; + + +//! Test if ModelMapper reports correctly (number of callbacks, +//! names of properties and reporting items) +class TestMapperForItem : public QObject { + Q_OBJECT + +public: + TestMapperForItem(QObject *parent = 0) + : QObject(parent) + , m_mapped_item(0) + { } + + void setItem(SessionItem *item, Widget *widget = 0, bool with_subscription = false) + { + m_mapped_item = item; + m_mapper.reset(new ModelMapper); + m_mapper->setItem(item); + if(widget) widget->subscribe(m_mapper.get(), with_subscription); + } + +private: + SessionItem *m_mapped_item; std::unique_ptr<ModelMapper> m_mapper; private slots: - + void test_initialCondition(); void test_onPropertyChange(); void test_onParentChange(); void test_onChildrenChange(); void test_onSiblingsChange(); + void test_Subscription(); + void test_TwoWidgetsSubscription(); }; +inline void TestMapperForItem::test_initialCondition() +{ + Widget w; + QCOMPARE(w.m_onPropertyChangeCount, 0); + QCOMPARE(w.m_onChildPropertyChangeCount, 0); + QCOMPARE(w.m_onParentChangeCount, 0); + QCOMPARE(w.m_onChildrenChangeCount, 0); + QCOMPARE(w.m_onSiblingsChangeCount, 0); + QVERIFY(w.m_reported_items.isEmpty()); + QVERIFY(w.m_reported_names.isEmpty()); + QVERIFY(m_mapped_item == nullptr); + QVERIFY(!m_mapper); +} + inline void TestMapperForItem::test_onPropertyChange() { + Widget w; SampleModel model; SessionItem *multilayer = model.insertNewItem(Constants::MultiLayerType); SessionItem *layer = model.insertNewItem(Constants::LayerType, model.indexOfItem(multilayer)); - // check initial state of our test class - QVERIFY(m_onPropertyChangeCount == 0); - QVERIFY(m_onChildPropertyChangeCount == 0); - QVERIFY(m_onParentChangeCount == 0); - QVERIFY(m_onChildrenChangeCount == 0); - QVERIFY(m_onSiblingsChangeCount == 0); - QVERIFY(m_mapped_item == nullptr); - QVERIFY(m_reported_items.isEmpty()); - QVERIFY(m_reported_names.isEmpty()); - // Mapper is looking on child; set property of child - setItem(layer); - layer->setItemValue(LayerItem::P_THICKNESS, 1.0); - QVERIFY(m_onPropertyChangeCount == 1); - QVERIFY(m_onChildPropertyChangeCount == 0); - QVERIFY(m_onParentChangeCount == 0); - QVERIFY(m_onChildrenChangeCount == 0); - QVERIFY(m_onSiblingsChangeCount == 0); + setItem(layer, &w); QVERIFY(m_mapped_item == layer); - QVERIFY(m_reported_items.isEmpty()); - QVERIFY((m_reported_names.size() == 1) && (m_reported_names[0] == LayerItem::P_THICKNESS)); + + layer->setItemValue(LayerItem::P_THICKNESS, 1.0); + QCOMPARE(w.m_onPropertyChangeCount, 1); + QCOMPARE(w.m_onChildPropertyChangeCount, 0); + QCOMPARE(w.m_onParentChangeCount, 0); + QCOMPARE(w.m_onChildrenChangeCount, 0); + QCOMPARE(w.m_onSiblingsChangeCount, 0); + QVERIFY(w.m_reported_items.isEmpty()); + QVERIFY((w.m_reported_names.size() == 1) && (w.m_reported_names[0] == LayerItem::P_THICKNESS)); // Mapper is looking on child; set property of parent; - setItem(layer); - multilayer->setItemValue(MultiLayerItem::P_CROSS_CORR_LENGTH, 1.0); - QVERIFY(m_onPropertyChangeCount == 0); - QVERIFY(m_onChildPropertyChangeCount == 0); - QVERIFY(m_onParentChangeCount == 0); - QVERIFY(m_onChildrenChangeCount == 0); - QVERIFY(m_onSiblingsChangeCount == 0); + setItem(layer, &w); QVERIFY(m_mapped_item == layer); - QVERIFY(m_reported_items.isEmpty()); - QVERIFY(m_reported_names.isEmpty()); + multilayer->setItemValue(MultiLayerItem::P_CROSS_CORR_LENGTH, 1.0); + QCOMPARE(w.m_onPropertyChangeCount, 0); + QCOMPARE(w.m_onChildPropertyChangeCount, 0); + QCOMPARE(w.m_onParentChangeCount, 0); + QCOMPARE(w.m_onChildrenChangeCount, 0); + QCOMPARE(w.m_onSiblingsChangeCount, 0); + QVERIFY(w.m_reported_items.isEmpty()); + QVERIFY(w.m_reported_names.isEmpty()); // Mapper is looking on parent; set property of child; - setItem(multilayer); - layer->setItemValue(LayerItem::P_THICKNESS, 2.0); - QVERIFY(m_onPropertyChangeCount == 0); - QVERIFY(m_onChildPropertyChangeCount == 1); - QVERIFY(m_onParentChangeCount == 0); - QVERIFY(m_onChildrenChangeCount == 0); - QVERIFY(m_onSiblingsChangeCount == 0); + setItem(multilayer, &w); QVERIFY(m_mapped_item == multilayer); - QVERIFY( (m_reported_items.size() == 1) && (m_reported_items[0] == layer)); - QVERIFY((m_reported_names.size() == 1) && (m_reported_names[0] == LayerItem::P_THICKNESS)); + layer->setItemValue(LayerItem::P_THICKNESS, 2.0); + QCOMPARE(w.m_onPropertyChangeCount, 0); + QCOMPARE(w.m_onChildPropertyChangeCount, 1); + QCOMPARE(w.m_onParentChangeCount, 0); + QCOMPARE(w.m_onChildrenChangeCount, 0); + QCOMPARE(w.m_onSiblingsChangeCount, 0); + QVERIFY( (w.m_reported_items.size() == 1) && (w.m_reported_items[0] == layer)); + QVERIFY((w.m_reported_names.size() == 1) && (w.m_reported_names[0] == LayerItem::P_THICKNESS)); // Mapper is looking on parent; set property of parent; - setItem(multilayer); - multilayer->setItemValue(MultiLayerItem::P_CROSS_CORR_LENGTH, 2.0); - QVERIFY(m_onPropertyChangeCount == 1); - QVERIFY(m_onChildPropertyChangeCount == 0); - QVERIFY(m_onParentChangeCount == 0); - QVERIFY(m_onChildrenChangeCount == 0); - QVERIFY(m_onSiblingsChangeCount == 0); + setItem(multilayer, &w); QVERIFY(m_mapped_item == multilayer); - QVERIFY(m_reported_items.isEmpty()); - QVERIFY((m_reported_names.size() == 1) && (m_reported_names[0] == MultiLayerItem::P_CROSS_CORR_LENGTH)); + multilayer->setItemValue(MultiLayerItem::P_CROSS_CORR_LENGTH, 2.0); + QCOMPARE(w.m_onPropertyChangeCount, 1); + QCOMPARE(w.m_onChildPropertyChangeCount, 0); + QCOMPARE(w.m_onParentChangeCount, 0); + QCOMPARE(w.m_onChildrenChangeCount, 0); + QCOMPARE(w.m_onSiblingsChangeCount, 0); + QVERIFY(w.m_reported_items.isEmpty()); + QVERIFY((w.m_reported_names.size() == 1) && (w.m_reported_names[0] == MultiLayerItem::P_CROSS_CORR_LENGTH)); } inline void TestMapperForItem::test_onParentChange() { - clear(); + Widget w; SampleModel model; SessionItem *multilayer = model.insertNewItem(Constants::MultiLayerType); SessionItem *layer = model.insertNewItem(Constants::LayerType, model.indexOfItem(multilayer)); // SessionItem *layer = model.insertNewItem(Constants::LayerType); // Mapper is looking on child; changing child's parent - setItem(layer); + setItem(layer, &w); + QVERIFY(m_mapped_item == layer); multilayer->takeRow(layer->parentRow()); // model.moveParameterizedItem(layer, multilayer); // FIXME check onParentChange while moving an item - QVERIFY(m_onPropertyChangeCount == 0); - QVERIFY(m_onChildPropertyChangeCount == 0); - QVERIFY(m_onParentChangeCount == 1); - QVERIFY(m_onChildrenChangeCount == 0); - QVERIFY(m_mapped_item == layer); - //QVERIFY((m_reported_items.size() == 1) && (m_reported_items[0] == nullptr)); - QVERIFY(m_reported_names.isEmpty()); + QCOMPARE(w.m_onPropertyChangeCount, 0); + QCOMPARE(w.m_onChildPropertyChangeCount, 0); + QCOMPARE(w.m_onParentChangeCount, 1); + QCOMPARE(w.m_onChildrenChangeCount, 0); + //QVERIFY((w.m_reported_items.size() == 1) && (w.m_reported_items[0] == nullptr)); + QVERIFY(w.m_reported_names.isEmpty()); } inline void TestMapperForItem::test_onChildrenChange() { - clear(); + Widget w; SampleModel model; SessionItem *multilayer = model.insertNewItem(Constants::MultiLayerType); // Mapper is looking on parent; adding new child to parent - setItem(multilayer); + setItem(multilayer, &w); + QVERIFY(m_mapped_item == multilayer); model.insertNewItem(Constants::LayerType, model.indexOfItem(multilayer)); - QVERIFY(m_onPropertyChangeCount == 0); - QVERIFY(m_onChildPropertyChangeCount == 2); - QVERIFY(m_onParentChangeCount == 0); - QVERIFY(m_onChildrenChangeCount == 1); - QVERIFY(m_onSiblingsChangeCount == 0); - QVERIFY(m_mapped_item == multilayer); - QVERIFY(m_reported_items.size() == 2); - QVERIFY(m_reported_names.size() == 2); + QCOMPARE(w.m_onPropertyChangeCount, 0); + QCOMPARE(w.m_onChildPropertyChangeCount, 2); + QCOMPARE(w.m_onParentChangeCount, 0); + QCOMPARE(w.m_onChildrenChangeCount, 1); + QCOMPARE(w.m_onSiblingsChangeCount, 0); + QCOMPARE(w.m_reported_items.size(), 2); + QCOMPARE(w.m_reported_names.size(), 2); } inline void TestMapperForItem::test_onSiblingsChange() { - clear(); + Widget w; SampleModel model; SessionItem *multilayer = model.insertNewItem(Constants::MultiLayerType); SessionItem *layer = model.insertNewItem(Constants::LayerType, model.indexOfItem(multilayer)); // Mapper is looking on child; adding another child to parent - setItem(layer); + setItem(layer, &w); + QVERIFY(m_mapped_item == layer); SessionItem *layer2 = model.insertNewItem(Constants::LayerType, model.indexOfItem(multilayer)); Q_UNUSED(layer2); - QCOMPARE(m_onPropertyChangeCount, 0); - QCOMPARE(m_onChildPropertyChangeCount, 0); - QCOMPARE(m_onParentChangeCount, 0); - QCOMPARE(m_onChildrenChangeCount, 0); - QCOMPARE(m_onSiblingsChangeCount, 1); - QVERIFY(m_mapped_item == layer); - QVERIFY(m_reported_items.isEmpty()); - QVERIFY(m_reported_names.isEmpty()); + QCOMPARE(w.m_onPropertyChangeCount, 0); + QCOMPARE(w.m_onChildPropertyChangeCount, 0); + QCOMPARE(w.m_onParentChangeCount, 0); + QCOMPARE(w.m_onChildrenChangeCount, 0); + QCOMPARE(w.m_onSiblingsChangeCount, 1); + QVERIFY(w.m_reported_items.isEmpty()); + QVERIFY(w.m_reported_names.isEmpty()); multilayer->takeItem(1, MultiLayerItem::T_LAYERS); - QCOMPARE(m_onSiblingsChangeCount, 2); + QCOMPARE(w.m_onSiblingsChangeCount, 2); // FIXME // multilayer->takeRow(layer2->parentRow()); -// QCOMPARE(m_onSiblingsChangeCount, 2); + // QCOMPARE(m_onSiblingsChangeCount, 2); +} + +inline void TestMapperForItem::test_Subscription() +{ + Widget w; + 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, &w, true); + QVERIFY(m_mapped_item == layer); + layer->setItemValue(LayerItem::P_THICKNESS, 1.0); + QCOMPARE(w.m_onPropertyChangeCount, 1); + QCOMPARE(w.m_onChildPropertyChangeCount, 0); + QCOMPARE(w.m_onParentChangeCount, 0); + QCOMPARE(w.m_onChildrenChangeCount, 0); + QCOMPARE(w.m_onSiblingsChangeCount, 0); + QVERIFY(w.m_reported_items.isEmpty()); + QVERIFY((w.m_reported_names.size() == 1) && (w.m_reported_names[0] == LayerItem::P_THICKNESS)); + + 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); + }