From 1c5326f2d110f7d50c8f921c87c085733fdc537d Mon Sep 17 00:00:00 2001
From: Tobias Knopff <t.knopff@fz-juelich.de>
Date: Fri, 9 Jul 2021 12:11:47 +0200
Subject: [PATCH] Make TransformationItem::P_ROT private

---
 GUI/Models/GUIDomainSampleVisitor.cpp | 12 ++++--------
 GUI/Models/ItemWithParticles.cpp      |  5 +++++
 GUI/Models/ItemWithParticles.h        |  1 +
 GUI/Models/TransformToDomain.cpp      | 17 +++++++----------
 GUI/Models/TransformToDomain.h        |  2 +-
 GUI/Models/TransformationItem.cpp     |  6 ++++++
 GUI/Models/TransformationItem.h       | 17 ++++++++++++++++-
 7 files changed, 40 insertions(+), 20 deletions(-)

diff --git a/GUI/Models/GUIDomainSampleVisitor.cpp b/GUI/Models/GUIDomainSampleVisitor.cpp
index c440f23bd07..8f2acf45ef6 100644
--- a/GUI/Models/GUIDomainSampleVisitor.cpp
+++ b/GUI/Models/GUIDomainSampleVisitor.cpp
@@ -503,8 +503,7 @@ void GUIDomainSampleVisitor::visit(const RotationX* sample)
     ASSERT(parent);
 
     TransformationItem* transformation_item = parent->createTransformationItem();
-    XRotationItem* rotationItem =
-        transformation_item->setGroupPropertyType<XRotationItem>(TransformationItem::P_ROT);
+    XRotationItem* rotationItem = transformation_item->setRotationType<XRotationItem>();
     rotationItem->setAngleValue(Units::rad2deg(sample->getAngle()));
     m_levelToParentItem[depth()] = transformation_item;
 }
@@ -515,8 +514,7 @@ void GUIDomainSampleVisitor::visit(const RotationY* sample)
     ASSERT(parent);
 
     TransformationItem* transformation_item = parent->createTransformationItem();
-    YRotationItem* rotationItem =
-        transformation_item->setGroupPropertyType<YRotationItem>(TransformationItem::P_ROT);
+    YRotationItem* rotationItem = transformation_item->setRotationType<YRotationItem>();
     rotationItem->setAngleValue(Units::rad2deg(sample->getAngle()));
     m_levelToParentItem[depth()] = transformation_item;
 }
@@ -527,8 +525,7 @@ void GUIDomainSampleVisitor::visit(const RotationZ* sample)
     ASSERT(parent);
 
     TransformationItem* transformation_item = parent->createTransformationItem();
-    ZRotationItem* rotationItem =
-        transformation_item->setGroupPropertyType<ZRotationItem>(TransformationItem::P_ROT);
+    ZRotationItem* rotationItem = transformation_item->setRotationType<ZRotationItem>();
     rotationItem->setAngleValue(Units::rad2deg(sample->getAngle()));
     m_levelToParentItem[depth()] = transformation_item;
 }
@@ -539,8 +536,7 @@ void GUIDomainSampleVisitor::visit(const RotationEuler* sample)
     ASSERT(parent);
 
     TransformationItem* transformation_item = parent->createTransformationItem();
-    EulerRotationItem* rotationItem =
-        transformation_item->setGroupPropertyType<EulerRotationItem>(TransformationItem::P_ROT);
+    EulerRotationItem* rotationItem = transformation_item->setRotationType<EulerRotationItem>();
     rotationItem->setAlphaValue(Units::rad2deg(sample->getAlpha()));
     rotationItem->setBetaValue(Units::rad2deg(sample->getBeta()));
     rotationItem->setGammaValue(Units::rad2deg(sample->getGamma()));
diff --git a/GUI/Models/ItemWithParticles.cpp b/GUI/Models/ItemWithParticles.cpp
index 340a6736bd2..f737b1f68d8 100644
--- a/GUI/Models/ItemWithParticles.cpp
+++ b/GUI/Models/ItemWithParticles.cpp
@@ -53,6 +53,11 @@ VectorItem* ItemWithParticles::positionItem() const
     return item<VectorItem>(P_POSITION);
 }
 
