diff --git a/GUI/View/Instrument/DistributionEditor.cpp b/GUI/View/Instrument/DistributionEditor.cpp index 5ecc637216e01e4ad56c34e40ab306991c8ae5df..5fcceec603d8e5c1ff87a3bb5429327a90537f23 100644 --- a/GUI/View/Instrument/DistributionEditor.cpp +++ b/GUI/View/Instrument/DistributionEditor.cpp @@ -19,8 +19,10 @@ #include "GUI/Support/XML/Backup.h" #include "GUI/Support/XML/Streamer.h" #include "GUI/View/Instrument/DistributionForms.h" +#include "GUI/View/Instrument/DistributionPlot.h" #include "GUI/View/Instrument/EditDistributionDialog.h" #include "GUI/View/PropertyEditor/GroupInfoBox.h" +#include "GUI/View/Tool/GroupBoxCollapser.h" #include "GUI/View/Tool/WidgetUtils.h" #include <QComboBox> #include <QFormLayout> @@ -112,20 +114,29 @@ DistributionEditor::DistributionEditor(const QString& title, const std::optional<MeanConfig>& mean_config, GUI::ID::Distributions distributions, QWidget* parent, BeamDistributionItem* item) - : QWidget(parent) + : QGroupBox(title, parent) , m_title(title) { - auto* layout = new QVBoxLayout(this); + setProperty("subgroup", true); // for stylesheet addressing + auto* hLayout = new QHBoxLayout(this); + m_selector = new DistributionSelector(mean_config, distributions, this, item); + hLayout->addWidget(m_selector); + hLayout->setSpacing(50); + + m_plot = new DistributionPlot(this); + m_plot->setFixedSize(280, 170); + m_plot->setShowMouseCoords(false); + hLayout->addWidget(m_plot); + hLayout->addStretch(1); - auto* gbox = new GroupInfoBox(title, this); - auto* glayout = new QVBoxLayout(gbox); - m_selector = new DistributionSelector(mean_config, distributions, gbox, item); - glayout->addWidget(m_selector); - layout->addWidget(gbox); + GroupBoxCollapser::installIntoGroupBox(this); connect(m_selector, &DistributionSelector::distributionChanged, this, &DistributionEditor::distributionChanged); - connect(gbox, &GroupInfoBox::clicked, this, &DistributionEditor::showDialog); + connect(m_selector, &DistributionSelector::distributionChanged, this, + &DistributionEditor::updatePlot); + + updatePlot(); } void DistributionEditor::updateData() @@ -138,6 +149,14 @@ void DistributionEditor::showDialog() showEditDistributionDialog(m_selector, m_title); } +void DistributionEditor::updatePlot() +{ + auto* d = m_selector->item()->distribution(); + m_plot->setVisible(!dynamic_cast<const DistributionNoneItem*>(d)); + m_plot->setItem(d); + m_plot->plotItem(); +} + //-------------------------------------------------------------------------------------------------- // free functions //-------------------------------------------------------------------------------------------------- diff --git a/GUI/View/Instrument/DistributionEditor.h b/GUI/View/Instrument/DistributionEditor.h index 788a973ac5b769d09e353cdaeca3ad65af620dae..a2928e972090983f9f22591601ae28bad70c4552 100644 --- a/GUI/View/Instrument/DistributionEditor.h +++ b/GUI/View/Instrument/DistributionEditor.h @@ -16,13 +16,14 @@ #define BORNAGAIN_GUI_VIEW_INSTRUMENT_DISTRIBUTIONEDITOR_H #include "GUI/View/Tool/ID.h" -#include <QWidget> +#include <QGroupBox> class QComboBox; class QStackedLayout; class DistributionForm; class BeamDistributionItem; class QFormLayout; +class DistributionPlot; #include <boost/numeric/interval.hpp> @@ -76,7 +77,7 @@ private: /// DistributionSelector as above but contained in a GroupBox with a title and a button /// to open the distribution dialog -class DistributionEditor : public QWidget { +class DistributionEditor : public QGroupBox { Q_OBJECT public: @@ -92,10 +93,12 @@ signals: private slots: void showDialog(); + void updatePlot(); private: QString m_title; DistributionSelector* m_selector; + DistributionPlot* m_plot; }; /// utility function to show the EditDistributionDialog for a selector diff --git a/GUI/View/Instrument/DistributionPlot.cpp b/GUI/View/Instrument/DistributionPlot.cpp index 15e60ac8baf2813ed76b226bb2acba5138301b94..d9cb8b69bc468930eb91e5db2ce82943555b8db0 100644 --- a/GUI/View/Instrument/DistributionPlot.cpp +++ b/GUI/View/Instrument/DistributionPlot.cpp @@ -297,6 +297,11 @@ void DistributionPlot::setXAxisName(const QString& xAxisName) m_plot->xAxis->setLabel(xAxisName); } +void DistributionPlot::setShowMouseCoords(bool b) +{ + m_label->setVisible(b); +} + namespace { //! Returns (xmin, xmax) of x-axis to display single value. diff --git a/GUI/View/Instrument/DistributionPlot.h b/GUI/View/Instrument/DistributionPlot.h index 08c0a4fe45e4a583b9ed042219bce85a1f10bab2..8df15e3db588b567cc0921572d9cb5f7a11f2e0f 100644 --- a/GUI/View/Instrument/DistributionPlot.h +++ b/GUI/View/Instrument/DistributionPlot.h @@ -36,6 +36,7 @@ public: void setItem(DistributionItem* item); void plotItem(); void setXAxisName(const QString& xAxisName); + void setShowMouseCoords(bool b); public slots: void onMouseMove(QMouseEvent* event); diff --git a/GUI/View/Instrument/InclinationAnglesEditor.cpp b/GUI/View/Instrument/InclinationAnglesEditor.cpp index 49f7873dd4afb470c9974c2a373af8a2962b51fd..1c0badc9055ee55fc5720df6317c77fa020233e3 100644 --- a/GUI/View/Instrument/InclinationAnglesEditor.cpp +++ b/GUI/View/Instrument/InclinationAnglesEditor.cpp @@ -17,39 +17,35 @@ #include "GUI/Model/Device/PointwiseAxisItem.h" #include "GUI/Model/Device/SpecularBeamInclinationItem.h" #include "GUI/View/Instrument/DistributionEditor.h" +#include "GUI/View/Instrument/DistributionPlot.h" #include "GUI/View/Instrument/SphericalAxisEditor.h" #include "GUI/View/PropertyEditor/GroupInfoBox.h" - +#include "GUI/View/Tool/GroupBoxCollapser.h" #include <QComboBox> #include <QFormLayout> -namespace { -static constexpr auto title = "Inclination angles [deg]"; -} - InclinationAnglesEditor::InclinationAnglesEditor(QWidget* parent, SpecularBeamInclinationItem* item) - : QWidget(parent) + : QGroupBox("Inclination angles [deg]", parent) , m_item(item) { - auto* layout = new QVBoxLayout(this); + setProperty("subgroup", true); // for stylesheet addressing + auto* hLayout = new QHBoxLayout(this); - auto* gbox = new GroupInfoBox(title, this); - auto* gform = new QFormLayout(gbox); - connect(gbox, &GroupInfoBox::clicked, this, &InclinationAnglesEditor::showDialog); - layout->addWidget(gbox); + auto* gform = new QFormLayout(this); + hLayout->addLayout(gform); - m_distributionEditor = - new DistributionSelector(std::nullopt, GUI::ID::Distributions::Symmetric, gbox, m_item); - gform->addRow(m_distributionEditor); + m_selector = + new DistributionSelector(std::nullopt, GUI::ID::Distributions::Symmetric, this, m_item); + gform->addRow(m_selector); - m_typeComboBox = new QComboBox(gbox); + m_typeComboBox = new QComboBox(this); m_typeComboBox->addItem("Uniform axis"); m_typeComboBox->addItem("Non-uniform axis"); gform->addRow("Axis type:", m_typeComboBox); connect(m_typeComboBox, qOverload<int>(&QComboBox::currentIndexChanged), this, &InclinationAnglesEditor::onAxisTypeSelected); - m_form = new SphericalAxisForm(gform, gbox); + m_form = new SphericalAxisForm(gform, this); const int idx = m_item->pointwiseAlphaAxisSelected() ? 1 : 0; ASSERT(idx != -1); @@ -59,9 +55,22 @@ InclinationAnglesEditor::InclinationAnglesEditor(QWidget* parent, SpecularBeamIn onAxisTypeSelected(idx); // trigger update manually m_typeComboBox->setEnabled(m_item->pointwiseAlphaAxisDefined()); - connect(m_distributionEditor, &DistributionSelector::distributionChanged, this, + m_plot = new DistributionPlot(this); + m_plot->setFixedSize(280, 170); + m_plot->setShowMouseCoords(false); + hLayout->addWidget(m_plot); + hLayout->setAlignment(m_plot, Qt::AlignTop); + hLayout->addStretch(1); + + GroupBoxCollapser::installIntoGroupBox(this); + + connect(m_selector, &DistributionSelector::distributionChanged, this, &InclinationAnglesEditor::dataChanged); + connect(m_selector, &DistributionSelector::distributionChanged, this, + &InclinationAnglesEditor::updatePlot); connect(m_form, &SphericalAxisForm::dataChanged, this, &InclinationAnglesEditor::dataChanged); + + updatePlot(); } void InclinationAnglesEditor::updateIndicators() @@ -89,7 +98,10 @@ void InclinationAnglesEditor::onAxisTypeSelected(int index) } } -void InclinationAnglesEditor::showDialog() +void InclinationAnglesEditor::updatePlot() { - showEditDistributionDialog(m_distributionEditor, title); + auto* d = m_selector->item()->distribution(); + m_plot->setVisible(!dynamic_cast<const DistributionNoneItem*>(d)); + m_plot->setItem(d); + m_plot->plotItem(); } diff --git a/GUI/View/Instrument/InclinationAnglesEditor.h b/GUI/View/Instrument/InclinationAnglesEditor.h index bd2f7a80815acce3732af0aace084fc518ad033d..9c1d2e9621ee0f17f854545ae438d3ef524afc26 100644 --- a/GUI/View/Instrument/InclinationAnglesEditor.h +++ b/GUI/View/Instrument/InclinationAnglesEditor.h @@ -15,16 +15,17 @@ #ifndef BORNAGAIN_GUI_VIEW_INSTRUMENT_INCLINATIONANGLESEDITOR_H #define BORNAGAIN_GUI_VIEW_INSTRUMENT_INCLINATIONANGLESEDITOR_H -#include <QWidget> +#include <QGroupBox> class DistributionSelector; class QComboBox; class SpecularBeamInclinationItem; class SphericalAxisForm; +class DistributionPlot; //! Editor for the case where there is no single inclination angle -class InclinationAnglesEditor : public QWidget { +class InclinationAnglesEditor : public QGroupBox { Q_OBJECT public: InclinationAnglesEditor(QWidget* parent, SpecularBeamInclinationItem* item); @@ -36,13 +37,14 @@ signals: private slots: void onAxisTypeSelected(int index); - void showDialog(); + void updatePlot(); private: - DistributionSelector* m_distributionEditor; + DistributionSelector* m_selector; QComboBox* m_typeComboBox; SphericalAxisForm* m_form; SpecularBeamInclinationItem* m_item; + DistributionPlot* m_plot; };