From 0eeefac46432c0b4f74f3e013e88c168f72a36f8 Mon Sep 17 00:00:00 2001 From: David Li <dawei.li@gmx.net> Date: Thu, 17 Mar 2016 10:15:00 +0100 Subject: [PATCH] mapping for P_NAME, new signal onValueChange --- GUI/coregui/Models/ModelMapper.cpp | 70 +++++++++++++------ GUI/coregui/Models/ModelMapper.h | 6 ++ GUI/coregui/Models/SessionItem.cpp | 9 ++- .../IntensityDataPlotWidget.cpp | 5 +- 4 files changed, 63 insertions(+), 27 deletions(-) diff --git a/GUI/coregui/Models/ModelMapper.cpp b/GUI/coregui/Models/ModelMapper.cpp index 4f853675bc5..d35f291be5a 100644 --- a/GUI/coregui/Models/ModelMapper.cpp +++ b/GUI/coregui/Models/ModelMapper.cpp @@ -35,6 +35,11 @@ void ModelMapper::setItem(SessionItem *item) } } +void ModelMapper::setOnValueChange(std::function<void ()> f) +{ + m_onValueChange.push_back(f); +} + void ModelMapper::setOnPropertyChange(std::function<void (QString)> f) { m_onPropertyChange.push_back(f); @@ -91,6 +96,33 @@ int ModelMapper::nestlingDepth(SessionItem *item, int level) } +void ModelMapper::callOnValueChange() +{ + if (m_active && m_onValueChange.size() > 0) { + for (auto f : m_onValueChange) { + f(); + } + } +} + +void ModelMapper::callOnPropertyChange(const QString &name) +{ + if (m_active && m_onPropertyChange.size() > 0) { + for (auto f : m_onPropertyChange) { + f(name); + } + } +} + +void ModelMapper::callOnChildPropertyChange(SessionItem *item, const QString &name) +{ + if (m_active && m_onChildPropertyChange.size() > 0) { + for (auto f : m_onChildPropertyChange) { + f(item, name); + } + } +} + void ModelMapper::callOnParentChange(SessionItem *new_parent) { if (m_active && m_onParentChange.size() > 0) { @@ -119,40 +151,32 @@ void ModelMapper::callOnSiblingsChange() } void ModelMapper::onDataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight, - const QVector<int> &roles) + const QVector<int> &/*roles*/) { if (topLeft.parent() != bottomRight.parent()) return; // range must be from the same parent + SessionItem *item = m_model->itemForIndex(topLeft); - if (item->modelType() == Constants::IntensityDataType) { - if (m_active && m_onPropertyChange.size() > 0) { - for (auto f : m_onPropertyChange) { - f(item->itemName()); - } - } - } + int nestling = nestlingDepth(item); - if (nestling > 0 && nestling < 2) { - // something happened with our property or group item + if (nestling == 0) { + callOnValueChange(); + } + if (nestling == 1) { + // something happened with our children if (SessionItem *item = m_model->itemForIndex(topLeft)) { - if (m_item->isTag(item->itemName())) { - // some property changed - if (m_active && m_onPropertyChange.size() > 0) { - for (auto f : m_onPropertyChange) { - f(item->itemName()); - } - } + // only care f + const QString tag = m_item->tagFromItem(item); + if (!tag.isEmpty()) { + callOnPropertyChange(tag); } } } if (nestling > 1) { if (SessionItem *parent = item->parent()) { - if (parent->isTag(item->itemName())) { - if (m_active && m_onChildPropertyChange.size() > 0) { - for (auto f : m_onChildPropertyChange) { - f(parent, item->itemName()); - } - } + const QString tag = parent->tagFromItem(item); + if (!tag.isEmpty()) { + callOnChildPropertyChange(parent, tag); } } } diff --git a/GUI/coregui/Models/ModelMapper.h b/GUI/coregui/Models/ModelMapper.h index aad09aa8a4f..76fffb2f7d6 100644 --- a/GUI/coregui/Models/ModelMapper.h +++ b/GUI/coregui/Models/ModelMapper.h @@ -35,6 +35,8 @@ public: void setItem(SessionItem* item); + void setOnValueChange(std::function<void(void)> f); + void setOnPropertyChange(std::function<void(QString)> f); void setOnChildPropertyChange(std::function<void(SessionItem*,QString)> f); @@ -59,6 +61,9 @@ private: void setModel(SessionModel *model); int nestlingDepth(SessionItem* item, int level = 0); + void callOnValueChange(); + void callOnPropertyChange(const QString &name); + void callOnChildPropertyChange(SessionItem *item, const QString &name); void callOnParentChange(SessionItem *new_parent); void callOnChildrenChange(); void callOnSiblingsChange(); @@ -66,6 +71,7 @@ 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; diff --git a/GUI/coregui/Models/SessionItem.cpp b/GUI/coregui/Models/SessionItem.cpp index 7b4e9397f7c..49a2287df1f 100644 --- a/GUI/coregui/Models/SessionItem.cpp +++ b/GUI/coregui/Models/SessionItem.cpp @@ -368,7 +368,7 @@ bool SessionItem::insertItem(int row, SessionItem *item, const QString &tag) int index = tagStartIndex(tagName) + row; Q_ASSERT(index <= m_children.size()); if (m_model) - m_model->beginInsertRows(this->index(),index, index); + m_model->beginInsertRows(this->index(),index, index); if (item) { if (item->parent() == nullptr) { item->setParentAndModel(this, m_model); @@ -719,6 +719,13 @@ void SessionItem::setItemName(const QString &name) setItemValue(P_NAME, name); } else { addProperty(P_NAME, name); + // when name changes, than parent should be notified about it + mapper()->setOnPropertyChange( + [this] (const QString &name) + { + if (name == P_NAME) + emitDataChanged(); + }); } } diff --git a/GUI/coregui/Views/IntensityDataWidgets/IntensityDataPlotWidget.cpp b/GUI/coregui/Views/IntensityDataWidgets/IntensityDataPlotWidget.cpp index 49b6e82e424..0463bb2d7da 100644 --- a/GUI/coregui/Views/IntensityDataWidgets/IntensityDataPlotWidget.cpp +++ b/GUI/coregui/Views/IntensityDataWidgets/IntensityDataPlotWidget.cpp @@ -117,11 +117,10 @@ void IntensityDataPlotWidget::setItem(IntensityDataItem *item) if(name == IntensityDataItem::P_PROJECTIONS_FLAG) { showProjections(m_item->getItemValue(IntensityDataItem::P_PROJECTIONS_FLAG).toBool()); } + }); + m_mapper->setOnValueChange([this](void){ onIntensityModified(); }); -// connect(m_item, SIGNAL(propertyChanged(QString)), -// this, SLOT(onPropertyChanged(QString))); -// connect(m_item, SIGNAL(intensityModified()), this, SLOT(onIntensityModified())); } //! provide syncronious move of top and bottom splitters -- GitLab