From aa8d72e98dcde7c37015890b0f257a823c1de665 Mon Sep 17 00:00:00 2001
From: David Li <dawei.li@gmx.net>
Date: Mon, 21 Mar 2016 11:31:00 +0100
Subject: [PATCH] Experimenting with group item Merge branch 'GUIFixes2' into
 Fitting

---
 GUI/coregui/Models/GroupItem.cpp              |  2 +-
 GUI/coregui/Models/GroupItem.h                |  2 +-
 GUI/coregui/Models/ModelPath.cpp              | 26 +++++++--
 .../Models/ParticleDistributionItem.cpp       |  8 +++
 Tests/UnitTests/TestGUI/TestGUI.cpp           | 33 ++++++-----
 Tests/UnitTests/TestGUI/TestMapperCases.h     |  1 -
 Tests/UnitTests/TestGUI/TestMapperForItem.h   |  4 +-
 .../TestGUI/TestParticleDistributionItem.h    | 56 ++++++++++++++++++
 ...TestParticleItems.h => TestParticleItem.h} | 57 ++++++++++++-------
 9 files changed, 143 insertions(+), 46 deletions(-)
 create mode 100644 Tests/UnitTests/TestGUI/TestParticleDistributionItem.h
 rename Tests/UnitTests/TestGUI/{TestParticleItems.h => TestParticleItem.h} (74%)

diff --git a/GUI/coregui/Models/GroupItem.cpp b/GUI/coregui/Models/GroupItem.cpp
index 3814621ba0e..339cb166794 100644
--- a/GUI/coregui/Models/GroupItem.cpp
+++ b/GUI/coregui/Models/GroupItem.cpp
@@ -29,7 +29,7 @@ void GroupItem::setGroup(GroupProperty_t group)
     setValue(QVariant::fromValue(group));
 }
 
-GroupProperty_t GroupItem::group()
+GroupProperty_t GroupItem::group() const
 {
     return value().value<GroupProperty_t>();
 }
diff --git a/GUI/coregui/Models/GroupItem.h b/GUI/coregui/Models/GroupItem.h
index 3b93e1bb1a5..b5d6fdd8b0d 100644
--- a/GUI/coregui/Models/GroupItem.h
+++ b/GUI/coregui/Models/GroupItem.h
@@ -25,7 +25,7 @@ class BA_CORE_API_ GroupItem : public SessionItem
 public:
     GroupItem();
     void setGroup(GroupProperty_t group);
-    GroupProperty_t group();
+    GroupProperty_t group() const;
 };
 
 #endif
diff --git a/GUI/coregui/Models/ModelPath.cpp b/GUI/coregui/Models/ModelPath.cpp
index 0666e1b8ef4..70cf5363818 100644
--- a/GUI/coregui/Models/ModelPath.cpp
+++ b/GUI/coregui/Models/ModelPath.cpp
@@ -15,6 +15,9 @@
 
 #include "ModelPath.h"
 #include "SessionItem.h"
+#include "GroupProperty.h"
+#include "GroupItem.h"
+#include <QModelIndex>
 #include <QStringList>
 #include <sstream>
 
@@ -26,13 +29,26 @@ QStringList ModelPath::getParameterTreeList(const SessionItem *item, QString pre
     QStringList result;
     if (item->modelType() ==  Constants::PropertyType
             && item->value().type() == QVariant::Double) {
-        result << prefix + item->itemName();
-    } else {
+        result << prefix;
+    }
+
+//    else if (item->modelType() ==  Constants::GroupItemType) {
+//        if (const GroupItem *groupItem = dynamic_cast<const GroupItem*>(item)) {
+//            if (const SessionItem *subItem = groupItem->group()->getCurrentItem()) {
+//                QString child_prefix = prefix + subItem->itemName() + QString("/");
+//                result << getParameterTreeList(subItem, child_prefix);
+//            }
+//        }
+//    }
+
+    else {
         if (item->hasChildren()) {
             for (auto p_child : item->childItems()) {
-                QString child_name = p_child->itemName();
-                QString child_prefix = prefix + child_name + QString("/");
-                result << getParameterTreeList(p_child, child_prefix);
+                if(p_child->isVisible()) {
+                    QString child_name = p_child->itemName();
+                    QString child_prefix = prefix + child_name + QString("/");
+                    result << getParameterTreeList(p_child, child_prefix);
+                }
             }
         }
     }
diff --git a/GUI/coregui/Models/ParticleDistributionItem.cpp b/GUI/coregui/Models/ParticleDistributionItem.cpp
index 7264e5e334a..b5a90c141b3 100644
--- a/GUI/coregui/Models/ParticleDistributionItem.cpp
+++ b/GUI/coregui/Models/ParticleDistributionItem.cpp
@@ -55,6 +55,13 @@ ParticleDistributionItem::ParticleDistributionItem()
     {
         updateParameterList();
     });
