From 68bbab64bdeda102723bdc5b013082086d62fc2e Mon Sep 17 00:00:00 2001
From: Gennady Pospelov <g.pospelov@fz-juelich.de>
Date: Tue, 17 May 2016 16:27:28 +0200
Subject: [PATCH] FitParameterItem now takes limits attributes from first
 ParameterItem being dropped

---
 GUI/coregui/Models/FitModelHelper.cpp    | 47 +++++++++++++++---------
 GUI/coregui/Models/FitParameterItems.cpp | 29 +++++++++++++--
 GUI/coregui/Models/FitParameterItems.h   |  4 +-
 3 files changed, 57 insertions(+), 23 deletions(-)

diff --git a/GUI/coregui/Models/FitModelHelper.cpp b/GUI/coregui/Models/FitModelHelper.cpp
index 220e603aaa4..55fabf56da7 100644
--- a/GUI/coregui/Models/FitModelHelper.cpp
+++ b/GUI/coregui/Models/FitModelHelper.cpp
@@ -24,29 +24,37 @@
 //! Creates fit parameter from given ParameterItem, sets starting value to the value
 //! of ParameterItem, copies link.
 
-void FitModelHelper::createFitParameter(FitParameterContainerItem *container, ParameterItem *parameterItem)
+void FitModelHelper::createFitParameter(FitParameterContainerItem *container,
+                                        ParameterItem *parameterItem)
 {
     Q_ASSERT(container);
     Q_ASSERT(parameterItem);
 
     removeFromFitParameters(container, parameterItem);
 
-    SessionItem *fitPar = container->model()->insertNewItem(Constants::FitParameterType, container->index());
+    FitParameterItem *fitPar = dynamic_cast<FitParameterItem *>(
+        container->model()->insertNewItem(Constants::FitParameterType, container->index()));
+    Q_ASSERT(fitPar);
     fitPar->setDisplayName(QStringLiteral("par"));
-    SessionItem *link = fitPar->model()->insertNewItem(Constants::FitParameterLinkType, fitPar->index());
+    SessionItem *link
+        = fitPar->model()->insertNewItem(Constants::FitParameterLinkType, fitPar->index());
     fitPar->setItemValue(FitParameterItem::P_START_VALUE, parameterItem->value());
     link->setItemValue(FitParameterLinkItem::P_LINK, getParameterItemPath(parameterItem));
+
+    fitPar->initMinMaxValues(parameterItem->getLinkedItem()->limits());
 }
 
 //! Removes link to given parameterItem from fit parameters
 
