From 34e19a7e6736fec023e371b621711dd252da2d7b Mon Sep 17 00:00:00 2001
From: Gennady Pospelov <g.pospelov@fz-juelich.de>
Date: Mon, 18 Apr 2016 11:09:43 +0200
Subject: [PATCH] SessionModel machinery now allows to add items like
 VectorItem without FixedGroupProperty

---
 GUI/coregui/Models/ApplicationModels.cpp      |  9 +--
 GUI/coregui/Models/SessionXML.cpp             | 60 ++++++++++++++-----
 .../Views/SampleDesigner/DesignerScene.cpp    | 22 +++++--
 .../Views/SampleDesigner/DesignerScene.h      |  2 +-
 .../SampleDesigner/SampleViewFactory.cpp      |  2 +-
 .../Views/SampleDesigner/SampleViewFactory.h  |  2 +-
 6 files changed, 70 insertions(+), 27 deletions(-)

diff --git a/GUI/coregui/Models/ApplicationModels.cpp b/GUI/coregui/Models/ApplicationModels.cpp
index cfbf2ead0c8..0f67d0cb61e 100644
--- a/GUI/coregui/Models/ApplicationModels.cpp
+++ b/GUI/coregui/Models/ApplicationModels.cpp
@@ -36,11 +36,12 @@ ApplicationModels::ApplicationModels(QObject *parent)
     , m_fitModel(0)
 {
     createModels();
-    //testGUIObjectBuilder();
+    testGUIObjectBuilder();
 
-    SessionItem *multilayer = m_sampleModel->insertNewItem(Constants::MultiLayerType);
-    SessionItem *layer = m_sampleModel->insertNewItem(Constants::LayerType, multilayer->index());
-//    m_sampleModel->moveParameterizedItem(layer, 0);
+//    SessionItem *multilayer = m_sampleModel->insertNewItem(Constants::MultiLayerType);
+//    SessionItem *layer = m_sampleModel->insertNewItem(Constants::LayerType, multilayer->index());
+
+//    SampleModel * mmm = m_sampleModel->createCopy();
 
 }
 
