diff --git a/GUI/coregui/Views/FitWidgets/FitComparisonWidget1D_New.cpp b/GUI/coregui/Views/FitWidgets/FitComparisonWidget1D_New.cpp new file mode 100644 index 0000000000000000000000000000000000000000..9b08171c689c31343759543f1f00f85788bbaef9 --- /dev/null +++ b/GUI/coregui/Views/FitWidgets/FitComparisonWidget1D_New.cpp @@ -0,0 +1,136 @@ +// ************************************************************************** // +// +// BornAgain: simulate and fit scattering at grazing incidence +// +//! @file GUI/coregui/Views/FitWidgets/FitComparisonWidget1D.cpp +//! @brief Implements class FitComparisonWidget1D +//! +//! @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 "FitComparisonWidget1D_New.h" +#include "FitComparisonController.h" +#include "FitFlowWidget.h" +#include "FitSuiteItem.h" +#include "IntensityDataPropertyWidget.h" +#include "JobItem.h" +#include "PlotStatusLabel.h" +#include "RealDataItem.h" +#include "SessionModel.h" +#include "SpecularDataItem.h" +#include "SpecularPlot.h" +#include "SpecularPlotCanvas.h" +#include <QAction> +#include <QGridLayout> +#include <QVBoxLayout> + +FitComparisonWidget1D_New::FitComparisonWidget1D_New(QWidget *parent) + : SessionItemWidget(parent) + , m_data_plot(new SpecularPlotCanvas) + , m_diff_plot(new SpecularPlotCanvas) + , m_fitFlowWidget(new FitFlowWidget) + , m_statusLabel(new PlotStatusLabel(nullptr, this)) + , m_propertyWidget(new IntensityDataPropertyWidget) + , m_resetViewAction(new QAction(this)) + , m_comparisonController(new FitComparisonController1D(this)) +{ + auto vlayout = new QVBoxLayout; + vlayout->setMargin(0); + vlayout->setSpacing(0); + + auto gridLayout = new QGridLayout; + gridLayout->setMargin(0); + gridLayout->setSpacing(0); + + gridLayout->addWidget(m_data_plot, 0, 0, 1, -1); + gridLayout->addWidget(m_diff_plot, 1, 0); + gridLayout->addWidget(m_fitFlowWidget, 1, 1); + + vlayout->addLayout(gridLayout); + vlayout->addWidget(m_statusLabel); + + auto hlayout = new QHBoxLayout; + hlayout->setMargin(0); + hlayout->setSpacing(0); + hlayout->addLayout(vlayout); + hlayout->addWidget(m_propertyWidget); + setLayout(hlayout); + + m_resetViewAction->setText("Reset View"); + m_resetViewAction->setIcon(QIcon(":/images/toolbar16light_refresh.svg")); + m_resetViewAction->setToolTip("Reset View"); + connect(m_resetViewAction, &QAction::triggered, this, &FitComparisonWidget1D_New::onResetViewAction); + + m_propertyWidget->setVisible(false); +} + +FitComparisonWidget1D_New::~FitComparisonWidget1D_New() = default; + +QList<QAction*> FitComparisonWidget1D_New::actionList() +{ + return QList<QAction*>() << m_resetViewAction << m_propertyWidget->actionList(); +} + +void FitComparisonWidget1D_New::subscribeToItem() +{ + if (!jobItem()->isValidForFitting()) + return; + + jobItem()->mapper()->setOnPropertyChange( + [this](const QString& name) { + if (name == JobItem::P_STATUS) { + if (jobItem()->isCompleted()) + onResetViewAction(); + } + }, + this); + + m_comparisonController->setItem(jobItem()); + + m_data_plot->setItem(simulatedDataItem()); + m_diff_plot->setItem(m_comparisonController->diffItem()); + m_fitFlowWidget->setItem(jobItem()->fitSuiteItem()); + + m_statusLabel->reset(); + m_statusLabel->addPlot(m_data_plot->specularPlot()); + m_statusLabel->addPlot(m_diff_plot->specularPlot()); + + m_propertyWidget->setItem(simulatedDataItem()); +} + +void FitComparisonWidget1D_New::unsubscribeFromItem() +{ + if (!currentItem()) + return; + + m_comparisonController->clear(); +} + +void FitComparisonWidget1D_New::onResetViewAction() +{ + realDataItem()->resetView(); + simulatedDataItem()->resetView(); + m_comparisonController->resetDiffItem(); +} + +JobItem* FitComparisonWidget1D_New::jobItem() +{ + JobItem* jobItem = dynamic_cast<JobItem*>(currentItem()); + return jobItem; +} + +SpecularDataItem* FitComparisonWidget1D_New::realDataItem() +{ + assert(dynamic_cast<SpecularDataItem*>(jobItem()->realDataItem()->dataItem())); + return dynamic_cast<SpecularDataItem*>(jobItem()->realDataItem()->dataItem()); +} + +SpecularDataItem* FitComparisonWidget1D_New::simulatedDataItem() +{ + assert(dynamic_cast<SpecularDataItem*>(jobItem()->dataItem())); + return dynamic_cast<SpecularDataItem*>(jobItem()->dataItem()); +} diff --git a/GUI/coregui/Views/FitWidgets/FitComparisonWidget1D_New.h b/GUI/coregui/Views/FitWidgets/FitComparisonWidget1D_New.h new file mode 100644 index 0000000000000000000000000000000000000000..218d684e957b4e1db7e2c9092b081b4e1908e13d --- /dev/null +++ b/GUI/coregui/Views/FitWidgets/FitComparisonWidget1D_New.h @@ -0,0 +1,63 @@ +// ************************************************************************** // +// +// BornAgain: simulate and fit scattering at grazing incidence +// +//! @file GUI/coregui/Views/FitWidgets/FitComparisonWidget1D_New.h +//! @brief Defines class FitComparisonWidget1D +//! +//! @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) +// +// ************************************************************************** // + +#ifndef FITCOMPARISONWIDGET1D_NEW_H +#define FITCOMPARISONWIDGET1D_NEW_H + +#include "SessionItemWidget.h" + +class FitComparisonController1D; +class FitFlowWidget; +class IntensityDataPropertyWidget; +class JobItem; +class PlotStatusLabel; +class QAction; +class SpecularDataItem; +class SpecularPlotCanvas; + +//! The FitComparisonWidget class plots realdata, simulated data and relative difference map +//! during the course of the fit. + +class BA_CORE_API_ FitComparisonWidget1D_New : public SessionItemWidget +{ + Q_OBJECT +public: + explicit FitComparisonWidget1D_New(QWidget* parent = nullptr); + ~FitComparisonWidget1D_New() override; + + virtual QList<QAction*> actionList() override; + +private slots: + void onResetViewAction(); + +protected: + void subscribeToItem() override; + void unsubscribeFromItem() override; + +private: + JobItem* jobItem(); + SpecularDataItem* realDataItem(); + SpecularDataItem* simulatedDataItem(); + + SpecularPlotCanvas* m_data_plot; + SpecularPlotCanvas* m_diff_plot; + FitFlowWidget* m_fitFlowWidget; + PlotStatusLabel* m_statusLabel; + IntensityDataPropertyWidget* m_propertyWidget; + + QAction* m_resetViewAction; + FitComparisonController1D* m_comparisonController; +}; + +#endif // FITCOMPARISONWIDGET1D_NEW_H