From 4a55ff40cc486ca9df88c38ffe0e1aff83526611 Mon Sep 17 00:00:00 2001
From: Gennady Pospelov <g.pospelov@fz-juelich.de>
Date: Thu, 2 Feb 2017 16:00:27 +0100
Subject: [PATCH] ParameterTreeBuilder turned from static class to namespace.

---
 GUI/coregui/Models/ParameterTreeBuilder.cpp | 135 +++++++-------------
 GUI/coregui/Models/ParameterTreeBuilder.h   |  23 ++--
 2 files changed, 56 insertions(+), 102 deletions(-)

diff --git a/GUI/coregui/Models/ParameterTreeBuilder.cpp b/GUI/coregui/Models/ParameterTreeBuilder.cpp
index 350910a548b..66ec9b93288 100644
--- a/GUI/coregui/Models/ParameterTreeBuilder.cpp
+++ b/GUI/coregui/Models/ParameterTreeBuilder.cpp
@@ -3,7 +3,7 @@
 //  BornAgain: simulate and fit scattering at grazing incidence
 //
 //! @file      GUI/coregui/Models/ParameterTreeBuilder.cpp
-//! @brief     Implements class ParameterTreeBuilder
+//! @brief     Implements ParameterTreeBuilder namespace
 //!
 //! @homepage  http://www.bornagainproject.org
 //! @license   GNU General Public License v3 or higher (see COPYING)
@@ -25,74 +25,58 @@
 #include "ScientificDoubleProperty.h"
 #include <QStack>
 
