diff --git a/GUI/coregui/Models/ComboProperty.cpp b/GUI/coregui/Models/ComboProperty.cpp index c59c75cfbf0d788b9f83a963e8c22215e5482b69..5bb96536271e51531fc168056fbb3f1da5d19dc1 100644 --- a/GUI/coregui/Models/ComboProperty.cpp +++ b/GUI/coregui/Models/ComboProperty.cpp @@ -19,11 +19,10 @@ ComboProperty::ComboProperty(const QStringList &values, const QString ¤t_value) : m_values(values) , m_current_value(current_value) + , m_cache_contains_GUI_value(true) { - } - void ComboProperty::setValue(const QString &name) { Q_ASSERT(m_values.contains(name)); @@ -59,4 +58,3 @@ void ComboProperty::setCachedValue(const QString &name) { m_cached_value = name; } - diff --git a/GUI/coregui/Models/ComboProperty.h b/GUI/coregui/Models/ComboProperty.h index 5d1e2d69732b0d5f94fafe9fc1d600c25ce1ec4d..bb7245c506cde1567836645a7e6cb38670b7587f 100644 --- a/GUI/coregui/Models/ComboProperty.h +++ b/GUI/coregui/Models/ComboProperty.h @@ -31,45 +31,91 @@ public: ComboProperty(const QStringList &values = QStringList(), const QString ¤t_value = QString("Undefined")); - virtual ~ComboProperty(){} - QString getValue() const { return m_current_value; } + virtual ~ComboProperty() {} + QString getValue() const; void setValue(const QString &name); - bool operator!=(const ComboProperty &other) { - return (getValue() != other.getValue()); - } - bool isDefined() { return m_current_value != QStringLiteral("Undefined"); } + bool operator!=(const ComboProperty &other); + bool isDefined(); - QStringList getValues() const { return m_values;} + QStringList getValues() const; int index() const; int toIndex(const QString &value) const; QString toString(int index) const; - inline ComboProperty &operator<<(const QString &str) - { - m_values.append(str); - if(m_values.size()) m_current_value=m_values.at(0); - return *this; - } + inline ComboProperty &operator<<(const QString &str); - QVariant getVariant() const { - QVariant result; - result.setValue(*this); - return result; - } + QVariant getVariant() const; - int getIndex() const { return toIndex(m_current_value); } + int getIndex() const; - QString getCachedValue() const { return m_cached_value; } + QString getCachedValue() const; void setCachedValue(const QString &name); + bool cacheContainsGUIValue() const; + void setCacheContainsGUIFlag(bool flag=true); + private: QStringList m_values; QString m_current_value; QString m_cached_value; // for comboboxes with dynamically generated value lists + bool m_cache_contains_GUI_value; }; +inline QString ComboProperty::getValue() const +{ + return m_current_value; +} + +inline bool ComboProperty::operator!=(const ComboProperty &other) +{ + return (getValue() != other.getValue()); +} + +inline bool ComboProperty::isDefined() +{ + return m_current_value != QStringLiteral("Undefined"); +} + +inline QStringList ComboProperty::getValues() const +{ + return m_values; +} + +inline ComboProperty &ComboProperty::operator<<(const QString &str) +{ + m_values.append(str); + if(m_values.size()) m_current_value=m_values.at(0); + return *this; +} + +inline QVariant ComboProperty::getVariant() const { + QVariant result; + result.setValue(*this); + return result; +} + +inline int ComboProperty::getIndex() const +{ + return toIndex(m_current_value); +} + +inline QString ComboProperty::getCachedValue() const +{ + return m_cached_value; +} + +inline bool ComboProperty::cacheContainsGUIValue() const +{ + return m_cache_contains_GUI_value; +} + +inline void ComboProperty::setCacheContainsGUIFlag(bool flag) +{ + m_cache_contains_GUI_value = flag; +} + Q_DECLARE_METATYPE(ComboProperty) diff --git a/GUI/coregui/Models/ParameterTranslators.cpp b/GUI/coregui/Models/ParameterTranslators.cpp new file mode 100644 index 0000000000000000000000000000000000000000..14f1a2285a785158702d1c38af4b77603b8f0f9c --- /dev/null +++ b/GUI/coregui/Models/ParameterTranslators.cpp @@ -0,0 +1,57 @@ +// ************************************************************************** // +// +// BornAgain: simulate and fit scattering at grazing incidence +// +//! @file coregui/Models/ParameterTranslators.cpp +//! @brief Implements subclasses of IParameterTranslator +//! +//! @homepage http://www.bornagainproject.org +//! @license GNU General Public License v3 or higher (see COPYING) +//! @copyright Forschungszentrum Jülich GmbH 2015 +//! @authors Scientific Computing Group at MLZ Garching +//! @authors C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke +// +// ************************************************************************** // + +#include "ParameterTranslators.h" +#include "ParticleItem.h" +#include "VectorItem.h" +#include "BornAgainNamespace.h" + + +PositionTranslator::PositionTranslator() +{ +} + +PositionTranslator *PositionTranslator::clone() const +{ + return new PositionTranslator(); +} + +QStringList PositionTranslator::split(const QString &par_name) const +{ + QStringList result; + auto position_name = translate(par_name); + if (!position_name.empty()) { + result << par_name; + } + return result; +} + +std::string PositionTranslator::translate(const QString &name) const +{ + auto name_list = name.split(QString("/")); + if (name_list.size() > 2) return ""; + if (name_list.size() > 1 && name_list[0] == ParticleItem::P_POSITION) { + if (name_list[1] == VectorItem::P_X) { + return BornAgain::PositionX; + } + if (name_list[1] == VectorItem::P_Y) { + return BornAgain::PositionY; + } + if (name_list[1] == VectorItem::P_Z) { + return BornAgain::PositionZ; + } + } + return ""; +} diff --git a/GUI/coregui/Models/ParameterTranslators.h b/GUI/coregui/Models/ParameterTranslators.h new file mode 100644 index 0000000000000000000000000000000000000000..5b5364d374f91ade2441c7505f7751564293b94a --- /dev/null +++ b/GUI/coregui/Models/ParameterTranslators.h @@ -0,0 +1,43 @@ +// +// BornAgain: simulate and fit scattering at grazing incidence +// +//! @file coregui/Models/ParameterTranslators.h +//! @brief Defines interface IParameterTranslator and subclasses +//! +//! @homepage http://www.bornagainproject.org +//! @license GNU General Public License v3 or higher (see COPYING) +//! @copyright Forschungszentrum Jülich GmbH 2015 +//! @authors Scientific Computing Group at MLZ Garching +//! @authors C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke +// +// ************************************************************************** // + +#ifndef PARAMETERTRANSLATORS_H +#define PARAMETERTRANSLATORS_H + +#include <string> +#include <QStringList> + +class IParameterTranslator { +public: + virtual ~IParameterTranslator() {} + + virtual IParameterTranslator *clone() const=0; + + virtual QStringList split(const QString &par_name) const=0; + virtual std::string translate(const QString &name) const=0; +}; + +class PositionTranslator : public IParameterTranslator { +public: + PositionTranslator(); + virtual ~PositionTranslator() {} + + virtual PositionTranslator *clone() const; + + virtual QStringList split(const QString &par_name) const; + virtual std::string translate(const QString &name) const; +}; + +#endif // PARAMETERTRANSLATORS_H + diff --git a/GUI/coregui/Models/ParameterizedItem.cpp b/GUI/coregui/Models/ParameterizedItem.cpp index 48a79949dad2e75c1fb12fe8285e5467869d83ea..93b63d21b55da69267ed090d3670c34a73e59c96 100644 --- a/GUI/coregui/Models/ParameterizedItem.cpp +++ b/GUI/coregui/Models/ParameterizedItem.cpp @@ -506,6 +506,12 @@ void ParameterizedItem::swapChildren(int first, int second) QStringList ParameterizedItem::splitParameterName(const QString &par_name) const { QStringList result; + for (auto& translator : m_special_translators) { + result = translator->split(par_name); + if (result.size() > 0) { + return result; + } + } result << getFirstField(par_name); QString remainder = stripFirstField(par_name); if (!remainder.isEmpty()) { @@ -531,9 +537,20 @@ QString ParameterizedItem::stripFirstField(const QString &par_name) const std::string ParameterizedItem::translateSingleName(const QString &name) const { + for (auto& translator : m_special_translators) { + auto result = translator->translate(name); + if (!result.empty()) { + return result; + } + } return name.toStdString(); } +void ParameterizedItem::addParameterTranslator(const IParameterTranslator &translator) +{ + m_special_translators.emplace_back(translator.clone()); +} + ParameterizedItem *ParameterizedItem::getChildByDisplayName(const QString &name) const { // look through child items: diff --git a/GUI/coregui/Models/ParameterizedItem.h b/GUI/coregui/Models/ParameterizedItem.h index 38846f196da3e5bae94a43a323eb0291916762a6..1c63f1d987a82b79e2b0b1bb3934abd3d944e166 100644 --- a/GUI/coregui/Models/ParameterizedItem.h +++ b/GUI/coregui/Models/ParameterizedItem.h @@ -20,6 +20,9 @@ #include "item_constants.h" #include "PropertyAttribute.h" #include "MaterialProperty.h" +#include "ParameterTranslators.h" + +#include <memory> #include <QStandardItem> #include <QStringList> #include <QList> @@ -165,7 +168,7 @@ protected: //! use this to enforce a specific order when this matters void swapChildren(int first, int second); - virtual QStringList splitParameterName(const QString& par_name) const; + QStringList splitParameterName(const QString& par_name) const; QString getFirstField(const QString &par_name) const; @@ -173,6 +176,8 @@ protected: virtual std::string translateSingleName(const QString &name) const; + void addParameterTranslator(const IParameterTranslator &translator); + ParameterizedItem* getChildByDisplayName(const QString &name) const; QStringList m_registered_properties; @@ -190,6 +195,7 @@ private: ParameterizedItem *mp_parent; QList<ParameterizedItem *> m_children; QMap<QString, ParameterizedItem *> m_sub_items; + std::vector<std::unique_ptr<IParameterTranslator>> m_special_translators; }; #endif /* PARAMETERIZEDITEM_H_ */ diff --git a/GUI/coregui/Models/ParticleCompositionItem.cpp b/GUI/coregui/Models/ParticleCompositionItem.cpp index ce2feb25588c05ea4db5823ce0148eacb3bc262a..c3e9ebb94f9602539f93291b58ec21fec00617a1 100644 --- a/GUI/coregui/Models/ParticleCompositionItem.cpp +++ b/GUI/coregui/Models/ParticleCompositionItem.cpp @@ -27,6 +27,8 @@ ParticleCompositionItem::ParticleCompositionItem(ParameterizedItem *parent) registerProperty(ParticleItem::P_ABUNDANCE, 1.0, PropertyAttribute(AttLimits::limited(0.0, 1.0), 3)); registerGroupProperty(ParticleItem::P_POSITION, Constants::VectorType); + PositionTranslator position_translator; + addParameterTranslator(position_translator); addToValidChildren(Constants::ParticleType, PortInfo::PORT_0); addToValidChildren(Constants::ParticleCoreShellType, PortInfo::PORT_0); diff --git a/GUI/coregui/Models/ParticleCoreShellItem.cpp b/GUI/coregui/Models/ParticleCoreShellItem.cpp index 8bb3c186cf5dd22f4269025bfa248c3d9e87d6c4..3eca0879ba8fd3aa6756ec03147e2d050e25f9df 100644 --- a/GUI/coregui/Models/ParticleCoreShellItem.cpp +++ b/GUI/coregui/Models/ParticleCoreShellItem.cpp @@ -28,6 +28,8 @@ ParticleCoreShellItem::ParticleCoreShellItem(ParameterizedItem *parent) registerProperty(ParticleItem::P_ABUNDANCE, 1.0, PropertyAttribute(AttLimits::limited(0.0, 1.0), 3)); registerGroupProperty(ParticleItem::P_POSITION, Constants::VectorType); + PositionTranslator position_translator; + addParameterTranslator(position_translator); addToValidChildren(Constants::ParticleType, PortInfo::PORT_0, 1); // Core particle addToValidChildren(Constants::ParticleType, PortInfo::PORT_1, 1); // Shell particle diff --git a/GUI/coregui/Models/ParticleCoreShellItem.h b/GUI/coregui/Models/ParticleCoreShellItem.h index aad1e6f8c48e1899637e781ab55592caa79e8225..a670e83a41f6268421e6405b7d485e07e4053d1b 100644 --- a/GUI/coregui/Models/ParticleCoreShellItem.h +++ b/GUI/coregui/Models/ParticleCoreShellItem.h @@ -34,6 +34,7 @@ public: std::unique_ptr<ParticleCoreShell> createParticleCoreShell() const; void notifyChildParticlePortChanged(); + private: PortInfo::EPorts getFirstAvailableParticlePort() const; }; diff --git a/GUI/coregui/Models/ParticleDistributionItem.cpp b/GUI/coregui/Models/ParticleDistributionItem.cpp index 55d1994a94ab4018dfac02757abbb23d3c3766ac..41da2b492ac8e99dd75d55ff50dd696a860ae8ad 100644 --- a/GUI/coregui/Models/ParticleDistributionItem.cpp +++ b/GUI/coregui/Models/ParticleDistributionItem.cpp @@ -20,6 +20,7 @@ #include "ParticleCoreShell.h" #include "DomainObjectBuilder.h" #include "TransformToDomain.h" +#include "TransformFromDomain.h" #include "DistributionItem.h" #include "Distributions.h" #include "ComboProperty.h" @@ -111,13 +112,22 @@ void ParticleDistributionItem::updateParameterList() if (!isRegisteredProperty(P_DISTRIBUTED_PARAMETER)) return; QVariant par_prop = getRegisteredProperty(P_DISTRIBUTED_PARAMETER); - QString selected_par = par_prop.value<ComboProperty>().getValue(); - QString cached_par = par_prop.value<ComboProperty>().getCachedValue(); - ComboProperty updated_prop; + auto combo_prop = par_prop.value<ComboProperty>(); + QString cached_par = combo_prop.getCachedValue(); + if (!combo_prop.cacheContainsGUIValue()) { + auto gui_name = TransformFromDomain::translateParameterNameToGUI(this, cached_par); + if (!gui_name.isEmpty()) { + cached_par = gui_name; + combo_prop.setCachedValue(cached_par); + combo_prop.setCacheContainsGUIFlag(); + } + } + QString selected_par = combo_prop.getValue(); QStringList par_names = getChildParameterNames(); par_names.removeAll(ParticleItem::P_ABUNDANCE); - updated_prop = ComboProperty(par_names); + auto updated_prop = ComboProperty(par_names); updated_prop.setCachedValue(cached_par); + updated_prop.setCacheContainsGUIFlag(combo_prop.cacheContainsGUIValue()); if (updated_prop.getValues().contains(cached_par) ) { updated_prop.setValue(cached_par); } else if (updated_prop.getValues().contains(selected_par)) { diff --git a/GUI/coregui/Models/ParticleItem.cpp b/GUI/coregui/Models/ParticleItem.cpp index 892110f532e62d40af6038b414ec9e22d8e1c932..b2f9ca1fc0350ed1e3653e977dd45b5c492c79cc 100644 --- a/GUI/coregui/Models/ParticleItem.cpp +++ b/GUI/coregui/Models/ParticleItem.cpp @@ -39,6 +39,8 @@ ParticleItem::ParticleItem(ParameterizedItem *parent) registerProperty(P_ABUNDANCE, 1.0, PropertyAttribute(AttLimits::limited(0.0, 1.0),3)); registerGroupProperty(P_POSITION, Constants::VectorType); + PositionTranslator position_translator; + addParameterTranslator(position_translator); addToValidChildren(Constants::TransformationType, PortInfo::PORT_0, 1); setPropertyAppearance(ParameterizedItem::P_NAME, diff --git a/GUI/coregui/Models/TransformFromDomain.cpp b/GUI/coregui/Models/TransformFromDomain.cpp index bfd4553126a05178597c3ef22001f2da7b0d31e5..f73097b432b2f23f5e00aa2238f351071acc500a 100644 --- a/GUI/coregui/Models/TransformFromDomain.cpp +++ b/GUI/coregui/Models/TransformFromDomain.cpp @@ -347,6 +347,7 @@ void TransformFromDomain::setItemFromSample(ParameterizedItem *item, = item->getRegisteredProperty(ParticleDistributionItem::P_DISTRIBUTED_PARAMETER) .value<ComboProperty>(); combo_property.setCachedValue(main_distr_par_name); + combo_property.setCacheContainsGUIFlag(false); item->setRegisteredProperty(ParticleDistributionItem::P_DISTRIBUTED_PARAMETER, combo_property.getVariant()); @@ -581,3 +582,16 @@ void TransformFromDomain::setItemFromSample(BeamDistributionItem *beamDistributi distributionItem->setRegisteredProperty(DistributionItem::P_SIGMA_FACTOR, sigma_factor); } } + +QString TransformFromDomain::translateParameterNameToGUI(ParameterizedItem *item, + const QString &par_name) +{ + auto gui_par_list = item->getParameterTreeList(); + for (auto gui_par_name : gui_par_list) { + auto domain_par_name = QString::fromStdString(item->translateParameterName(gui_par_name)); + if (domain_par_name == par_name) { + return gui_par_name; + } + } + return QString(); +} diff --git a/GUI/coregui/Models/TransformFromDomain.h b/GUI/coregui/Models/TransformFromDomain.h index 934e4d072601671556c66133ff5b443b92cf6a90..cf2c57e083b4c2f79c5f3804a8b14899fb635eb4 100644 --- a/GUI/coregui/Models/TransformFromDomain.h +++ b/GUI/coregui/Models/TransformFromDomain.h @@ -40,17 +40,16 @@ class IDistribution1D; namespace TransformFromDomain { -BA_CORE_API_ void setItemFromSample(ParameterizedItem *item, - const FormFactorAnisoPyramid *sample); +BA_CORE_API_ void setItemFromSample(ParameterizedItem *item, const FormFactorAnisoPyramid *sample); BA_CORE_API_ void setItemFromSample(ParameterizedItem *item, - const InterferenceFunctionRadialParaCrystal *sample); + const InterferenceFunctionRadialParaCrystal *sample); BA_CORE_API_ void setItemFromSample(ParameterizedItem *item, - const InterferenceFunction2DParaCrystal *sample); + const InterferenceFunction2DParaCrystal *sample); BA_CORE_API_ void setItemFromSample(ParameterizedItem *item, - const InterferenceFunction2DLattice *sample); + const InterferenceFunction2DLattice *sample); BA_CORE_API_ void setItemFromSample(ParameterizedItem *layerItem, const Layer *layer, @@ -68,10 +67,13 @@ BA_CORE_API_ bool isHexagonalLattice(double length1, double length2, double angl BA_CORE_API_ void setItemFromSample(BeamItem *beamItem, const GISASSimulation &simulation); -BA_CORE_API_ void setItemFromSample(PhiAlphaDetectorItem *detectorItem, const GISASSimulation &simulation); +BA_CORE_API_ void setItemFromSample(PhiAlphaDetectorItem *detectorItem, + const GISASSimulation &simulation); -BA_CORE_API_ void setItemFromSample(BeamDistributionItem *beamDistributionItem, const ParameterDistribution ¶meterDistribution); +BA_CORE_API_ void setItemFromSample(BeamDistributionItem *beamDistributionItem, + const ParameterDistribution ¶meterDistribution); +BA_CORE_API_ QString translateParameterNameToGUI(ParameterizedItem *item, const QString &par_name); } #endif