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