From f1b573023f50d0af357d5ae153ccf1085e575f6c Mon Sep 17 00:00:00 2001
From: Gennady Pospelov <g.pospelov@fz-juelich.de>
Date: Wed, 6 Dec 2017 10:03:21 +0100
Subject: [PATCH] Preparation for hiding GroupProperty in GroupItem

---
 GUI/coregui/Models/GroupInfo.cpp             |  5 +++++
 GUI/coregui/Models/GroupInfo.h               |  2 ++
 GUI/coregui/Models/GroupItem.cpp             | 22 ++++++++++++++++++--
 GUI/coregui/Models/GroupItem.h               | 13 +++++++++++-
 GUI/coregui/Models/GroupProperty.h           |  5 +++--
 GUI/coregui/Models/GroupPropertyRegistry.cpp |  5 +++++
 GUI/coregui/Models/GroupPropertyRegistry.h   |  1 +
 GUI/coregui/Models/SessionItem.cpp           | 18 ++++++++--------
 GUI/coregui/Models/SessionItem.h             |  4 ++--
 GUI/coregui/Models/SessionXML.cpp            |  3 +--
 10 files changed, 60 insertions(+), 18 deletions(-)

diff --git a/GUI/coregui/Models/GroupInfo.cpp b/GUI/coregui/Models/GroupInfo.cpp
index 89be911f8fa..66877e8517b 100644
--- a/GUI/coregui/Models/GroupInfo.cpp
+++ b/GUI/coregui/Models/GroupInfo.cpp
@@ -76,6 +76,11 @@ QStringList GroupInfo::itemLabels() const
 
 }
 
+bool GroupInfo::isValid()
+{
+    return !m_groupType.isEmpty();
+}
+
 bool GroupInfo::containsType(const QString& itemType) const
 {
     for (auto& pair : m_info)
diff --git a/GUI/coregui/Models/GroupInfo.h b/GUI/coregui/Models/GroupInfo.h
index 8e59cb3485d..55b677957f7 100644
--- a/GUI/coregui/Models/GroupInfo.h
+++ b/GUI/coregui/Models/GroupInfo.h
@@ -40,6 +40,8 @@ public:
 
     QStringList itemLabels() const;
 
+    bool isValid();
+
 private:
     struct TypeAndLabel {
         QString m_itemType;
diff --git a/GUI/coregui/Models/GroupItem.cpp b/GUI/coregui/Models/GroupItem.cpp
index bd5a66db178..b908a350629 100644
--- a/GUI/coregui/Models/GroupItem.cpp
+++ b/GUI/coregui/Models/GroupItem.cpp
@@ -34,9 +34,16 @@ void GroupItem::setGroup(GroupProperty_t group)
     setValue(QVariant::fromValue(group));
 }
 
-GroupProperty_t GroupItem::groupProperty() const
+void GroupItem::setGroupInfo(const GroupInfo& groupInfo)
 {
-    return value().value<GroupProperty_t>();
+    if (m_groupInfo.isValid())
+        throw GUIHelpers::Error("GroupItem::setGroup() -> Error. Attempt to set GroupInfo twice.");
+
+    m_groupInfo = groupInfo;
+
+    GroupProperty_t groupProperty(new GroupProperty);
+    groupProperty->setGroupInfo(groupInfo);
+    setGroup(groupProperty);
 }
 
 SessionItem* GroupItem::currentItem() const
@@ -62,3 +69,14 @@ QStringList GroupItem::translateList(const QStringList& list) const
     // we do not add here the name of itself
     return list;
 }
+
+GroupProperty_t GroupItem::groupProperty() const
+{
+    return value().value<GroupProperty_t>();
+}
+
+SessionItem* GroupItem::getItemOfType(const QString& type)
+{
+    return groupProperty()->getItemOfType(type);
+}
+
diff --git a/GUI/coregui/Models/GroupItem.h b/GUI/coregui/Models/GroupItem.h
index 4aec85c684c..9ea19d3e589 100644
--- a/GUI/coregui/Models/GroupItem.h
+++ b/GUI/coregui/Models/GroupItem.h
@@ -19,6 +19,10 @@
 
 #include "SessionItem.h"
 #include "GroupProperty.h"
+#include "GroupInfo.h"
+#include <memory>
+
+class GroupInfo;
 
 class BA_CORE_API_ GroupItem : public SessionItem
 {
@@ -27,7 +31,7 @@ public:
     GroupItem();
 
     void setGroup(GroupProperty_t groupProperty);
-    GroupProperty_t groupProperty() const;
+    void setGroupInfo(const GroupInfo& groupInfo);
     SessionItem* currentItem() const;
 
     QString currentType() const;
@@ -35,6 +39,13 @@ public:
     SessionItem* setCurrentType(const QString& modelType);
 
     QStringList translateList(const QStringList& list) const;
+
+    SessionItem* getItemOfType(const QString& type);
+
+private:
+    GroupProperty_t groupProperty() const;
+
+    GroupInfo m_groupInfo;
 };
 
 #endif // GROUPITEM_H
diff --git a/GUI/coregui/Models/GroupProperty.h b/GUI/coregui/Models/GroupProperty.h
index 5bccf99ba2c..ec044fb3294 100644
--- a/GUI/coregui/Models/GroupProperty.h
+++ b/GUI/coregui/Models/GroupProperty.h
@@ -49,10 +49,11 @@ public:
     QStringList itemTypes() const;
     QStringList itemLabels() const;
 
-private:
     GroupProperty();
-
     void setGroupInfo(GroupInfo groupInfo);
+
+private:
+
     SessionItem* addItem(const QString& item_type);
     SessionItem* createCorrespondingItem();
     int toIndex(const QString& type) const;
