Newer
Older
// ************************************************************************************************
// BornAgain: simulate and fit reflection and scattering
//! @file GUI/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 "GUI/Views/FitWidgets/FitComparisonWidget1D.h"
#include "GUI/Models/Data1DViewItem.h"
#include "GUI/Models/FitSuiteItem.h"
#include "GUI/Models/JobItem.h"
#include "GUI/Models/RealDataItem.h"
#include "GUI/Models/SessionModel.h"
#include "GUI/Views/FitWidgets/FitComparisonViewController.h"
#include "GUI/Views/FitWidgets/FitFlowWidget.h"
#include "GUI/Views/IntensityDataWidgets/IntensityDataPropertyWidget.h"
#include "GUI/Views/IntensityDataWidgets/Plot1D.h"
#include "GUI/Views/IntensityDataWidgets/PlotStatusLabel.h"
#include "GUI/Views/SpecularDataWidgets/Plot1DCanvas.h"
#include <QAction>
#include <QGridLayout>
#include <QVBoxLayout>
FitComparisonWidget1D::FitComparisonWidget1D(QWidget* parent)
: SessionItemWidget(parent)
, m_data_plot(new Plot1DCanvas)
, m_diff_plot(new Plot1DCanvas)
, m_fitFlowWidget(new FitFlowWidget)
, m_statusLabel(new PlotStatusLabel(nullptr, this))
, m_propertyWidget(new IntensityDataPropertyWidget)
, m_resetViewAction(new QAction(this))
, m_comparisonController(new FitComparison1DViewController(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, 1, 2);
gridLayout->addWidget(m_fitFlowWidget, 1, 2, 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("Center view");
m_resetViewAction->setIcon(QIcon(":/images/camera-metering-center.svg"));
m_resetViewAction->setToolTip("Reset View");
connect(m_resetViewAction, &QAction::triggered, this,
&FitComparisonWidget1D::onResetViewAction);
m_propertyWidget->setVisible(false);
}
FitComparisonWidget1D::~FitComparisonWidget1D() = default;
QList<QAction*> FitComparisonWidget1D::actionList()
{
return QList<QAction*>() << m_resetViewAction << m_propertyWidget->actionList();
}
void FitComparisonWidget1D::subscribeToItem()
{
if (!jobItem()->isValidForFitting())
return;
jobItem()->mapper()->setOnPropertyChange(
[this](const QString& name) {
if (jobItem()->isCompleted())
onResetViewAction();
}
},
this);
m_comparisonController->setItem(jobItem());
m_data_plot->setItem(viewItem());
m_diff_plot->setItem(m_comparisonController->diffItemView());
m_fitFlowWidget->setItem(jobItem()->fitSuiteItem());
m_statusLabel->reset();
m_statusLabel->addPlot(m_data_plot->plot1D());
m_statusLabel->addPlot(m_diff_plot->plot1D());
m_propertyWidget->setItem(viewItem());
void FitComparisonWidget1D::unsubscribeFromItem()
{
m_diff_plot->setItem(nullptr);
m_comparisonController->clear();
void FitComparisonWidget1D::onResetViewAction()
{
viewItem()->resetView();
m_comparisonController->resetDiffView();
JobItem* FitComparisonWidget1D::jobItem()
{
JobItem* jobItem = dynamic_cast<JobItem*>(currentItem());
return jobItem;
}
Data1DViewItem* FitComparisonWidget1D::viewItem()
{
auto view_item = dynamic_cast<Data1DViewItem*>(jobItem()->dataItemView());