+
+    mapper()->setOnChildrenChange(
+                [this]()
+    {
+        updateParameterList();
+    });
+
 }
 
 ParticleDistributionItem::~ParticleDistributionItem()
@@ -128,6 +135,7 @@ QStringList ParticleDistributionItem::getChildParameterNames() const
     QStringList result;
     QVector<SessionItem *> children = getItems();
     if (children.size() > 1) {
+        Q_ASSERT(0);
         qDebug() << "ParticleDistributionItem::getChildParameterNames(): "
                  << "More than one child item";
         return result;
diff --git a/Tests/UnitTests/TestGUI/TestGUI.cpp b/Tests/UnitTests/TestGUI/TestGUI.cpp
index f697316c599..144619c6e54 100644
--- a/Tests/UnitTests/TestGUI/TestGUI.cpp
+++ b/Tests/UnitTests/TestGUI/TestGUI.cpp
@@ -7,13 +7,14 @@
 #include "TestFormFactorItems.h"
 #include "TestFTDistributionItems.h"
 #include "TestParameterizedItem.h"
-#include "TestParticleItems.h"
+#include "TestParticleItem.h"
 #include "TestLayerRoughnessItems.h"
 #include "TestParaCrystalItems.h"
 #include "TestSessionModel.h"
 #include "TestSessionItem.h"
 #include "TestGUICoreObjectCorrespondence.h"
 #include "TestMapperForItem.h"
+#include "TestParticleDistributionItem.h"
 
 int main(int argc, char** argv) {
     QCoreApplication app(argc, argv);
@@ -23,7 +24,7 @@ int main(int argc, char** argv) {
     TestFormFactorItems testFormFactorItems;
     TestFTDistributionItems testFTDistributionItems;
     TestParameterizedItem testParameterizedItem;
-    TestParticleItems testParticleItems;
+    TestParticleItem testParticleItem;
     TestLayerRoughnessItems testLayerRoughnessItems;
     TestParaCrystalItems testParaCrystalItems;
     TestSessionModel testSessionModel;
@@ -31,22 +32,24 @@ int main(int argc, char** argv) {
     TestSessionItem testSessionItem;
     TestMapperCases testMapperCases;
     TestMapperForItem testMapperForItem;
+    TestParticleDistributionItem testParticleDistributionItem;
 
     bool status(false);
 
-    status |= QTest::qExec(&testFormFactorItems, argc, argv);
-    status |= QTest::qExec(&testFTDistributionItems, argc, argv);
-    status |= QTest::qExec(&testParameterizedItem, argc, argv);
-    status |= QTest::qExec(&testParticleItems, argc, argv);
-    status |= QTest::qExec(&testLayerRoughnessItems, argc, argv);
-    status |= QTest::qExec(&testParaCrystalItems, argc, argv);
-    status |= QTest::qExec(&testSessionModel, argc, argv);
-    status |= QTest::qExec(&testGUICoreObjectCorrespondence, argc, argv);
-    status |= QTest::qExec(&testSessionItem);
-    //status |= QTest::qExec(&testPropertyAttributes, argc, argv);
-    status |= QTest::qExec(&testMapperCases, argc, argv);
-    //status |= QTest::qExec(&testSessionModel, argc, argv);
-    status |= QTest::qExec(&testMapperForItem, argc, argv);
+//    status |= QTest::qExec(&testFormFactorItems, argc, argv);
+//    status |= QTest::qExec(&testFTDistributionItems, argc, argv);
+//    status |= QTest::qExec(&testParameterizedItem, argc, argv);
+    status |= QTest::qExec(&testParticleItem, argc, argv);
+//    status |= QTest::qExec(&testLayerRoughnessItems, argc, argv);
+//    status |= QTest::qExec(&testParaCrystalItems, argc, argv);
+//    status |= QTest::qExec(&testSessionModel, argc, argv);
+//    status |= QTest::qExec(&testGUICoreObjectCorrespondence, argc, argv);
+//    status |= QTest::qExec(&testSessionItem);
+//    //status |= QTest::qExec(&testPropertyAttributes, argc, argv);
+//    status |= QTest::qExec(&testMapperCases, argc, argv);
+//    //status |= QTest::qExec(&testSessionModel, argc, argv);
+//    status |= QTest::qExec(&testMapperForItem, argc, argv);
+//    status |= QTest::qExec(&testParticleDistributionItem, argc, argv);
 
 
     return status;
diff --git a/Tests/UnitTests/TestGUI/TestMapperCases.h b/Tests/UnitTests/TestGUI/TestMapperCases.h
index a466e5c3ca6..53c3c954a45 100644
--- a/Tests/UnitTests/TestGUI/TestMapperCases.h
+++ b/Tests/UnitTests/TestGUI/TestMapperCases.h
@@ -7,7 +7,6 @@
 #include "item_constants.h"
 #include "ParticleItem.h"
 #include "ParticleCompositionItem.h"
-#include "ParticleDistributionItem.h"
 #include "InterferenceFunctionItems.h"
 #include "ParticleLayoutItem.h"
 #include "DetectorItems.h"
diff --git a/Tests/UnitTests/TestGUI/TestMapperForItem.h b/Tests/UnitTests/TestGUI/TestMapperForItem.h
index aba4625591b..a9c77aa0b50 100644
--- a/Tests/UnitTests/TestGUI/TestMapperForItem.h
+++ b/Tests/UnitTests/TestGUI/TestMapperForItem.h
@@ -219,9 +219,9 @@ inline void TestMapperForItem::test_onChildrenChange()
     SampleModel model;
     SessionItem *multilayer = model.insertNewItem(Constants::MultiLayerType);
 
-    // Mapper is looking on child; adding new child to parent
+    // Mapper is looking on parent; adding new child to parent
     setItem(multilayer);
-    SessionItem *layer = model.insertNewItem(Constants::LayerType, model.indexOfItem(multilayer));
+    model.insertNewItem(Constants::LayerType, model.indexOfItem(multilayer));
 
     QVERIFY(m_onPropertyChangeCount == 0);
     QVERIFY(m_onChildPropertyChangeCount == 2);
diff --git a/Tests/UnitTests/TestGUI/TestParticleDistributionItem.h b/Tests/UnitTests/TestGUI/TestParticleDistributionItem.h
new file mode 100644
index 00000000000..46d148cbc98
--- /dev/null
+++ b/Tests/UnitTests/TestGUI/TestParticleDistributionItem.h
@@ -0,0 +1,56 @@
+#ifndef TESTPARTICLEDISTRIBUTIONITEM_H
+#define TESTPARTICLEDISTRIBUTIONITEM_H
+
+
+#include <QtTest>
+#include "SampleModel.h"
+#include "ParticleDistributionItem.h"
+#include "ComboProperty.h"
+#include <QDebug>
+
+class TestParticleDistributionItem : public QObject {
+    Q_OBJECT
+
+private slots:
+    void test_InitialState();
+    void test_AddParticle();
+
+};
+
+inline void TestParticleDistributionItem::test_InitialState()
+{
+    SampleModel model;
+    SessionItem *item = model.insertNewItem(Constants::ParticleDistributionType);
+
+    QCOMPARE(item->displayName(), Constants::ParticleDistributionType);
+    QCOMPARE(item->displayName(), item->itemName());
+    QCOMPARE(item->childItems().size(), 5); // xpos, ypos, P_ABUNDANCE, P_DISTRIBUTION, P_DISTRIBUTED_PARAMETER
+    QCOMPARE(item->defaultTag(), ParticleDistributionItem::T_PARTICLES);
+    QCOMPARE(item->acceptableDefaultItemTypes(),
+             QVector<QString>() << Constants::ParticleType
+             << Constants::ParticleCoreShellType << Constants::ParticleCompositionType);
+
+    ComboProperty prop = item->getItemValue(ParticleDistributionItem::P_DISTRIBUTED_PARAMETER)
+                    .value<ComboProperty>();
+
+    QCOMPARE(prop.getValues(), QStringList() << QStringLiteral("None"));
+    QCOMPARE(prop.getValue(), QStringLiteral("None"));
+    QVERIFY(prop.getCachedValue().isEmpty());
+}
+
+inline void TestParticleDistributionItem::test_AddParticle()
+{
+    SampleModel model;
+    SessionItem *item = model.insertNewItem(Constants::ParticleDistributionType);
+    SessionItem *particle = model.insertNewItem(Constants::ParticleType, item->index());
+
+    QCOMPARE(item->childItems().size(), 6); // xpos, ypos, P_ABUNDANCE, P_DISTRIBUTION, T_PARTICLES, P_DISTRIBUTED_PARAMETER
+
+    ComboProperty prop = item->getItemValue(ParticleDistributionItem::P_DISTRIBUTED_PARAMETER)
+                    .value<ComboProperty>();
+    qDebug() << prop.getValues();
+
+}
+
+
+#endif
diff --git a/Tests/UnitTests/TestGUI/TestParticleItems.h b/Tests/UnitTests/TestGUI/TestParticleItem.h
similarity index 74%
rename from Tests/UnitTests/TestGUI/TestParticleItems.h
rename to Tests/UnitTests/TestGUI/TestParticleItem.h
index 3f65d5bcbdb..c17f4793cd2 100644
--- a/Tests/UnitTests/TestGUI/TestParticleItems.h
+++ b/Tests/UnitTests/TestGUI/TestParticleItem.h
@@ -1,32 +1,47 @@
-#ifndef TESTPARTICLEITEMS_H
-#define TESTPARTICLEITEMS_H
+#ifndef TESTPARTICLEITEM_H
+#define TESTPARTICLEITEM_H
 
 
 #include <QtTest>
-#include "Particle.h"
-#include "ParticleLayout.h"
-#include "ParticleCoreShell.h"
-#include "SessionModel.h"
-#include "GUIObjectBuilder.h"
+#include "SampleModel.h"
+#include "SessionItem.h"
 #include "ParticleItem.h"
-#include "TransformToDomain.h"
-#include "MaterialSvc.h"
-#include "MaterialModel.h"
-#include "GroupProperty.h"
-#include "FormFactorItems.h"
+#include "GroupItem.h"
 
 
-class TestParticleItems : public QObject {
+class TestParticleItem : public QObject {
     Q_OBJECT
 
 private slots:
-    void test_ParticleToDomain();
-    void test_FormFactorGroupProperty();
-
+    void test_InitialState();
 };
 
-inline void TestParticleItems::test_ParticleToDomain()
+inline void TestParticleItem::test_InitialState()
 {
+    SampleModel model;
+    SessionItem *item = model.insertNewItem(Constants::ParticleType);
+
+    QCOMPARE(item->displayName(), Constants::ParticleType);
+    QCOMPARE(item->displayName(), item->itemName());
+    QCOMPARE(item->childItems().size(), 6); // xpos, ypos, P_FORM_FACTOR, P_MATERIAL, P_ABUNDANCE, P_POSITION
+    QCOMPARE(item->defaultTag(), ParticleItem::T_TRANSFORMATION);
+
+    GroupItem *group = dynamic_cast<GroupItem *>(item->getItem(ParticleItem::P_FORM_FACTOR));
+    QCOMPARE(group->displayName(), ParticleItem::P_FORM_FACTOR);
+    QCOMPARE(group->childItems().size(), 1);
+
+
+
+
+//    QCOMPARE(item->acceptableDefaultItemTypes(),
+//             QVector<QString>() << Constants::ParticleType
+//             << Constants::ParticleCoreShellType << Constants::ParticleCompositionType);
+
+}
+
+
+//inline void TestParticleItems::test_ParticleToDomain()
+//{
 //    MaterialModel materialModel;
 //    MaterialEditor editor(&materialModel);
 //    Q_UNUSED(editor);
@@ -38,11 +53,11 @@ inline void TestParticleItems::test_ParticleToDomain()
 //    QCOMPARE(depth, 10.0);
 //    QCOMPARE(abundance, 5.0);
 //    Q_UNUSED(particle);
-}
+//}
 
 
-inline void TestParticleItems::test_FormFactorGroupProperty()
-{
+//inline void TestParticleItems::test_FormFactorGroupProperty()
+//{
 //    // FIXME remove MaterialEditor and model from SessionItem
 //    MaterialModel materialModel;
 //    MaterialEditor editor(&materialModel);
@@ -104,7 +119,7 @@ inline void TestParticleItems::test_FormFactorGroupProperty()
 //    QCOMPARE(spyPropertyItem.count(), 0);
 
 
-}
+//}
 
 
 
-- 
GitLab