diff --git a/.gitignore b/.gitignore index f694b510019a31f53443d1a9af834b15580961b7..1ca967432496334d01e9ba66e0acb4ab8745d13d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ *~ +#* *.tmp *.user *.user.* diff --git a/GUI/Model/Job/DataSource.cpp b/GUI/Model/Job/DataSource.cpp index 722248a4eed6cf697bf301befcdf493f6ba893b8..9cc6fead48fc287c0aac5c9f5ae29f694f7dd7ad 100644 --- a/GUI/Model/Job/DataSource.cpp +++ b/GUI/Model/Job/DataSource.cpp @@ -96,34 +96,42 @@ JobItem* DataFromJob::jobxItem() const Data1DItem* DataFromJob::realData1DItem() const { - if (const DatafileItem* ii = jobxItem()->dfileItem()) - return dynamic_cast<Data1DItem*>(ii->dataItem()); + if (JobItem* ji = jobxItem()) + return ji->dfileItem()->data1DItem(); return nullptr; } Data2DItem* DataFromJob::realData2DItem() const { - if (const DatafileItem* ii = jobxItem()->dfileItem()) - return dynamic_cast<Data2DItem*>(ii->dataItem()); + if (JobItem* ji = jobxItem()) + return ji->dfileItem()->data2DItem(); return nullptr; } Data1DItem* DataFromJob::simuData1DItem() const { - return dynamic_cast<Data1DItem*>(jobxItem()->simulatedDataItem()); + if (JobItem* ji = jobxItem()) + return ji->data1DItem(); + return nullptr; } Data2DItem* DataFromJob::simuData2DItem() const { - return dynamic_cast<Data2DItem*>(jobxItem()->simulatedDataItem()); + if (JobItem* ji = jobxItem()) + return ji->data2DItem(); + return nullptr; } Data1DItem* DataFromJob::diffData1DItem() const { - return dynamic_cast<Data1DItem*>(jobxItem()->diffDataItem()); + if (JobItem* ji = jobxItem()) + return dynamic_cast<Data1DItem*>(ji->diffDataItem()); + return nullptr; } Data2DItem* DataFromJob::diffData2DItem() const { - return dynamic_cast<Data2DItem*>(jobxItem()->diffDataItem()); + if (JobItem* ji = jobxItem()) + return dynamic_cast<Data2DItem*>(ji->diffDataItem()); + return nullptr; } diff --git a/GUI/Model/Job/JobItem.cpp b/GUI/Model/Job/JobItem.cpp index 1a62440231acd86f6ca18faec5fced11cf7edca0..c57101eddd6783c1ab8c142c433d7991100aebb4 100644 --- a/GUI/Model/Job/JobItem.cpp +++ b/GUI/Model/Job/JobItem.cpp @@ -130,6 +130,11 @@ void JobItem::createSimulatedDataItem() m_simulated_data_item.reset(::newDataItem(rank())); } +Data1DItem* JobItem::data1DItem() +{ + return dynamic_cast<Data1DItem*>(m_simulated_data_item.get()); +} + Data2DItem* JobItem::data2DItem() { return dynamic_cast<Data2DItem*>(m_simulated_data_item.get()); diff --git a/GUI/Model/Job/JobItem.h b/GUI/Model/Job/JobItem.h index 8da59ae236331b4600fb2964536a66be09b65584..0ab66398198158e2cd1f2eaaddd1993ab6815055 100644 --- a/GUI/Model/Job/JobItem.h +++ b/GUI/Model/Job/JobItem.h @@ -20,6 +20,7 @@ #include <QThread> class BatchInfo; +class Data1DItem; class Data2DItem; class DataItem; class Datafield; @@ -89,6 +90,7 @@ public: //... data void createSimulatedDataItem(); + Data1DItem* data1DItem(); Data2DItem* data2DItem(); DataItem* simulatedDataItem() { return m_simulated_data_item.get(); } diff --git a/GUI/Model/Job/JobsSet.h b/GUI/Model/Job/JobsSet.h index c3c3d9fd5a6f85ec54923533f0962b1d80b1deb5..f69e1b225864f54b2672f040f16814723c590fe7 100644 --- a/GUI/Model/Job/JobsSet.h +++ b/GUI/Model/Job/JobsSet.h @@ -53,6 +53,7 @@ signals: void jobMeritsAttention(JobItem* item); void globalProgress(int); void jobAdded(); + void setChanged(); private slots: void onFinishedJob(JobItem* job_item); diff --git a/GUI/View/Canvas/ProgressCanvas.cpp b/GUI/View/Canvas/ProgressCanvas.cpp index 6d758298d0c0d2d2ad25f72918ce6bd2d27754c6..134d843f64808321fce3ea61af8e42dce64589b8 100644 --- a/GUI/View/Canvas/ProgressCanvas.cpp +++ b/GUI/View/Canvas/ProgressCanvas.cpp @@ -14,7 +14,8 @@ #include "GUI/View/Canvas/ProgressCanvas.h" #include "Base/Util/Assert.h" -#include "GUI/Model/Job/JobItem.h" +#include "GUI/Model/Job/JobsSet.h" +#include "GUI/Model/Project/ProjectDocument.h" #include "GUI/Model/Tune/FitSuiteItem.h" #include "GUI/View/Plotter/HistogramPlot.h" #include <QVBoxLayout> @@ -29,20 +30,25 @@ ProgressCanvas::ProgressCanvas() layout->addWidget(m_hist_plot); setStyleSheet("background-color:white;"); + + connect(gDoc->jobs(), &JobsSet::setChanged, this, &ProgressCanvas::setJobItem); } -void ProgressCanvas::setJobItem(JobItem* item) +void ProgressCanvas::setJobItem() { - ASSERT(item); - m_job_item = item; - - connect(item->fitSuiteItem(), &FitSuiteItem::iterationCountChanged, this, - &ProgressCanvas::onIterationCountChanged, Qt::UniqueConnection); + if (const JobItem* ji = gDoc->jobs()->currentItem()) { + connect(ji->fitSuiteItem(), &FitSuiteItem::iterationCountChanged, this, + &ProgressCanvas::onIterationCountChanged, Qt::UniqueConnection); + show(); + } else + hide(); } void ProgressCanvas::onIterationCountChanged(int iter) { - double chi = m_job_item->fitSuiteItem()->chi2(); + const JobItem* ji = gDoc->jobs()->currentItem(); + ASSERT(ji); + double chi = ji->fitSuiteItem()->chi2(); if (iter == 1) m_hist_plot->clearData(); m_hist_plot->addData(static_cast<double>(iter), chi); diff --git a/GUI/View/Canvas/ProgressCanvas.h b/GUI/View/Canvas/ProgressCanvas.h index 6e3e7ea369aa0f792bad20a12af0bd56bd6fc112..2b254d81089c39d204566cde050cd0a7db06ba18 100644 --- a/GUI/View/Canvas/ProgressCanvas.h +++ b/GUI/View/Canvas/ProgressCanvas.h @@ -18,7 +18,6 @@ #include <QWidget> class HistogramPlot; -class JobItem; //! Intended for showing chi2 .vs interation count dependency. //! The main goal is to fill vacant place in Fit2DFrame. @@ -28,13 +27,11 @@ class ProgressCanvas : public QWidget { public: ProgressCanvas(); - void setJobItem(JobItem* job_item); - private: + void setJobItem(); void onIterationCountChanged(int iter); HistogramPlot* m_hist_plot; - const JobItem* m_job_item; }; #endif // BORNAGAIN_GUI_VIEW_CANVAS_PROGRESSCANVAS_H diff --git a/GUI/View/Frame/Fit1DFrame.cpp b/GUI/View/Frame/Fit1DFrame.cpp index 15b8902ca50367f6297e86cf175eff7c810a1ee9..142b64a153776f5084d766cadab1a1e19db5d17c 100644 --- a/GUI/View/Frame/Fit1DFrame.cpp +++ b/GUI/View/Frame/Fit1DFrame.cpp @@ -21,7 +21,7 @@ #include "GUI/Model/Data/Data1DItem.h" #include "GUI/Model/Data/RangeUtil.h" #include "GUI/Model/Job/DataSource.h" -#include "GUI/Model/Job/JobItem.h" +#include "GUI/Model/Job/JobsSet.h" #include "GUI/Model/Project/ProjectDocument.h" #include "GUI/View/Canvas/ProgressCanvas.h" #include "GUI/View/Canvas/SpecularPlotCanvas.h" @@ -30,10 +30,9 @@ #include "GUI/View/Setup/AxisPanel.h" #include "GUI/View/Setup/FrameActions.h" -Fit1DFrame::Fit1DFrame(JobItem* job_item) +Fit1DFrame::Fit1DFrame() : m_data_canvas(new SpecularPlotCanvas) , m_diff_canvas(new SpecularPlotCanvas) - , m_progress_canvas(new ProgressCanvas) , m_status_label(new PlotStatusLabel(nullptr)) , m_reset_view_action(new QAction(this)) { @@ -47,7 +46,8 @@ Fit1DFrame::Fit1DFrame(JobItem* job_item) gridLayout->addWidget(m_data_canvas, 0, 0, 1, -1); gridLayout->addWidget(m_diff_canvas, 1, 0, 1, 2); - gridLayout->addWidget(m_progress_canvas, 1, 2, 1, 1); + auto* progress_canvas = new ProgressCanvas; + gridLayout->addWidget(progress_canvas, 1, 2, 1, 1); vlayout->addLayout(gridLayout); vlayout->addWidget(m_status_label); @@ -73,15 +73,10 @@ Fit1DFrame::Fit1DFrame(JobItem* job_item) connect(m_reset_view_action, &QAction::triggered, this, &Fit1DFrame::onResetViewAction); GUI::Util::Ranges::setCommonRangeY(m_data_source->mainData1DItems()); - updateDiffData(); - connectItems(); - m_data_canvas->setData1DItems( - {m_data_source->simuData1DItem(), m_data_source->realData1DItem()}); - m_diff_canvas->setData1DItems({m_data_source->diffData1DItem()}); + connect(gDoc->jobs(), &JobsSet::setChanged, this, &Fit1DFrame::updateFrame); - ASSERT(job_item); - m_progress_canvas->setJobItem(job_item); + updateFrame(); } Fit1DFrame::~Fit1DFrame() = default; @@ -99,19 +94,27 @@ void Fit1DFrame::onResetViewAction() gDoc->setModified(); } -void Fit1DFrame::connectItems() +void Fit1DFrame::updateFrame() { - // sync X axis view area between simulated and difference plots - // simu --> diff - connect(m_data_source->simuData1DItem(), &DataItem::updateOtherPlots, - m_data_source->diffData1DItem(), &DataItem::checkXranges, Qt::UniqueConnection); - // diff --> simu - connect(m_data_source->diffData1DItem(), &DataItem::updateOtherPlots, - m_data_source->simuData1DItem(), &DataItem::checkXranges, Qt::UniqueConnection); - - // update diff data if simulation data changes - connect(m_data_source->simuData1DItem(), &Data1DItem::datafieldChanged, this, - &Fit1DFrame::updateDiffData, Qt::UniqueConnection); + if (m_data_source->simuData1DItem() && m_data_source->realData1DItem()) { + m_data_canvas->setData1DItems( + {m_data_source->simuData1DItem(), m_data_source->realData1DItem()}); + m_diff_canvas->setData1DItems({m_data_source->diffData1DItem()}); + // sync X axis view area between simulated and difference plots + // simu --> diff + connect(m_data_source->simuData1DItem(), &DataItem::updateOtherPlots, + m_data_source->diffData1DItem(), &DataItem::checkXranges, Qt::UniqueConnection); + // diff --> simu + connect(m_data_source->diffData1DItem(), &DataItem::updateOtherPlots, + m_data_source->simuData1DItem(), &DataItem::checkXranges, Qt::UniqueConnection); + + // update diff data if simulation data changes + connect(m_data_source->simuData1DItem(), &Data1DItem::datafieldChanged, this, + &Fit1DFrame::updateDiffData, Qt::UniqueConnection); + updateDiffData(); + show(); + } else + hide(); } void Fit1DFrame::updateDiffData() diff --git a/GUI/View/Frame/Fit1DFrame.h b/GUI/View/Frame/Fit1DFrame.h index 7c3aae87d4e8df10847d4c7f5497181e7edf9c63..723e3acce9f7b3c8133e91f36f076a2cba1f35d8 100644 --- a/GUI/View/Frame/Fit1DFrame.h +++ b/GUI/View/Frame/Fit1DFrame.h @@ -19,10 +19,7 @@ #include <QWidget> class DataSource; -class JobItem; -class JobRealBase; class PlotStatusLabel; -class ProgressCanvas; class SpecularPlotCanvas; //! The Fit2DFrame class plots real data, simulated data and their relative difference @@ -31,9 +28,11 @@ class SpecularPlotCanvas; class Fit1DFrame : public QWidget { Q_OBJECT public: - explicit Fit1DFrame(JobItem* item); + Fit1DFrame(); ~Fit1DFrame(); + void updateFrame(); + private: void onResetViewAction(); void connectItems(); @@ -41,7 +40,6 @@ private: SpecularPlotCanvas* m_data_canvas; SpecularPlotCanvas* m_diff_canvas; - ProgressCanvas* m_progress_canvas; PlotStatusLabel* m_status_label; QAction* m_reset_view_action; diff --git a/GUI/View/Frame/Fit2DFrame.cpp b/GUI/View/Frame/Fit2DFrame.cpp index bd4925d9704b4cde94ec6eb2f7f9b4ae097734a7..06ae6e776a8521a7143b7ec099f1d9901c098552 100644 --- a/GUI/View/Frame/Fit2DFrame.cpp +++ b/GUI/View/Frame/Fit2DFrame.cpp @@ -20,7 +20,6 @@ #include "GUI/Model/Data/Data2DItem.h" #include "GUI/Model/Data/RangeUtil.h" #include "GUI/Model/Job/DataSource.h" -#include "GUI/Model/Job/JobItem.h" #include "GUI/Model/Project/ProjectDocument.h" #include "GUI/View/Canvas/ColorMapCanvas.h" #include "GUI/View/Canvas/ProgressCanvas.h" @@ -30,11 +29,10 @@ #include "GUI/View/Setup/FrameActions.h" #include <QVBoxLayout> -Fit2DFrame::Fit2DFrame(JobItem* job_item) +Fit2DFrame::Fit2DFrame() : m_real_canvas(new ColorMapCanvas) , m_simu_canvas(new ColorMapCanvas) , m_diff_canvas(new ColorMapCanvas) - , m_progress_canvas(new ProgressCanvas) , m_status_label(new PlotStatusLabel(nullptr)) , m_reset_view_action(new QAction(this)) { @@ -49,7 +47,8 @@ Fit2DFrame::Fit2DFrame(JobItem* job_item) gridLayout->addWidget(m_real_canvas, 0, 0); gridLayout->addWidget(m_simu_canvas, 0, 1); gridLayout->addWidget(m_diff_canvas, 1, 0); - gridLayout->addWidget(m_progress_canvas, 1, 1); + auto* progress_canvas = new ProgressCanvas; + gridLayout->addWidget(progress_canvas, 1, 1); vlayout->addLayout(gridLayout); vlayout->addWidget(m_status_label); @@ -75,20 +74,28 @@ Fit2DFrame::Fit2DFrame(JobItem* job_item) m_reset_view_action->setToolTip("Reset View"); connect(m_reset_view_action, &QAction::triggered, this, &Fit2DFrame::onResetViewAction); - GUI::Util::Ranges::setCommonRangeZ(m_data_source->mainData2DItems()); - updateDiffData(); - connectItems(); - - m_simu_canvas->itemToCanvas(m_data_source->simuData2DItem()); - m_real_canvas->itemToCanvas(m_data_source->realData2DItem()); - m_diff_canvas->itemToCanvas(m_data_source->diffData2DItem()); - - ASSERT(job_item); - m_progress_canvas->setJobItem(job_item); + updateFrame(); } Fit2DFrame::~Fit2DFrame() = default; +void Fit2DFrame::updateFrame() +{ + if (m_data_source->simuData2DItem()) { + GUI::Util::Ranges::setCommonRangeZ(m_data_source->mainData2DItems()); + updateDiffData(); + connectItems(); + + m_simu_canvas->itemToCanvas(m_data_source->simuData2DItem()); + m_real_canvas->itemToCanvas(m_data_source->realData2DItem()); + m_diff_canvas->itemToCanvas(m_data_source->diffData2DItem()); + + show(); + + } else + hide(); +} + void Fit2DFrame::onResetViewAction() { ASSERT(m_data_source->simuData2DItem() && m_data_source->diffData2DItem() diff --git a/GUI/View/Frame/Fit2DFrame.h b/GUI/View/Frame/Fit2DFrame.h index aa7d366623c6b5029a16c147ed772f1246ac95f8..3977dc293c2fabe79bfea221ecd1ef2a878d8c7e 100644 --- a/GUI/View/Frame/Fit2DFrame.h +++ b/GUI/View/Frame/Fit2DFrame.h @@ -20,18 +20,18 @@ class ColorMapCanvas; class DataSource; -class JobItem; class PlotStatusLabel; -class ProgressCanvas; //! Plots realdata, simulated data and relative difference map during the course of the fit. class Fit2DFrame : public QWidget { Q_OBJECT public: - explicit Fit2DFrame(JobItem* item); + Fit2DFrame(); ~Fit2DFrame(); + void updateFrame(); + private: void onResetViewAction(); void connectItems(); @@ -40,7 +40,6 @@ private: ColorMapCanvas* m_real_canvas; ColorMapCanvas* m_simu_canvas; ColorMapCanvas* m_diff_canvas; - ProgressCanvas* m_progress_canvas; PlotStatusLabel* m_status_label; QAction* m_reset_view_action; diff --git a/GUI/View/Frame/StackedFrames.cpp b/GUI/View/Frame/StackedFrames.cpp index 96ae62c006bf814525877e11e9a5ed621c0a0bd5..623af6efbe24161b20174314d3bb482a7de76dad 100644 --- a/GUI/View/Frame/StackedFrames.cpp +++ b/GUI/View/Frame/StackedFrames.cpp @@ -13,34 +13,19 @@ // ************************************************************************************************ #include "GUI/View/Frame/StackedFrames.h" -#include "Base/Util/Assert.h" -#include "GUI/Model/Data/Data1DItem.h" -#include "GUI/Model/Data/Data2DItem.h" -#include "GUI/Model/Data/DataItem.h" #include "GUI/Model/Files/DatafilesSet.h" -#include "GUI/Model/Job/JobItem.h" +#include "GUI/Model/Job/JobsSet.h" #include "GUI/Model/Project/ProjectDocument.h" #include "GUI/View/Frame/Fit1DFrame.h" #include "GUI/View/Frame/Fit2DFrame.h" #include "GUI/View/Frame/Plot1DFrame.h" #include "GUI/View/Frame/Plot2DFrame.h" -namespace { - -class EmptyFrame : public QWidget { -private: - void showEvent(QShowEvent*) override {} -}; - -} // namespace - - StackedDataFrames::StackedDataFrames() { setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding); setMinimumSize(500, 600); - addWidget(new ::EmptyFrame); addWidget(new Plot1DFrame); addWidget(new Plot2DFrame); setCurrentIndex(0); @@ -52,54 +37,34 @@ StackedDataFrames::StackedDataFrames() void StackedDataFrames::showCurrentFrame() { - if (const DatafileItem* dfi = gDoc->datafiles()->currentItem()) { - if (dfi->rank() == 1) - setCurrentIndex(1); - else if (dfi->rank() == 2) - setCurrentIndex(2); - else - ASSERT_NEVER; - } else - setCurrentIndex(0); + if (const DatafileItem* dfi = gDoc->datafiles()->currentItem()) + setCurrentIndex(dfi->rank() - 1); + else + setCurrentIndex(-1); } -StackedFrames::StackedFrames() +StackedJobFrames::StackedJobFrames() { setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding); setMinimumSize(500, 600); - QWidget* widget = new ::EmptyFrame; - addWidget(widget); - m_item_to_widget[nullptr] = widget; - setCurrentWidget(widget); -} + addWidget(new Plot1DFrame); + addWidget(new Plot2DFrame); + addWidget(new Fit1DFrame); + addWidget(new Fit2DFrame); + setCurrentIndex(0); -void StackedFrames::setStackedItem(QObject* item) -{ - QWidget* widget; - auto it = m_item_to_widget.find(item); - if (it != m_item_to_widget.end()) { - widget = it.value(); - } else { - widget = newFrame(item); - addWidget(widget); - m_item_to_widget[item] = widget; - } - setCurrentWidget(widget); + connect(gDoc->datafiles(), &DatafilesSet::setChanged, this, + &StackedJobFrames::showCurrentFrame); + showCurrentFrame(); } -QWidget* StackedJobFrames::newFrame(QObject* obj) const +void StackedJobFrames::showCurrentFrame() { - if (dynamic_cast<Data1DItem*>(obj)) - return new Plot1DFrame; - if (dynamic_cast<Data2DItem*>(obj)) - return new Plot2DFrame; - if (auto* item = dynamic_cast<JobItem*>(obj)) { - if (item->rank() == 1) - return new Fit1DFrame(item); - if (item->rank() == 2) - return new Fit2DFrame(item); - } - ASSERT_NEVER; + if (const JobItem* ji = gDoc->jobs()->currentItem()) { + const int offset = ji->isValidForFitting() ? 2 : 0; + setCurrentIndex(offset + ji->rank() - 1); + } else + setCurrentIndex(-1); } diff --git a/GUI/View/Frame/StackedFrames.h b/GUI/View/Frame/StackedFrames.h index fe31aac6578c20b043e8801f6e035b77c5bb26ee..8eb3cea4db2ad1a800ce4641cf941c53d6465f99 100644 --- a/GUI/View/Frame/StackedFrames.h +++ b/GUI/View/Frame/StackedFrames.h @@ -15,36 +15,18 @@ #ifndef BORNAGAIN_GUI_VIEW_FRAME_STACKEDFRAMES_H #define BORNAGAIN_GUI_VIEW_FRAME_STACKEDFRAMES_H -#include "Base/Types/OwningVector.h" -#include <QMap> #include <QStackedWidget> class StackedDataFrames : public QStackedWidget { public: StackedDataFrames(); void showCurrentFrame(); - -private: - OwningVector<QWidget> m_widgets; }; -class StackedFrames : public QStackedWidget { +class StackedJobFrames : public QStackedWidget { public: - StackedFrames(); - - //! Shows the widget for given item (and hides previous one). - //! If no widget yet exists, it will be created. - void setStackedItem(QObject* item); - -private: - virtual QWidget* newFrame(QObject*) const = 0; - - QMap<QObject*, QWidget*> m_item_to_widget; -}; - -class StackedJobFrames : public StackedFrames { -private: - QWidget* newFrame(QObject*) const override; + StackedJobFrames(); + void showCurrentFrame(); }; #endif // BORNAGAIN_GUI_VIEW_FRAME_STACKEDFRAMES_H diff --git a/GUI/View/Numeric/NumWidgetUtil.cpp b/GUI/View/Numeric/NumWidgetUtil.cpp index f1dc2ffc09fc46f2847ef31e757004ddbb078591..9b699f1649a7d54a6bd52f7735b7db3ef07c2a88 100644 --- a/GUI/View/Numeric/NumWidgetUtil.cpp +++ b/GUI/View/Numeric/NumWidgetUtil.cpp @@ -33,7 +33,6 @@ QCheckBox* GUI::Util::createCheckBox(const QString& title, function<bool()> gett QVector<function<void()>>* updaters) { auto* checkBox = new QCheckBox(title); - checkBox->setChecked(getter()); QObject::connect(checkBox, &QCheckBox::stateChanged, [=] { setter(checkBox->isChecked()); }); @@ -55,7 +54,6 @@ QSpinBox* GUI::Util::createIntSpinBox(function<int()> getter, function<void(int) spin->setMinimum(limits.hasLowerLimit() ? limits.min() : -std::numeric_limits<int>::max()); spin->setMaximum(limits.hasUpperLimit() ? limits.max() : std::numeric_limits<int>::max()); - spin->setValue(getter()); spin->setToolTip(tooltip); if (!easyScrollable) @@ -83,7 +81,6 @@ QDoubleSpinBox* GUI::Util::createDoubleSpinBox(function<double()> getter, spin->setMaximum(limits.hasUpperLimit() ? limits.max() : std::numeric_limits<int>::max()); spin->setDecimals(3); spin->setSingleStep(0.01); - spin->setValue(getter()); spin->setToolTip(tooltip); if (!easyScrollable) diff --git a/GUI/View/Setup/#AxisPanel.cpp# b/GUI/View/Setup/#AxisPanel.cpp# deleted file mode 100644 index a5941b784190693d5cf1d494519f237a33e743a8..0000000000000000000000000000000000000000 --- a/GUI/View/Setup/#AxisPanel.cpp# +++ /dev/null @@ -1,158 +0,0 @@ -// ************************************************************************************************ -// -// BornAgain: simulate and fit reflection and scattering -// -//! @file GUI/View/Setup/AxisPanel.cpp -//! @brief Implements class AxisPanel. -//! -//! @homepage http://www.bornagainproject.org -//! @license GNU General Public License v3 or higher (see COPYING) -//! @copyright Forschungszentrum Jülich GmbH 2018 -//! @authors Scientific Computing Group at MLZ (see CITATION, AUTHORS) -// -// ************************************************************************************************ - -#include "GUI/View/Setup/AxisPanel.h" -#include "Base/Axis/Frame.h" -#include "Base/Util/Assert.h" -#include "GUI/Model/Axis/AmplitudeAxisItem.h" -#include "GUI/Model/Axis/BasicAxisItem.h" -#include "GUI/Model/Data/Data1DItem.h" -#include "GUI/Model/Data/DataItem.h" -#include "GUI/Model/Device/InstrumentItems.h" -#include "GUI/Model/Files/DatafileItem.h" -#include "GUI/Model/Job/DataSource.h" -#include "GUI/Model/Project/ProjectDocument.h" -#include "GUI/Support/Data/ComboProperty.h" -#include "GUI/View/Layout/LayoutUtil.h" -#include "GUI/View/Numeric/DoubleSpinBox.h" -#include "GUI/View/Numeric/NumWidgetUtil.h" -#include "GUI/View/Widget/GroupBoxes.h" -#include <QAction> -#include <QCheckBox> -#include <QFormLayout> -#include <QLineEdit> - -AxisPanel::AxisPanel(QObject* item) - : m_data_source(std::make_unique<DataSource>(item)) -{ - setWindowTitle("Properties"); - setSizePolicy(QSizePolicy::Fixed, QSizePolicy::MinimumExpanding); - - auto* main_layout = new QFormLayout(this); - main_layout->setContentsMargins(8, 20, 8, 8); - main_layout->setSpacing(5); - - // -- x-axis - auto* xGroup = new StaticGroupBox("X axis", this); - auto* xFormLayout = new QFormLayout(xGroup->body()); - xFormLayout->setContentsMargins(0, 0, 0, 0); - xFormLayout->setSpacing(5); - - xFormLayout->addRow("Min:", - GUI::Util::createDoubleSpinBox( - [this] { return m_data_source->currentData1DItem()->axItemX()->min(); }, - [this](double newValue) { - m_data_source->currentData1DItem()->for (auto* item : m_data_source->allData1DItems()) - item->axItemX()->setMin(newValue); - gDoc->setModified(); - }, - &m_updaters)); - - xFormLayout->addRow("Max:", - GUI::Util::createDoubleSpinBox( - [this] { return m_data_source->currentData1DItem()->axItemX()->max(); }, - [this](double newValue) { - m_data_source->currentData1DItem()->for (auto* item : m_data_source->allData1DItems()) - item->axItemX()->setMax(newValue); - gDoc->setModified(); - }, - &m_updaters)); - - main_layout->addRow(xGroup); - - // -- y-axis - auto* yGroup = new StaticGroupBox("Y axis", this); - auto* yFormLayout = new QFormLayout(yGroup->body()); - yFormLayout->setContentsMargins(0, 0, 0, 0); - yFormLayout->setSpacing(5); - - auto* logRangeSpinBox = GUI::Util::createDoubleSpinBox( - [this] { return m_data_source->currentData1DItem()->axItemY()->logRangeOrders(); }, - [this](double newValue) { - m_data_source->currentData1DItem()->for (auto* item : m_data_source->mainData1DItems()) { - item->axItemY()->setLogRangeOrders(newValue); - updateUIValues(); - } - gDoc->setModified(); - }, - &m_updaters, "Dynamic range to display values", RealLimits::positive()); - - yFormLayout->addRow("Min:", - GUI::Util::createDoubleSpinBox( - [this] { return m_data_source->currentData1DItem()->axItemY()->min(); }, - [this](double newValue) { - m_data_source->currentData1DItem()->for (auto* item : m_data_source->mainData1DItems()) { - item->axItemY()->setMin(newValue); - item->axItemY()->adjustLogRangeOrders(); - updateUIValues(); - } - gDoc->setModified(); - }, - &m_updaters)); - - yFormLayout->addRow("Max:", - GUI::Util::createDoubleSpinBox( - [this] { return m_data_source->currentData1DItem()->axItemY()->max(); }, - [this](double newValue) { - m_data_source->currentData1DItem()->for (auto* item : m_data_source->mainData1DItems()) { - item->axItemY()->setMax(newValue); - item->axItemY()->adjustLogRangeOrders(); - updateUIValues(); - } - gDoc->setModified(); - }, - &m_updaters)); - - yFormLayout->addRow(GUI::Util::createCheckBox( - "log10", [this] { return m_data_source->currentData1DItem()->axItemY()->isLogScale(); }, - [this, logRangeSpinBox](bool b) { - logRangeSpinBox->setEnabled(b); - for (auto* item : m_data_source->allData1DItems()) - item->axItemY()->setLogScale(b); - gDoc->setModified(); - }, - &m_updaters)); - - yFormLayout->addRow("Log range:", logRangeSpinBox); - - main_layout->addRow(yGroup); - - updateUIValues(); - - // react on external changes (e.g. zooming in customplot shall update the axis values) - connect(m_data_source->currentData1DItem(), &DataItem::itemAxesRangeChanged, this, - &AxisPanel::updateUIValues, Qt::UniqueConnection); - - // update coordinates on axes units change - for (auto* item : m_data_source->allData1DItems()) - connect(item, &DataItem::axesUnitsChanged, this, &AxisPanel::updateItemCoords, - Qt::UniqueConnection); -} - -AxisPanel::~AxisPanel() = default; - -void AxisPanel::updateItemCoords(DataItem* item) -{ - if (!item) - return; - - emit item->axesUnitsReplotRequested(); - updateUIValues(); -} - -void AxisPanel::updateUIValues() -{ - for (const auto& updater : m_updaters) - updater(); -} diff --git a/GUI/View/Setup/AxisPanel.cpp b/GUI/View/Setup/AxisPanel.cpp index 4159eb80eea39b80da5bfb1a3bc7f2259896a11f..9641faa1fa48d8dc32dc3817c614abe9398f9fb8 100644 --- a/GUI/View/Setup/AxisPanel.cpp +++ b/GUI/View/Setup/AxisPanel.cpp @@ -20,7 +20,7 @@ #include "GUI/Model/Data/Data1DItem.h" #include "GUI/Model/Data/DataItem.h" #include "GUI/Model/Device/InstrumentItems.h" -#include "GUI/Model/Files/DatafileItem.h" +#include "GUI/Model/Files/DatafilesSet.h" #include "GUI/Model/Job/DataSource.h" #include "GUI/Model/Project/ProjectDocument.h" #include "GUI/Support/Data/ComboProperty.h" @@ -43,40 +43,29 @@ AxisPanel::AxisPanel(DataSource* ds) main_layout->setContentsMargins(8, 20, 8, 8); main_layout->setSpacing(5); - if (m_data_source->allData1DItems().empty()) - return; - - for (auto* item : m_data_source->allData1DItems()) - disconnect(item, nullptr, this, nullptr); - - GUI::Util::Layout::clearLayout(main_layout); - m_updaters.clear(); - // -- x-axis auto* xGroup = new StaticGroupBox("X axis", this); auto* xFormLayout = new QFormLayout(xGroup->body()); xFormLayout->setContentsMargins(0, 0, 0, 0); xFormLayout->setSpacing(5); - xFormLayout->addRow("Min:", - GUI::Util::createDoubleSpinBox( - [this] { return m_data_source->currentData1DItem()->axItemX()->min(); }, - [this](double newValue) { - for (auto* item : m_data_source->allData1DItems()) - item->axItemX()->setMin(newValue); - gDoc->setModified(); - }, - &m_updaters)); - - xFormLayout->addRow("Max:", - GUI::Util::createDoubleSpinBox( - [this] { return m_data_source->currentData1DItem()->axItemX()->max(); }, - [this](double newValue) { - for (auto* item : m_data_source->allData1DItems()) - item->axItemX()->setMax(newValue); - gDoc->setModified(); - }, - &m_updaters)); + xFormLayout->addRow("Min:", GUI::Util::createDoubleSpinBox( + [this] { return dataItem()->axItemX()->min(); }, + [this](double newValue) { + for (auto* item : m_data_source->allData1DItems()) + item->axItemX()->setMin(newValue); + gDoc->setModified(); + }, + &m_updaters)); + + xFormLayout->addRow("Max:", GUI::Util::createDoubleSpinBox( + [this] { return dataItem()->axItemX()->max(); }, + [this](double newValue) { + for (auto* item : m_data_source->allData1DItems()) + item->axItemX()->setMax(newValue); + gDoc->setModified(); + }, + &m_updaters)); main_layout->addRow(xGroup); @@ -87,7 +76,7 @@ AxisPanel::AxisPanel(DataSource* ds) yFormLayout->setSpacing(5); auto* logRangeSpinBox = GUI::Util::createDoubleSpinBox( - [this] { return m_data_source->currentData1DItem()->axItemY()->logRangeOrders(); }, + [this] { return dataItem()->axItemY()->logRangeOrders(); }, [this](double newValue) { for (auto* item : m_data_source->mainData1DItems()) { item->axItemY()->setLogRangeOrders(newValue); @@ -97,34 +86,32 @@ AxisPanel::AxisPanel(DataSource* ds) }, &m_updaters, "Dynamic range to display values", RealLimits::positive()); - yFormLayout->addRow("Min:", - GUI::Util::createDoubleSpinBox( - [this] { return m_data_source->currentData1DItem()->axItemY()->min(); }, - [this](double newValue) { - for (auto* item : m_data_source->mainData1DItems()) { - item->axItemY()->setMin(newValue); - item->axItemY()->adjustLogRangeOrders(); - updateUIValues(); - } - gDoc->setModified(); - }, - &m_updaters)); - - yFormLayout->addRow("Max:", - GUI::Util::createDoubleSpinBox( - [this] { return m_data_source->currentData1DItem()->axItemY()->max(); }, - [this](double newValue) { - for (auto* item : m_data_source->mainData1DItems()) { - item->axItemY()->setMax(newValue); - item->axItemY()->adjustLogRangeOrders(); - updateUIValues(); - } - gDoc->setModified(); - }, - &m_updaters)); + yFormLayout->addRow("Min:", GUI::Util::createDoubleSpinBox( + [this] { return dataItem()->axItemY()->min(); }, + [this](double newValue) { + for (auto* item : m_data_source->mainData1DItems()) { + item->axItemY()->setMin(newValue); + item->axItemY()->adjustLogRangeOrders(); + updateUIValues(); + } + gDoc->setModified(); + }, + &m_updaters)); + + yFormLayout->addRow("Max:", GUI::Util::createDoubleSpinBox( + [this] { return dataItem()->axItemY()->max(); }, + [this](double newValue) { + for (auto* item : m_data_source->mainData1DItems()) { + item->axItemY()->setMax(newValue); + item->axItemY()->adjustLogRangeOrders(); + updateUIValues(); + } + gDoc->setModified(); + }, + &m_updaters)); yFormLayout->addRow(GUI::Util::createCheckBox( - "log10", [this] { return m_data_source->currentData1DItem()->axItemY()->isLogScale(); }, + "log10", [this] { return dataItem()->axItemY()->isLogScale(); }, [this, logRangeSpinBox](bool b) { logRangeSpinBox->setEnabled(b); for (auto* item : m_data_source->allData1DItems()) @@ -137,19 +124,31 @@ AxisPanel::AxisPanel(DataSource* ds) main_layout->addRow(yGroup); - updateUIValues(); + connect(gDoc->datafiles(), &DatafilesSet::setChanged, this, &AxisPanel::updatePanel); + updatePanel(); +} - // react on external changes (e.g. zooming in customplot shall update the axis values) - connect(m_data_source->currentData1DItem(), &DataItem::itemAxesRangeChanged, this, - &AxisPanel::updateUIValues, Qt::UniqueConnection); +AxisPanel::~AxisPanel() = default; - // update coordinates on axes units change - for (auto* item : m_data_source->allData1DItems()) - connect(item, &DataItem::axesUnitsChanged, this, &AxisPanel::updateItemCoords, - Qt::UniqueConnection); +Data1DItem* AxisPanel::dataItem() +{ + return m_data_source->currentData1DItem(); } -AxisPanel::~AxisPanel() = default; +void AxisPanel::updatePanel() +{ + if (dataItem()) { + // react on external changes (e.g. zooming in customplot shall update the axis values) + connect(dataItem(), &DataItem::itemAxesRangeChanged, this, &AxisPanel::updateUIValues, + Qt::UniqueConnection); + // update coordinates on axes units change + for (auto* item : m_data_source->allData1DItems()) + connect(item, &DataItem::axesUnitsChanged, this, &AxisPanel::updateItemCoords, + Qt::UniqueConnection); + show(); + } else + hide(); +} void AxisPanel::updateItemCoords(DataItem* item) { @@ -162,6 +161,7 @@ void AxisPanel::updateItemCoords(DataItem* item) void AxisPanel::updateUIValues() { - for (const auto& updater : m_updaters) - updater(); + if (m_data_source->currentData1DItem()) + for (const auto& updater : m_updaters) + updater(); } diff --git a/GUI/View/Setup/AxisPanel.h b/GUI/View/Setup/AxisPanel.h index 6099e3158589b6f0676fce40bb2a077aac34b07f..1e1ada7665e7ee361787f6bb86b517f2edea0b72 100644 --- a/GUI/View/Setup/AxisPanel.h +++ b/GUI/View/Setup/AxisPanel.h @@ -17,6 +17,7 @@ #include <QWidget> +class Data1DItem; class DataItem; class DataSource; @@ -27,6 +28,9 @@ public: AxisPanel(DataSource*); ~AxisPanel(); + Data1DItem* dataItem(); + void updatePanel(); + private: void updateItemCoords(DataItem* item); void updateUIValues(); diff --git a/GUI/View/Views/JobView.cpp b/GUI/View/Views/JobView.cpp index d6e9ef9bd6f555c5b2fb26c05b5b33221e042565..6a4e6ba1ea2f3dc727dbe9f6a8a3a87765a2a4e5 100644 --- a/GUI/View/Views/JobView.cpp +++ b/GUI/View/Views/JobView.cpp @@ -112,7 +112,7 @@ void JobView::fillViewMenu(QMenu* menu) void JobView::onJobSelectionChanged() { - setJob(selectedJobItem()); + setJob(); m_job_real_time_widget->setJobItem(selectedJobItem()); m_fit_activity_panel->setJobItem(selectedJobItem()); @@ -143,21 +143,14 @@ void JobView::onJobSelected(JobItem* job_item) setActivity(newActivity); - setJob(job_item); + setJob(); emit jobSelected(GUI::ID::Job); } -void JobView::setJob(JobItem* job_item) +void JobView::setJob() { - if (job_item) { - if (job_item->isValidForFitting()) - m_data_frames->setStackedItem(job_item); - else - m_data_frames->setStackedItem(job_item->simulatedDataItem()); - } else { - m_data_frames->setStackedItem(nullptr); - } + m_data_frames->showCurrentFrame(); } diff --git a/GUI/View/Views/JobView.h b/GUI/View/Views/JobView.h index 3f478165079928f96de938d3196f8dfbe974f562..b9269643bd92a7344f771bd1829423c682e5a7fa 100644 --- a/GUI/View/Views/JobView.h +++ b/GUI/View/Views/JobView.h @@ -52,7 +52,7 @@ private slots: private: JobItem* selectedJobItem(); void setActivity(JobViewActivity activity); - void setJob(JobItem* job_item); + void setJob(); void resetLayout();