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