diff --git a/GUI/View/Instrument/DistributionEditor.cpp b/GUI/View/Instrument/DistributionEditor.cpp index 311ef00c81e6d521369b20ac8ba37d1d19e9bfba..f7cc2e5567aa1f0808fd8c64cf18a4be9e7c161b 100644 --- a/GUI/View/Instrument/DistributionEditor.cpp +++ b/GUI/View/Instrument/DistributionEditor.cpp @@ -18,8 +18,9 @@ #include "GUI/Model/Device/BeamDistributionItem.h" #include "GUI/Support/XML/Backup.h" #include "GUI/Support/XML/Streamer.h" -#include "GUI/View/Instrument/DistributionForms.h" +#include "GUI/View/Edit/DoubleSpinBox.h" #include "GUI/View/Instrument/DistributionPlot.h" +#include "GUI/View/PropertyEditor/ScientificSpinBox.h" #include "GUI/View/Tool/GroupBoxCollapser.h" #include "GUI/View/Tool/WidgetUtils.h" #include <QComboBox> @@ -58,27 +59,91 @@ void DistributionSelector::createDistributionWidgets() while (m_formLayout->rowCount() > 1) m_formLayout->removeRow(1); - DistributionForm* form = nullptr; - if (m_item->distribution()->is<DistributionCosineItem>()) - form = new CosineDistributionForm(m_meanConfig, this); - else if (m_item->distribution()->is<DistributionGateItem>()) - form = new GateDistributionForm(this); - else if (m_item->distribution()->is<DistributionGaussianItem>()) - form = new GaussDistributionForm(m_meanConfig, this); - else if (m_item->distribution()->is<DistributionLogNormalItem>()) - form = new LogNormalDistributionForm(this); - else if (m_item->distribution()->is<DistributionLorentzItem>()) - form = new LorentzDistributionForm(m_meanConfig, this); - else if (m_item->distribution()->is<DistributionNoneItem>()) - form = new NoneDistributionForm(m_meanConfig, this); - else if (m_item->distribution()->is<DistributionTrapezoidItem>()) - form = new TrapezoidDistributionForm(this); - - ASSERT(form); - form->setupDistribution(m_item); - m_formLayout->addRow(form); - connect(form, &CosineDistributionForm::distributionChanged, this, - &DistributionSelector::distributionChanged); + if (auto* cosine = dynamic_cast<DistributionCosineItem*>(m_item->distribution())) { + createMeanSpinBox(cosine->mean()); + createSpinBox(cosine->sigma()); + createSpinBox(cosine->numberOfSamples()); + createSpinBox(cosine->sigmaFactor()); + } else if (auto* gate = dynamic_cast<DistributionGateItem*>(m_item->distribution())) { + auto* minSpinbox = createSpinBox(gate->minimum()); + auto* maxSpinbox = createSpinBox(gate->maximum()); + connect(minSpinbox, &DoubleSpinBox::baseValueChanged, [=](double d) { + if (d > gate->maximum()) { + gate->setMaximum(d); + maxSpinbox->updateValue(); + } + }); + connect(maxSpinbox, &DoubleSpinBox::baseValueChanged, [=](double d) { + if (d < gate->minimum()) { + gate->setMinimum(d); + minSpinbox->updateValue(); + } + }); + createSpinBox(gate->numberOfSamples()); + } else if (auto* gauss = dynamic_cast<DistributionGaussianItem*>(m_item->distribution())) { + createMeanSpinBox(gauss->mean()); + createSpinBox(gauss->standardDeviation()); + createSpinBox(gauss->numberOfSamples()); + createSpinBox(gauss->sigmaFactor()); + } else if (auto* logNormal = dynamic_cast<DistributionLogNormalItem*>(m_item->distribution())) { + createSpinBox(logNormal->median()); + createSpinBox(logNormal->scaleParameter()); + createSpinBox(logNormal->numberOfSamples()); + createSpinBox(logNormal->sigmaFactor()); + } else if (auto* lorentz = dynamic_cast<DistributionLorentzItem*>(m_item->distribution())) { + createMeanSpinBox(lorentz->mean()); + createSpinBox(lorentz->hwhm()); + createSpinBox(lorentz->numberOfSamples()); + createSpinBox(lorentz->sigmaFactor()); + } else if (auto* none = dynamic_cast<DistributionNoneItem*>(m_item->distribution())) { + createMeanSpinBox(none->mean()); + } else if (auto* trapezoid = dynamic_cast<DistributionTrapezoidItem*>(m_item->distribution())) { + createSpinBox(trapezoid->center()); + createSpinBox(trapezoid->leftWidth()); + createSpinBox(trapezoid->middleWidth()); + createSpinBox(trapezoid->rightWidth()); + createSpinBox(trapezoid->numberOfSamples()); + } +} + +DoubleSpinBox* DistributionSelector::createSpinBox(const DoubleDescriptor& d) +{ + auto* sb = GUI::Util::createSpinBox(m_formLayout, d); + connect(sb, &DoubleSpinBox::baseValueChanged, [=](double v) { + if (d.get() != v) { + d.set(v); + emit distributionChanged(); + } + }); + return sb; +} + +QSpinBox* DistributionSelector::createSpinBox(const UIntDescriptor& d) +{ + auto* sb = GUI::Util::createSpinBox(m_formLayout, d); + connect(sb, QOverload<int>::of(&QSpinBox::valueChanged), [=](int v) { + if (d.get() != v) { + d.set(v); + emit distributionChanged(); + } + }); + return sb; +} + +void DistributionSelector::createMeanSpinBox(const DoubleDescriptor& d) +{ + if (m_meanConfig) { + if (m_meanConfig->scientific) { + auto* sb = GUI::Util::createScientificSpinBox(m_formLayout, d); + connect(sb, &ScientificSpinBox::valueChanged, [=](double v) { + if (d.get() != v) { + d.set(v); + emit distributionChanged(); + } + }); + } else + createSpinBox(d); + } } BeamDistributionItem* DistributionSelector::item() const diff --git a/GUI/View/Instrument/DistributionEditor.h b/GUI/View/Instrument/DistributionEditor.h index 1d2e4268078da4870d8f0c9e4085184bf0615108..5192ea54e080c21e0e5b197ad2a1be5691da813b 100644 --- a/GUI/View/Instrument/DistributionEditor.h +++ b/GUI/View/Instrument/DistributionEditor.h @@ -24,6 +24,11 @@ class DistributionForm; class BeamDistributionItem; class QFormLayout; class DistributionPlot; +class DoubleSpinBox; +class ScientificSpinBox; +class QSpinBox; +class DoubleDescriptor; +class UIntDescriptor; #include <boost/numeric/interval.hpp> @@ -64,6 +69,9 @@ signals: private: void createDistributionWidgets(); + DoubleSpinBox* createSpinBox(const DoubleDescriptor& d); + QSpinBox* createSpinBox(const UIntDescriptor& d); + void createMeanSpinBox(const DoubleDescriptor& d); private: BeamDistributionItem* m_item;