diff --git a/GUI/coregui/Models/GroupPropertyRegistry.cpp b/GUI/coregui/Models/GroupPropertyRegistry.cpp
index 7740d4b70b6..c2104924064 100644
--- a/GUI/coregui/Models/GroupPropertyRegistry.cpp
+++ b/GUI/coregui/Models/GroupPropertyRegistry.cpp
@@ -29,6 +29,11 @@ GroupProperty_t GroupPropertyRegistry::createGroupProperty(const Constants::Mode
     return result;
 }
 
+GroupInfo GroupPropertyRegistry::groupInfo(const Constants::ModelType& group_type)
+{
+    return catalogue().groupInfo(group_type);
+}
+
 const GroupInfoCatalogue& GroupPropertyRegistry::catalogue()
 {
     static GroupInfoCatalogue s_catalogue = GroupInfoCatalogue();
diff --git a/GUI/coregui/Models/GroupPropertyRegistry.h b/GUI/coregui/Models/GroupPropertyRegistry.h
index 9c4f3230c8f..9350aaa602c 100644
--- a/GUI/coregui/Models/GroupPropertyRegistry.h
+++ b/GUI/coregui/Models/GroupPropertyRegistry.h
@@ -30,6 +30,7 @@ public:
 
     static GroupProperty_t createGroupProperty(const Constants::ModelType& group_type);
 
+    static GroupInfo groupInfo(const Constants::ModelType& group_type);
 private:
     static const GroupInfoCatalogue& catalogue();
 };
diff --git a/GUI/coregui/Models/SessionItem.cpp b/GUI/coregui/Models/SessionItem.cpp
index e5d3ce22279..fcac2af5e30 100644
--- a/GUI/coregui/Models/SessionItem.cpp
+++ b/GUI/coregui/Models/SessionItem.cpp
@@ -352,37 +352,37 @@ void SessionItem::setItemValue(const QString& tag, const QVariant& variant)
 }
 
 //! Creates new group item and register new tag, returns GroupItem.
-SessionItem* SessionItem::addGroupProperty(const QString& groupName, const QString& groupType)
+SessionItem* SessionItem::addGroupProperty(const QString& groupTag, const QString& groupType)
 {
     SessionItem* result(0);
 
     if(GroupPropertyRegistry::isValidGroup(groupType)) {
         // create group item
-        GroupProperty_t group_property = GroupPropertyRegistry::createGroupProperty(groupType);
+        GroupInfo groupInfo = GroupPropertyRegistry::groupInfo(groupType);
         GroupItem* groupItem = dynamic_cast<GroupItem*>(
                     ItemFactory::createItem(Constants::GroupItemType));
         Q_ASSERT(groupItem);
-        groupItem->setGroup(group_property);
-        registerTag(groupName, 1, 1, QStringList() << Constants::GroupItemType);
+        groupItem->setGroupInfo(groupInfo);
+        registerTag(groupTag, 1, 1, QStringList() << Constants::GroupItemType);
         result = groupItem;
     }
     else {
         // create single item
-        registerTag(groupName, 1, 1, QStringList() << groupType);
+        registerTag(groupTag, 1, 1, QStringList() << groupType);
         result = ItemFactory::createItem(groupType);
     }
     Q_ASSERT(result);
-    result->setDisplayName(groupName);
-    if(!insertItem(0, result, groupName)) {
+    result->setDisplayName(groupTag);
+    if(!insertItem(0, result, groupTag)) {
         throw GUIHelpers::Error("SessionItem::addGroupProperty -> Error. Can't insert group item");
     }
     return result;
 }
 
 //! Set the current type of group item.
-SessionItem* SessionItem::setGroupProperty(const QString& groupName, const QString& value) const
+SessionItem* SessionItem::setGroupProperty(const QString& groupTag, const QString& modelType) const
 {
-    return item<GroupItem>(groupName).setCurrentType(value);
+    return item<GroupItem>(groupTag).setCurrentType(modelType);
 }
 
 //! Access subitem of group item.
diff --git a/GUI/coregui/Models/SessionItem.h b/GUI/coregui/Models/SessionItem.h
index eb092673366..f7f0aa76967 100644
--- a/GUI/coregui/Models/SessionItem.h
+++ b/GUI/coregui/Models/SessionItem.h
@@ -89,8 +89,8 @@ public:
     void setItemValue(const QString& tag, const QVariant& variant);
 
     // convenience functions for groups
-    SessionItem* addGroupProperty(const QString& groupName, const QString& groupType);
-    SessionItem* setGroupProperty(const QString& name, const QString& value) const;
+    SessionItem* addGroupProperty(const QString& groupTag, const QString& groupType);
+    SessionItem* setGroupProperty(const QString& groupTag, const QString& modelType) const;
     SessionItem* getGroupItem(const QString& groupName) const;
     template<typename T> T& groupItem(const QString& groupName) const;
 
diff --git a/GUI/coregui/Models/SessionXML.cpp b/GUI/coregui/Models/SessionXML.cpp
index e7971e92e19..5a839b51108 100644
--- a/GUI/coregui/Models/SessionXML.cpp
+++ b/GUI/coregui/Models/SessionXML.cpp
@@ -281,8 +281,7 @@ SessionItem* createItem(SessionItem* parent, const QString& modelType, const QSt
     if (parent->modelType() == Constants::GroupItemType) {
         result = parent->parent()
                      ->item<GroupItem>(parent->parent()->tagFromItem(parent))
-                     .groupProperty()
-                     ->getItemOfType(modelType);
+                     .getItemOfType(modelType);
     } else {
         SessionTagInfo info = parent->getTagInfo(tag);
         if (info.min == 1 && info.max == 1 && info.childCount == 1)
-- 
GitLab