-void FitModelHelper::removeFromFitParameters(FitParameterContainerItem *container, ParameterItem *parameterItem)
+void FitModelHelper::removeFromFitParameters(FitParameterContainerItem *container,
+                                             ParameterItem *parameterItem)
 {
     FitParameterItem *fitParItem = getFitParameterItem(container, parameterItem);
 
-    if(fitParItem) {
-        foreach(SessionItem *linkItem, fitParItem->getItems(FitParameterItem::T_LINK)) {
-            if(getParameterItemPath(parameterItem) == linkItem->getItemValue(FitParameterLinkItem::P_LINK)) {
+    if (fitParItem) {
+        foreach (SessionItem *linkItem, fitParItem->getItems(FitParameterItem::T_LINK)) {
+            if (getParameterItemPath(parameterItem)
+                == linkItem->getItemValue(FitParameterLinkItem::P_LINK)) {
                 fitParItem->model()->removeRow(linkItem->index().row(), linkItem->index().parent());
                 break;
             }
@@ -57,14 +65,17 @@ void FitModelHelper::removeFromFitParameters(FitParameterContainerItem *containe
 //! Adds given parameterItem to the existing fit parameter with display name fitParName.
 //! If parameterItem is already linked with another fitParameter, it will be relinked
 
-void FitModelHelper::addToFitParameter(FitParameterContainerItem *container, ParameterItem *parameterItem, const QString &fitParName)
+void FitModelHelper::addToFitParameter(FitParameterContainerItem *container,
+                                       ParameterItem *parameterItem, const QString &fitParName)
 {
     Q_ASSERT(container);
 
     removeFromFitParameters(container, parameterItem);
-    foreach(SessionItem *fitPar, container->getItems(FitParameterContainerItem::T_FIT_PARAMETERS)) {
-        if(fitPar->displayName() == fitParName) {
-            SessionItem *link = fitPar->model()->insertNewItem(Constants::FitParameterLinkType, fitPar->index());
+    foreach (SessionItem *fitPar,
+             container->getItems(FitParameterContainerItem::T_FIT_PARAMETERS)) {
+        if (fitPar->displayName() == fitParName) {
+            SessionItem *link
+                = fitPar->model()->insertNewItem(Constants::FitParameterLinkType, fitPar->index());
             link->setItemValue(FitParameterLinkItem::P_LINK, getParameterItemPath(parameterItem));
             break;
         }
@@ -73,7 +84,8 @@ void FitModelHelper::addToFitParameter(FitParameterContainerItem *container, Par
 
 //! Returns fFitParameterItem corresponding to given ParameterItem
 
-FitParameterItem *FitModelHelper::getFitParameterItem(FitParameterContainerItem *container, ParameterItem *parameterItem)
+FitParameterItem *FitModelHelper::getFitParameterItem(FitParameterContainerItem *container,
+                                                      ParameterItem *parameterItem)
 {
     Q_ASSERT(container);
     return container->getFitParameterItem(getParameterItemPath(parameterItem));
@@ -85,7 +97,7 @@ QStringList FitModelHelper::getFitParameterNames(FitParameterContainerItem *cont
 {
     Q_ASSERT(container);
     QStringList result;
-    foreach(SessionItem *item, container->getItems(FitParameterContainerItem::T_FIT_PARAMETERS)) {
+    foreach (SessionItem *item, container->getItems(FitParameterContainerItem::T_FIT_PARAMETERS)) {
         result.append(item->displayName());
     }
     return result;
@@ -96,7 +108,7 @@ QStringList FitModelHelper::getFitParameterNames(FitParameterContainerItem *cont
 QString FitModelHelper::getParameterItemPath(ParameterItem *parameterItem)
 {
     QString result = ModelPath::getPathFromIndex(parameterItem->index());
-    QString containerPrefix = Constants::ParameterContainerType+"/";
+    QString containerPrefix = Constants::ParameterContainerType + "/";
     int containerEnd = result.indexOf(containerPrefix) + containerPrefix.size();
     result = result.mid(containerEnd);
     return result;
@@ -105,7 +117,8 @@ QString FitModelHelper::getParameterItemPath(ParameterItem *parameterItem)
 //! Returns ParameterItem corresponding to given link.
 //! Link is relative to ParameterContainerItem, so first we have to find it
 
-ParameterItem *FitModelHelper::getParameterItem(FitParameterContainerItem *container, const QString &link)
+ParameterItem *FitModelHelper::getParameterItem(FitParameterContainerItem *container,
+                                                const QString &link)
 {
     SessionItem *cur = container;
     while (cur && cur->modelType() != Constants::JobItemType) {
@@ -114,6 +127,6 @@ ParameterItem *FitModelHelper::getParameterItem(FitParameterContainerItem *conta
     Q_ASSERT(cur->modelType() == Constants::JobItemType);
     JobItem *jobItem = dynamic_cast<JobItem *>(cur);
     Q_ASSERT(jobItem);
-    return dynamic_cast<ParameterItem *>(ModelPath::getItemFromPath(link, jobItem->parameterContainerItem()));
+    return dynamic_cast<ParameterItem *>(
+        ModelPath::getItemFromPath(link, jobItem->parameterContainerItem()));
 }
-
diff --git a/GUI/coregui/Models/FitParameterItems.cpp b/GUI/coregui/Models/FitParameterItems.cpp
index c3799b46197..9f9c9168cba 100644
--- a/GUI/coregui/Models/FitParameterItems.cpp
+++ b/GUI/coregui/Models/FitParameterItems.cpp
@@ -18,6 +18,9 @@
 #include "ComboProperty.h"
 #include "ModelPath.h"
 #include "SessionModel.h"
+#include "FitModelHelper.h"
+#include "ParameterTreeItems.h"
+#include "AttLimits.h"
 #include <QDebug>
 
 namespace
@@ -34,6 +37,8 @@ QStringList getFitParTypeTooltips()
     return result;
 }
 
+const double range_factor = 0.5;
+
 }
 
 
@@ -83,13 +88,29 @@ FitParameterItem::FitParameterItem()
     onTypeChange();
 }
 
-//! init value, min, max from given ParameterItem
+//! Inits P_MIN and P_MAX taking into account current value and external limits
 
-//void FitParameterItem::initFromParameterItem(ParameterItem *parItem)
-//{
+void FitParameterItem::initMinMaxValues(const AttLimits &limits)
+{
+    double value = getItemValue(P_START_VALUE).toDouble();
 
+    double dr(0);
+    if(value == 0.0) {
+        dr = 1.0*range_factor;
+    } else {
+        dr = std::abs(value)*range_factor;
+    }
 
-//}
+    ComboProperty partype = getItemValue(P_TYPE).value<ComboProperty>();
+    if(partype.getValue() == Constants::FITPAR_LIMITED) {
+        double min = value - dr;
+        double max = value + dr;
+        if(limits.hasLowerLimit() && min <limits.getLowerLimit()) min = limits.getLowerLimit();
+        if(limits.hasUpperLimit() && max >limits.getUpperLimit()) max = limits.getUpperLimit();
+        setItemValue(P_MIN, min);
+        setItemValue(P_MAX, max);
+    }
+}
 
 //! Enables/disables min, max properties on FitParameterItem's type
 
diff --git a/GUI/coregui/Models/FitParameterItems.h b/GUI/coregui/Models/FitParameterItems.h
index 4a5a814d2c7..7b1488d6297 100644
--- a/GUI/coregui/Models/FitParameterItems.h
+++ b/GUI/coregui/Models/FitParameterItems.h
@@ -18,7 +18,7 @@
 
 #include "SessionItem.h"
 
-class ParameterItem;
+class AttLimits;
 
 class BA_CORE_API_ FitParameterLinkItem : public SessionItem
 {
@@ -40,7 +40,7 @@ public:
     static const QString T_LINK;
     explicit FitParameterItem();
 
-//    void initFromParameterItem(ParameterItem *parItem);
+    void initMinMaxValues(const AttLimits &limits);
 
 private:
     void onTypeChange();
-- 
GitLab