diff --git a/GUI/Models/BeamDistributionItem.cpp b/GUI/Models/BeamDistributionItem.cpp index 1015dd0ea5005135b71b5ed08603a3c83320d252..417ee04582a00f415dc3058565091d18dd86d10d 100644 --- a/GUI/Models/BeamDistributionItem.cpp +++ b/GUI/Models/BeamDistributionItem.cpp @@ -128,11 +128,6 @@ SessionItem* BeamDistributionItem::distributionGroupItem() const return getGroupItem(P_DISTRIBUTION); } -SessionItem* BeamDistributionItem::setDistributionGroupItem(const QString& model_type) -{ - return setGroupProperty(P_DISTRIBUTION, model_type); -} - SessionItem* BeamDistributionItem::distributionItem() const { return getItem(P_DISTRIBUTION); diff --git a/GUI/Models/BeamDistributionItem.h b/GUI/Models/BeamDistributionItem.h index fb17495facb220330123d429cbb2c66f5f3b2cbc..26d90ea8884d676adcd123ebc63e2682fa0ab410 100644 --- a/GUI/Models/BeamDistributionItem.h +++ b/GUI/Models/BeamDistributionItem.h @@ -37,7 +37,7 @@ public: virtual double scaleFactor() const; SessionItem* distributionGroupItem() const; - SessionItem* setDistributionGroupItem(const QString& model_type); + template<typename T> T* setDistributionGroupItem(); SessionItem* distributionItem() const; protected: @@ -47,4 +47,14 @@ protected: virtual std::unique_ptr<IDistribution1D> createDistribution1D() const; }; +template<typename T> +T* BeamDistributionItem::setDistributionGroupItem() +{ + static_assert(std::is_base_of<DistributionItem,T>::value, + "Class must be derived from DistributionItem"); + + return dynamic_cast<T*>(setGroupProperty(P_DISTRIBUTION, T::M_TYPE)); +} + + #endif // BORNAGAIN_GUI_MODELS_BEAMDISTRIBUTIONITEM_H diff --git a/GUI/Models/TransformFromDomain.cpp b/GUI/Models/TransformFromDomain.cpp index d74793fec0d78f82876ad0c5860d2e6bac47fd58..149fecdc967ce933e450ada8b68cd79f25675f14 100644 --- a/GUI/Models/TransformFromDomain.cpp +++ b/GUI/Models/TransformFromDomain.cpp @@ -749,14 +749,13 @@ void setDistribution(BeamDistributionItem* part_distr_item, ParameterDistributio SessionItem* item = nullptr; if (const DistributionGate* distr = dynamic_cast<const DistributionGate*>(p_distribution)) { - item = part_distr_item->setDistributionGroupItem(DistributionGateItem::M_TYPE); + item = part_distr_item->setDistributionGroupItem<DistributionGateItem>(); item->setItemValue(DistributionGateItem::P_MIN, factor * distr->lowerBound()); item->setItemValue(DistributionGateItem::P_MAX, factor * distr->upperBound()); } else if (const DistributionLorentz* distr = dynamic_cast<const DistributionLorentz*>(p_distribution)) { DistributionLorentzItem* distr_lorentz_item = - dynamic_cast<DistributionLorentzItem*> - (part_distr_item->setDistributionGroupItem(DistributionLorentzItem::M_TYPE)); + part_distr_item->setDistributionGroupItem<DistributionLorentzItem>(); distr_lorentz_item->setMeanValue(factor * distr->getMean()); distr_lorentz_item->setItemValue(DistributionLorentzItem::P_HWHM, factor * distr->getHWHM()); @@ -764,28 +763,26 @@ void setDistribution(BeamDistributionItem* part_distr_item, ParameterDistributio } else if (const DistributionGaussian* distr = dynamic_cast<const DistributionGaussian*>(p_distribution)) { DistributionGaussianItem* distr_gauss_item = - dynamic_cast<DistributionGaussianItem*> - (part_distr_item->setDistributionGroupItem(DistributionGaussianItem::M_TYPE)); + part_distr_item->setDistributionGroupItem<DistributionGaussianItem>(); distr_gauss_item->setMeanValue(factor * distr->getMean()); distr_gauss_item->setItemValue(DistributionGaussianItem::P_STD_DEV, factor * distr->getStdDev()); item = distr_gauss_item; } else if (const DistributionLogNormal* distr = dynamic_cast<const DistributionLogNormal*>(p_distribution)) { - item = part_distr_item->setDistributionGroupItem(DistributionLogNormalItem::M_TYPE); + item = part_distr_item->setDistributionGroupItem<DistributionLogNormalItem>(); item->setItemValue(DistributionLogNormalItem::P_MEDIAN, factor * distr->getMedian()); item->setItemValue(DistributionLogNormalItem::P_SCALE_PAR, distr->getScalePar()); } else if (const DistributionCosine* distr = dynamic_cast<const DistributionCosine*>(p_distribution)) { DistributionCosineItem* distr_cos_item = - dynamic_cast<DistributionCosineItem*> - (part_distr_item->setDistributionGroupItem(DistributionCosineItem::M_TYPE)); + part_distr_item->setDistributionGroupItem<DistributionCosineItem>(); distr_cos_item->setMeanValue(factor * distr->getMean()); distr_cos_item->setItemValue(DistributionCosineItem::P_SIGMA, factor * distr->getSigma()); item = distr_cos_item; } else if (const DistributionTrapezoid* distr = dynamic_cast<const DistributionTrapezoid*>(p_distribution)) { - item = part_distr_item->setDistributionGroupItem(DistributionTrapezoidItem::M_TYPE); + item = part_distr_item->setDistributionGroupItem<DistributionTrapezoidItem>(); item->setItemValue(DistributionTrapezoidItem::P_CENTER, factor * distr->getMean()); item->setItemValue(DistributionTrapezoidItem::P_LEFTWIDTH, factor * distr->getLeftWidth()); item->setItemValue(DistributionTrapezoidItem::P_MIDDLEWIDTH,