+TransformationItem* ItemWithParticles::transformation() const
+{
+    return dynamic_cast<TransformationItem*>(getItem(T_TRANSFORMATION));
+}
+
 TransformationItem* ItemWithParticles::createTransformationItem()
 {
     return model()->insertItem<TransformationItem>(this, -1, T_TRANSFORMATION);
diff --git a/GUI/Models/ItemWithParticles.h b/GUI/Models/ItemWithParticles.h
index 1c7f4c9f969..d5fc73947c7 100644
--- a/GUI/Models/ItemWithParticles.h
+++ b/GUI/Models/ItemWithParticles.h
@@ -38,6 +38,7 @@ public:
     void setPosition(const kvector_t& position);
     VectorItem* positionItem() const;    
 
+    TransformationItem* transformation() const;
     TransformationItem* createTransformationItem();
     void setTransformation(RotationItem* transformation);
     static bool isTransformationTagName(const QString& name);
diff --git a/GUI/Models/TransformToDomain.cpp b/GUI/Models/TransformToDomain.cpp
index db7c33ed741..3bb11977690 100644
--- a/GUI/Models/TransformToDomain.cpp
+++ b/GUI/Models/TransformToDomain.cpp
@@ -196,17 +196,14 @@ void GUI::Transform::ToDomain::setPositionInfo(IParticle* result, const ItemWith
     result->setPosition(pos.x(), pos.y(), pos.z());
 }
 
-void GUI::Transform::ToDomain::setRotationInfo(IParticle* result, const SessionItem& item)
+void GUI::Transform::ToDomain::setRotationInfo(IParticle* result, const ItemWithParticles& item)
 {
-    QVector<SessionItem*> children = item.children();
-    for (int i = 0; i < children.size(); ++i) {
-        if (children[i]->hasModelType<TransformationItem>()) {
-            auto& rot_item = children[i]->groupItem<RotationItem>(TransformationItem::P_ROT);
-            auto rotation = rot_item.createRotation();
-            if (rotation)
-                result->setRotation(*rotation);
-            break;
-        }
+    TransformationItem* trans_item = item.transformation();
+    if (trans_item) {
+        RotationItem* rot_item = trans_item->rotation();
+        auto rotation = rot_item->createRotation();
+        if (rotation)
+            result->setRotation(*rotation);
     }
 }
 
diff --git a/GUI/Models/TransformToDomain.h b/GUI/Models/TransformToDomain.h
index 915bbc73dc1..04257ffa0d8 100644
--- a/GUI/Models/TransformToDomain.h
+++ b/GUI/Models/TransformToDomain.h
@@ -58,7 +58,7 @@ void setBeamDistribution(ParameterDistribution::WhichParameter which,
 void setSimulationOptions(ISimulation* simulation, const SessionItem& item);
 void setTransformationInfo(IParticle* result, const ItemWithParticles& item);
 void setPositionInfo(IParticle* result, const ItemWithParticles& item);
-void setRotationInfo(IParticle* result, const SessionItem& item);
+void setRotationInfo(IParticle* result, const ItemWithParticles& item);
 
 } // namespace GUI::Transform::ToDomain
 
diff --git a/GUI/Models/TransformationItem.cpp b/GUI/Models/TransformationItem.cpp
index f48bdecc8cb..17f828d8f13 100644
--- a/GUI/Models/TransformationItem.cpp
+++ b/GUI/Models/TransformationItem.cpp
@@ -13,6 +13,7 @@
 //  ************************************************************************************************
 
 #include "GUI/Models/TransformationItem.h"
+#include "GUI/Models/RotationItems.h"
 
 const QString TransformationItem::P_ROT = "Rotation type";
 
@@ -23,3 +24,8 @@ TransformationItem::TransformationItem() : SessionGraphicsItem(M_TYPE)
     setToolTip("Rotation applied to particles");
     addGroupProperty(P_ROT, "Rotation group");
 }
+
+RotationItem* TransformationItem::rotation() const
+{
+    return dynamic_cast<RotationItem*>(getGroupItem(P_ROT));
+}
diff --git a/GUI/Models/TransformationItem.h b/GUI/Models/TransformationItem.h
index 68d2f877c2b..0893a2d23c1 100644
--- a/GUI/Models/TransformationItem.h
+++ b/GUI/Models/TransformationItem.h
@@ -17,13 +17,28 @@
 
 #include "GUI/Models/SessionGraphicsItem.h"
 
+class RotationItem;
+
 class BA_CORE_API_ TransformationItem : public SessionGraphicsItem {
-public:
+private:
     static const QString P_ROT;
 
+public:
     static const QString M_TYPE;
 
     TransformationItem();
+
+    RotationItem* rotation() const;
+    template <typename T> T* setRotationType();
 };
 
+
+template <typename T> T* TransformationItem::setRotationType()
+{
+    static_assert(std::is_base_of<RotationItem, T>::value,
+                  "Class must be derived from RotationItem");
+    
+    return setGroupPropertyType<T>(P_ROT);
+}
+ 
 #endif // BORNAGAIN_GUI_MODELS_TRANSFORMATIONITEM_H
-- 
GitLab