-namespace
-{
-int copyNumberOfChild(const SessionItem* parent, const SessionItem* item)
-{
-    if (!item)
-        return -1;
-    int result = -1;
-    int count = 0;
-    QString itemName = item->displayName();
-    // check child items:
-    for (auto p_child_item : parent->childItems()) {
-        QString childName = p_child_item->displayName();
-        if (p_child_item == item)
-            result = count;
-        if (childName == itemName)
-            ++count;
-    }
-    if (count > 1)
-        return result;
-    return -1;
-}
-
-void fixDisplayName(SessionItem *parent) {
-    QVector<int> copyNumber;
-    for (SessionItem *child : parent->childItems()) {
-        copyNumber.push_back(copyNumberOfChild(parent, child));
-    }
-
-    int index(0);
-    for (SessionItem *child : parent->childItems()) {
-        if(copyNumber[index] >= 0)
-            child->setDisplayName( child->displayName() + QString::number(copyNumber[index]));
-        ++index;
-    }
-
-    for (SessionItem *child : parent->childItems()) {
-        fixDisplayName(child);
-    }
-
+namespace {
+    void handleItem(SessionItem* tree, SessionItem* source);
 }
 
-}
-
-void ParameterTreeBuilder::createParameterTree(JobItem *item, const QString &tag)
+void ParameterTreeBuilder::createParameterTree(JobItem* item, const QString& tag)
 {
-    SessionItem *container
+    SessionItem* container
         = item->model()->insertNewItem(Constants::ParameterContainerType, item->index(), -1, tag);
 
-    SessionItem *multiLayer
+    SessionItem* multiLayer
         = container->model()->insertNewItem(Constants::ParameterLabelType, container->index());
     handleItem(multiLayer, item->getItem(JobItem::T_SAMPLE));
 
-    SessionItem *instrument
+    SessionItem* instrument
         = container->model()->insertNewItem(Constants::ParameterLabelType, container->index());
     handleItem(instrument, item->getItem(JobItem::T_INSTRUMENT));
 
-//    fixDisplayName(container);
-
 #ifndef NDEBUG
     // Provides all items in "JobItem/Parameter Tree Container" with domain links already
     // at the stage of ParameterTree creation. It is necessary for validation, in Release mode
     // it will lead for unnecessary large project files.
-    populateDomainLinks(item, tag);
+    ParameterTreeBuilder::populateDomainLinks(item, tag);
 #endif
+}
 
+//! For every ParameterItem in JobItem's ParameterTree container creates a link to domain.
+
+void ParameterTreeBuilder::populateDomainLinks(JobItem* jobItem, const QString& tag)
+{
+    SessionItem* current = jobItem->getItem(tag); // this is container
+    QStack<SessionItem*> stack;
+    stack.push(current);
+    while (!stack.empty()) {
+        current = stack.pop();
+        if (current->modelType() == Constants::ParameterLabelType
+            || current->modelType() == Constants::ParameterContainerType) {
+            for (SessionItem* child : current->getItems()) {
+                stack.push(child);
+            }
+        } else {
+            if (ParameterItem* parItem = dynamic_cast<ParameterItem*>(current)) {
+                QString translation
+                    = "*/" + ModelPath::itemPathTranslation(*parItem->linkedItem(), jobItem);
+                parItem->setItemValue(ParameterItem::P_DOMAIN, translation);
+            }
+        }
+    }
 }
 
-void ParameterTreeBuilder::handleItem(SessionItem *tree, SessionItem *source)
+namespace {
+
+void handleItem(SessionItem* tree, SessionItem* source)
 {
     if (tree->modelType() == Constants::ParameterLabelType) {
         tree->setDisplayName(source->itemName());
@@ -103,16 +87,16 @@ void ParameterTreeBuilder::handleItem(SessionItem *tree, SessionItem *source)
         tree->setDisplayName(source->itemName());
 
         double sourceValue = source->value().toDouble();
-        if(source->value().typeName() == Constants::ScientificDoublePropertyType) {
+        if (source->value().typeName() == Constants::ScientificDoublePropertyType) {
             ScientificDoubleProperty intensity = source->value().value<ScientificDoubleProperty>();
-            sourceValue=intensity.getValue();
+            sourceValue = intensity.getValue();
         }
 
         tree->setValue(QVariant(sourceValue));
         QString path = ModelPath::getPathFromIndex(source->index());
         int firstSlash = path.indexOf('/');
         path = path.mid(firstSlash + 1);
-        tree->setItemValue(ParameterItem::P_LINK, path);        
+        tree->setItemValue(ParameterItem::P_LINK, path);
         tree->setItemValue(ParameterItem::P_BACKUP, sourceValue);
         return;
     }
@@ -121,31 +105,28 @@ void ParameterTreeBuilder::handleItem(SessionItem *tree, SessionItem *source)
         return;
     }
 
-    for (SessionItem *child : source->childItems()) {
+    for (SessionItem* child : source->childItems()) {
         if (child->isVisible() && child->isEnabled()) {
             if (child->modelType() == Constants::PropertyType) {
                 if (child->value().type() == QVariant::Double) {
-                    SessionItem *branch
+                    SessionItem* branch
                         = tree->model()->insertNewItem(Constants::ParameterType, tree->index());
                     handleItem(branch, child);
-                }
-                else if (child->value().typeName() == Constants::ScientificDoublePropertyType) {
-                    SessionItem *branch
+                } else if (child->value().typeName() == Constants::ScientificDoublePropertyType) {
+                    SessionItem* branch
                         = tree->model()->insertNewItem(Constants::ParameterType, tree->index());
                     handleItem(branch, child);
-
                 }
 
             } else if (child->modelType() == Constants::GroupItemType) {
-                SessionItem *currentItem
-                    = dynamic_cast<GroupItem *>(child)->currentItem();
+                SessionItem* currentItem = dynamic_cast<GroupItem*>(child)->currentItem();
                 if (currentItem && currentItem->rowCount() > 0) {
-                    SessionItem *branch = tree->model()->insertNewItem(
+                    SessionItem* branch = tree->model()->insertNewItem(
                         Constants::ParameterLabelType, tree->index());
                     handleItem(branch, currentItem);
                 }
             } else {
-                SessionItem *branch
+                SessionItem* branch
                     = tree->model()->insertNewItem(Constants::ParameterLabelType, tree->index());
                 handleItem(branch, child);
             }
@@ -153,30 +134,4 @@ void ParameterTreeBuilder::handleItem(SessionItem *tree, SessionItem *source)
     }
 }
 
-//! For every ParameterItem in JobItem's ParameterTree container creates a link to domain.
-void ParameterTreeBuilder::populateDomainLinks(JobItem *jobItem, const QString &tag)
-{
-    SessionItem *current = jobItem->getItem(tag); // this is container
-    QStack<SessionItem *> stack;
-    stack.push(current);
-    while (!stack.empty()) {
-        current = stack.pop();
-        if (current->modelType() == Constants::ParameterLabelType
-                || current->modelType() == Constants::ParameterContainerType) {
-            for (SessionItem *child : current->getItems()) {
-                stack.push(child);
-            }
-        } else {
-            if (ParameterItem *parItem = dynamic_cast<ParameterItem *>(current)) {
-//                QString parItemPath = FitParameterHelper::getParameterItemPath(parItem);
-//                std::string domainPath = ModelPath::translateParameterName(
-//                    jobItem, parItemPath);
-//                parItem->setItemValue(ParameterItem::P_DOMAIN, QString::fromStdString(domainPath));
-
-                // new way of translating
-                QString translation = "*/" + ModelPath::itemPathTranslation(*parItem->linkedItem(), jobItem);
-                parItem->setItemValue(ParameterItem::P_DOMAIN, translation);
-            }
-        }
-    }
-}
+} // namespace
diff --git a/GUI/coregui/Models/ParameterTreeBuilder.h b/GUI/coregui/Models/ParameterTreeBuilder.h
index 3d1a7af534a..3e70dc72367 100644
--- a/GUI/coregui/Models/ParameterTreeBuilder.h
+++ b/GUI/coregui/Models/ParameterTreeBuilder.h
@@ -3,7 +3,7 @@
 //  BornAgain: simulate and fit scattering at grazing incidence
 //
 //! @file      GUI/coregui/Models/ParameterTreeBuilder.h
-//! @brief     Defines class ParameterTreeBuilder
+//! @brief     Defines ParameterTreeBuilder namespace
 //!
 //! @homepage  http://www.bornagainproject.org
 //! @license   GNU General Public License v3 or higher (see COPYING)
@@ -17,23 +17,22 @@
 #ifndef PARAMETERTREEBUILDER_H
 #define PARAMETERTREEBUILDER_H
 
-#include <QString>
 #include "WinDllMacros.h"
+#include <QString>
 
 class JobItem;
 class SessionItem;
 
-//! The ParameterTreeBuilder class helps JobModel to create a container with ParameterItem's.
-//! The ParameterItem appears in RealTimeView and provides real time tuning of MultiLayerItem
-//! and InstrumentItem.
+//! The ParameterTreeBuilder namespace contains helper functions to create container
+//! with ParameterItems. The ParameterItem appears in RealTimeView and provides real
+//! time tuning of MultiLayerItem and InstrumentItem.
 
-class BA_CORE_API_ ParameterTreeBuilder
+namespace ParameterTreeBuilder
 {
-public:
-    static void createParameterTree(JobItem *item, const QString &tag = QString());
-    static void populateDomainLinks(JobItem *jobItem,  const QString &tag);
-private:
-    static void handleItem(SessionItem *tree, SessionItem *source);
-};
+
+BA_CORE_API_ void createParameterTree(JobItem* item, const QString& tag = QString());
+BA_CORE_API_ void populateDomainLinks(JobItem* jobItem, const QString& tag);
+
+}
 
 #endif // PARAMETERTREEBUILDER_H
-- 
GitLab