diff --git a/GUI/coregui/Models/SessionXML.cpp b/GUI/coregui/Models/SessionXML.cpp
index 91ed5765139..f7688c46690 100644
--- a/GUI/coregui/Models/SessionXML.cpp
+++ b/GUI/coregui/Models/SessionXML.cpp
@@ -146,7 +146,7 @@ void SessionWriter::writeVariant(QXmlStreamWriter *writer, QVariant variant, int
 void SessionReader::readItems(QXmlStreamReader *reader, SessionItem *item, const QString &topTag)
 {
     bool isTopItem = true;
-    qDebug() << "SessionModel::readItems() " << topTag;
+    qDebug() << "SessionModel::readItems()  item:" << item << "topTag:" << topTag;
     if(item) qDebug() << "  item" << item->modelType();
     const QString modelType = item->model()->getModelTag();
     while (!reader->atEnd()) {
@@ -166,34 +166,64 @@ void SessionReader::readItems(QXmlStreamReader *reader, SessionItem *item, const
                     if (!item) {
                         qDebug() << "!!";
                     }
+                    Q_ASSERT(item);
                 } else if (item->modelType() == Constants::GroupItemType) {
                     item = item->parent()->getGroupItem(item->parent()->tagFromItem(item), model_type);
                     if (!item) {
                         qDebug() << "!!";
                     }
+                    Q_ASSERT(item);
 
                 } else {
-                    SessionItem *new_item = ItemFactory::createItem(model_type);
+                    if (tag == "")
+                        tag = item->defaultTag();
+
+                    SessionItem *new_item(0);
+                    SessionTagInfo info = item->getTagInfo(tag);
+                    if (info.min == 1 && info.max == 1 && info.childCount == 1) {
+                        new_item = item->getItem(tag);
+                    } else {
+                        new_item = ItemFactory::createItem(model_type);
+                        if (!item->insertItem(-1, new_item, tag)) {
+                            Q_ASSERT(0);
+                        }
+
+                    }
+
                     Q_ASSERT(new_item);
                     if (reader->attributes().hasAttribute(SessionXML::DisplayNameAttribute)) {
                         new_item->setDisplayName(reader->attributes().value(SessionXML::DisplayNameAttribute).toString());
                     }
-                    if (tag == "")
-                        tag = item->defaultTag();
 
-                    if (!item->insertItem(-1, new_item, tag)) {
-                        // this must be VectorItem or similar registered via addProperty mechanism
 
-                        SessionTagInfo info = item->getTagInfo(tag);
-                        if (info.max == info.childCount && info.childCount == 1) {
-                            delete item->takeItem(0, tag);
-                            item->insertItem(-1, new_item, tag);
-                        } else {
-                            throw GUIHelpers::Error("SessionReader::readItems -> Error. "
-                                                "Can't insert item 1.2");
-                        }
 
-                    }
+//                    qDebug() << "QQQ 1.3";
+//                    SessionItem *new_item = ItemFactory::createItem(model_type);
+//                    qDebug() << "QQQ 1.3.1" << new_item << new_item->modelType();
+//                    Q_ASSERT(new_item);
+//                    if (reader->attributes().hasAttribute(SessionXML::DisplayNameAttribute)) {
+//                        new_item->setDisplayName(reader->attributes().value(SessionXML::DisplayNameAttribute).toString());
+//                    }
+//                    if (tag == "")
+//                        tag = item->defaultTag();
+
+//                    qDebug() << "QQQ 1.3.2";
+//                    if (!item->insertItem(-1, new_item, tag)) {
+//                        // this must be VectorItem or similar registered via addProperty mechanism
+//                        qDebug() << "QQQ 1.3.3";
+
+//                        SessionTagInfo info = item->getTagInfo(tag);
+//                        if (info.max == info.childCount && info.childCount == 1) {
+//                            qDebug() << "QQQ 1.3.4";
+//                            delete item->takeItem(0, tag);
+//                            bool result = item->insertItem(-1, new_item, tag);
+//                            qDebug() << "QQQ 1.3.5" << result;
+//                        } else {
+//                            throw GUIHelpers::Error("SessionReader::readItems -> Error. "
+//                                                "Can't insert item 1.2");
+//                        }
+
+//                    }
 
                     item = new_item;
                 }
diff --git a/GUI/coregui/Views/SampleDesigner/DesignerScene.cpp b/GUI/coregui/Views/SampleDesigner/DesignerScene.cpp
index 30e4d9b042e..7aa5cb9fb1d 100644
--- a/GUI/coregui/Views/SampleDesigner/DesignerScene.cpp
+++ b/GUI/coregui/Views/SampleDesigner/DesignerScene.cpp
@@ -119,6 +119,15 @@ void DesignerScene::setSelectionModel(QItemSelectionModel *model, FilterProperty
     }
 }
 
+IView *DesignerScene::getViewForItem(SessionItem *item)
+{
+    auto it = m_ItemToView.find(item);
+    if(it != m_ItemToView.end()) {
+        return it.value();
+    }
+    return nullptr;
+}
+
 void DesignerScene::resetScene()
 {
     qDebug() << "DesignerScene::resetScene()";
@@ -224,10 +233,12 @@ void DesignerScene::updateViews(const QModelIndex &parentIndex, IView *parentVie
 
         if (SessionItem *item = m_sampleModel->itemForIndex(itemIndex)) {
 
+            if(item && !SampleViewFactory::isValidType(item->modelType()))
+                    continue;
 
-            if (item && (item->modelType() == Constants::GroupItemType || item->modelType() == Constants::PropertyType)) {
-                continue;
-            }
+//            if (item && (item->modelType() == Constants::GroupItemType || item->modelType() == Constants::PropertyType)) {
+//                continue;
+//            }
 
             childView = addViewForItem(item);
             if (childView) {
@@ -253,7 +264,8 @@ IView *DesignerScene::addViewForItem(SessionItem *item)
     qDebug() << "DesignerScene::addViewForItem() ->" << item->modelType();
     Q_ASSERT(item);
 
-    IView *view = m_ItemToView[item];
+    IView *view = getViewForItem(item);
+
     if (!view) {
         qDebug() << "       DesignerScene::addViewForItem() -> Creating view for item"
                  << item->modelType();
@@ -436,7 +448,7 @@ void DesignerScene::dropEvent(QGraphicsSceneDragDropEvent *event)
         } else {
             // other views can be dropped on canvas anywhere
             qDebug() << "DesignerScene::dropEvent() -> about to drop";
-            if (SampleViewFactory::isValidItemName(mimeData->getClassName())) {
+            if (SampleViewFactory::isValidType(mimeData->getClassName())) {
 
                 SessionItem *new_item(0);
                 if (mimeData->getClassName().startsWith(Constants::FormFactorType)) {
diff --git a/GUI/coregui/Views/SampleDesigner/DesignerScene.h b/GUI/coregui/Views/SampleDesigner/DesignerScene.h
index 8a07583d0db..fbc90ea399a 100644
--- a/GUI/coregui/Views/SampleDesigner/DesignerScene.h
+++ b/GUI/coregui/Views/SampleDesigner/DesignerScene.h
@@ -51,7 +51,7 @@ public:
 
     SampleModel *getSampleModel() { return m_sampleModel; }
 
-    IView *getViewForItem(SessionItem *item) { return m_ItemToView[item]; }
+    IView *getViewForItem(SessionItem *item);
 
     NodeEditor *getNodeEditor() { return m_nodeEditor;}
 
diff --git a/GUI/coregui/Views/SampleDesigner/SampleViewFactory.cpp b/GUI/coregui/Views/SampleDesigner/SampleViewFactory.cpp
index 494fc725440..c9e00a2dd44 100644
--- a/GUI/coregui/Views/SampleDesigner/SampleViewFactory.cpp
+++ b/GUI/coregui/Views/SampleDesigner/SampleViewFactory.cpp
@@ -44,7 +44,7 @@ QStringList SampleViewFactory::m_valid_item_names  = QStringList()
         << Constants::InterferenceFunction2DLatticeType;
 
 
-bool SampleViewFactory::isValidItemName(const QString &name)
+bool SampleViewFactory::isValidType(const QString &name)
 {
     if(name.startsWith(Constants::FormFactorType)) {
         return true;
diff --git a/GUI/coregui/Views/SampleDesigner/SampleViewFactory.h b/GUI/coregui/Views/SampleDesigner/SampleViewFactory.h
index ee0ee168b7c..0473e60fe04 100644
--- a/GUI/coregui/Views/SampleDesigner/SampleViewFactory.h
+++ b/GUI/coregui/Views/SampleDesigner/SampleViewFactory.h
@@ -26,7 +26,7 @@ class IView;
 class BA_CORE_API_ SampleViewFactory
 {
 public:
-    static bool isValidItemName(const QString &name);
+    static bool isValidType(const QString &name);
     static IView *createSampleView(const QString &name);
 
     static bool isValidExampleName();
-- 
GitLab