From dadaea43dcf3485b2035fc7ebad8e9df5ef66cbb Mon Sep 17 00:00:00 2001
From: Gennady Pospelov <g.pospelov@fz-juelich.de>
Date: Fri, 17 Nov 2017 12:44:59 +0100
Subject: [PATCH] New method in ComponentUtils to return list of children for
 property editors.

---
 .../Views/PropertyEditor/ComponentUtils.cpp   | 29 +++++++++++++-
 .../Views/PropertyEditor/ComponentUtils.h     |  6 +++
 .../PropertyEditor/TestComponentView.cpp      |  1 +
 Tests/UnitTests/GUI/TestComponentUtils.h      | 40 +++++++++++++++++++
 Tests/UnitTests/GUI/TestGUI.cpp               |  2 +
 5 files changed, 77 insertions(+), 1 deletion(-)
 create mode 100644 Tests/UnitTests/GUI/TestComponentUtils.h

diff --git a/GUI/coregui/Views/PropertyEditor/ComponentUtils.cpp b/GUI/coregui/Views/PropertyEditor/ComponentUtils.cpp
index dc25924c587..7f259000894 100644
--- a/GUI/coregui/Views/PropertyEditor/ComponentUtils.cpp
+++ b/GUI/coregui/Views/PropertyEditor/ComponentUtils.cpp
@@ -16,11 +16,38 @@
 
 #include "ComponentUtils.h"
 #include "item_constants.h"
+#include "SessionItem.h"
 
 QStringList ComponentUtils::propertyRelatedTypes()
 {
     QStringList result = QStringList() << Constants::PropertyType << Constants::GroupItemType
                                        << Constants::VectorType << Constants::BasicAxisType
-                                       << Constants::AmplitudeAxisType;
+                                       << Constants::AmplitudeAxisType
+                                       << Constants::MaterialDataType;
+    return result;
+}
+
+QList<SessionItem*> ComponentUtils::componentItems(const SessionItem& item)
+{
+    static QStringList propertyRelated = ComponentUtils::propertyRelatedTypes();
+
+    QList<SessionItem*> result;
+
+    for (auto child : item.children()) {
+        if (!child->isVisible())
+            continue;
+
+        if (propertyRelated.contains(child->modelType()))
+            result.append(child);
+
+        if (child->modelType() == Constants::GroupItemType) {
+            for (auto grandchild : child->children()) {
+                if (grandchild->isVisible())
+                    result+= ComponentUtils::componentItems(*grandchild);
+            }
+        }
+
+    }
+
     return result;
 }
diff --git a/GUI/coregui/Views/PropertyEditor/ComponentUtils.h b/GUI/coregui/Views/PropertyEditor/ComponentUtils.h
index 42fb0551e4a..8cce7fa11f1 100644
--- a/GUI/coregui/Views/PropertyEditor/ComponentUtils.h
+++ b/GUI/coregui/Views/PropertyEditor/ComponentUtils.h
@@ -18,8 +18,11 @@
 #define COMPONENTUTILS_H
 
 #include "WinDllMacros.h"
+#include <QList>
 #include <QStringList>
 
+class SessionItem;
+
 //! Contains collection of utility functions to support editing of SessionItem's components.
 
 namespace ComponentUtils
@@ -28,6 +31,9 @@ namespace ComponentUtils
 //! Returns list of strings representing modelTypes suitable for editing in component editors.
 BA_CORE_API_ QStringList propertyRelatedTypes();
 
+//! Returns list of SessionItem's children suitable for editing in property editors.
+BA_CORE_API_ QList<SessionItem*> componentItems(const SessionItem& item);
+
 }
 
 #endif
diff --git a/GUI/coregui/Views/PropertyEditor/TestComponentView.cpp b/GUI/coregui/Views/PropertyEditor/TestComponentView.cpp
index 42835ec051b..54036eb08de 100644
--- a/GUI/coregui/Views/PropertyEditor/TestComponentView.cpp
+++ b/GUI/coregui/Views/PropertyEditor/TestComponentView.cpp
@@ -121,6 +121,7 @@ void TestComponentView::init_source()
     GUIObjectBuilder guiBuilder;
     guiBuilder.populateSampleModel(m_sourceModel, *sample);
     m_sourceModel->insertNewItem(Constants::VectorType);
+    m_sourceModel->insertNewItem(Constants::BeamType);
 
 //    SessionItem* multilayer = m_sourceModel->insertNewItem(Constants::MultiLayerType);
 //    m_sourceModel->insertNewItem(Constants::LayerType, m_sourceModel->indexOfItem(multilayer));
diff --git a/Tests/UnitTests/GUI/TestComponentUtils.h b/Tests/UnitTests/GUI/TestComponentUtils.h
new file mode 100644
index 00000000000..b2b075f897e
--- /dev/null
+++ b/Tests/UnitTests/GUI/TestComponentUtils.h
@@ -0,0 +1,40 @@
+#include <QtTest>
+#include "ComponentUtils.h"
+#include "SessionItem.h"
+#include "SessionModel.h"
+#include "item_constants.h"
+#include "ParticleItem.h"
+#include "FormFactorItems.h"
+#include <QDebug>
+
+class TestComponentUtils : public QObject
+{
+    Q_OBJECT
+public:
+
+private slots:
+    void test_componentItems();
+};
+
+//! Testing component items of particle item.
+
+inline void TestComponentUtils::test_componentItems()
+{
+    SessionModel model("TestModel");
+
+    SessionItem* particle = model.insertNewItem(Constants::ParticleType);
+    SessionItem* group = particle->getItem(ParticleItem::P_FORM_FACTOR);
+    SessionItem* ffItem = particle->getGroupItem(ParticleItem::P_FORM_FACTOR);
+
+    QList<SessionItem*> expectedList = QList<SessionItem*> ()
+            << group
+            << ffItem->getItem(CylinderItem::P_RADIUS)
+            << ffItem->getItem(CylinderItem::P_HEIGHT)
+            << particle->getItem(ParticleItem::P_MATERIAL)
+            << particle->getItem(ParticleItem::P_ABUNDANCE)
+            << particle->getItem(ParticleItem::P_POSITION);
+
+    auto itemList = ComponentUtils::componentItems(*particle);
+    QCOMPARE(itemList.size(), 6);
+    QCOMPARE(itemList, expectedList);
+}
diff --git a/Tests/UnitTests/GUI/TestGUI.cpp b/Tests/UnitTests/GUI/TestGUI.cpp
index bfcfdbd92d9..c8cd3246e4e 100644
--- a/Tests/UnitTests/GUI/TestGUI.cpp
+++ b/Tests/UnitTests/GUI/TestGUI.cpp
@@ -35,6 +35,7 @@
 #include "TestComponentProxyModel.h"
 #include "TestProxyModelStrategy.h"
 #include "TestSessionItemUtils.h"
+#include "TestComponentUtils.h"
 #include <memory>
 
 class GUITestFactory {
@@ -102,6 +103,7 @@ int main(int argc, char** argv) {
     tests.add<TestComponentProxyModel>();
     tests.add<TestProxyModelStrategy>();
     tests.add<TestSessionItemUtils>();
+    tests.add<TestComponentUtils>();
 
     return tests.runAll(argc, argv);
 }
-- 
GitLab