Skip to content
Snippets Groups Projects
Commit 1e314a70 authored by t.knopff's avatar t.knopff
Browse files

Merge branch 'overhaul_ui' into 'develop'

Overhaul UI: simplify displaying the results of jobs

See merge request !410
parents 60b2bbff 54b0301f
No related branches found
No related tags found
1 merge request!410Overhaul UI: simplify displaying the results of jobs
Pipeline #47459 passed
......@@ -40,8 +40,6 @@ void ItemComboToolBar::setPresentation(const QString& name)
void ItemComboToolBar::setPresentationList(const QStringList& presentationList,
const QStringList& activeList)
{
ASSERT(presentationList.size());
QString previous = currentPresentation();
setComboConnected(false);
......
......@@ -27,6 +27,8 @@ ItemComboWidget::ItemComboWidget(QWidget* parent)
{
setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
m_stackedWidget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
m_blankWidget = new QWidget(m_stackedWidget);
m_stackedWidget->addWidget(m_blankWidget);
QVBoxLayout* layout = new QVBoxLayout;
layout->setMargin(0);
......@@ -37,6 +39,8 @@ ItemComboWidget::ItemComboWidget(QWidget* parent)
setLayout(layout);
connect(m_toolBar, &ItemComboToolBar::comboChanged, this, &ItemComboWidget::onComboChanged);
setToolBarVisible(false);
}
void ItemComboWidget::registerWidget(const QString& presentationType, factory_function_t f)
......@@ -48,9 +52,16 @@ void ItemComboWidget::registerWidget(const QString& presentationType, factory_fu
void ItemComboWidget::setPresentation(const QString& presentationType)
{
if (presentationType.isEmpty()) {
m_stackedWidget->setCurrentWidget(m_blankWidget);
setToolBarVisible(false);
return;
}
if (!activePresentationList(currentItem()).contains(presentationType))
return;
setToolBarVisible(true);
m_toolBar->setPresentation(presentationType);
ASSERT(currentItem());
......@@ -77,6 +88,14 @@ void ItemComboWidget::setToolBarVisible(bool value)
m_toolBar->setVisible(value);
}
void ItemComboWidget::setItem(SessionItem* item)
{
if (!item)
m_stackedWidget->setCurrentWidget(m_blankWidget);
SessionItemWidget::setItem(item);
setToolBarVisible(item && !itemPresentation().isEmpty());
}
//! Returns list of active presentations for given item. Active presentation is the one
//! which is present in QComboBox selector and can be selected. For example, if JobItem
//! is fittable, the list will contain "FitComparisonWidgetName".
......
......@@ -32,6 +32,11 @@ class QStackedWidget;
//! For example, in JobOutputDataWidget the results of the job can be presented with either
//! IntensityDataWidget or FitDataWidget, depending from the JobView's activity type.
//! For the presentation the special value of an empty string can be used which results in an
//! empty widget being shown (with the toolbar hidden). In this case the current item can also
//! be \c nullptr and this presentation needs not to be listed in the (active)PresentationList
//! functions.
class ItemComboWidget : public SessionItemWidget {
Q_OBJECT
......@@ -45,14 +50,13 @@ public:
virtual void setPresentation(const QString& presentationType);
void setToolBarVisible(bool value);
void setItem(SessionItem* item) override;
protected:
virtual QStringList activePresentationList(SessionItem* item);
virtual QStringList presentationList(SessionItem* item);
virtual QString itemPresentation() const;
QString selectedPresentation() const;
// SessionItem* currentItem();
// const SessionItem* currentItem() const;
void subscribeToItem();
private slots:
......@@ -63,9 +67,9 @@ private:
ItemComboToolBar* m_toolBar;
QStackedWidget* m_stackedWidget;
// SessionItem* m_currentItem;
IFactory<QString, SessionItemWidget> m_widgetFactory;
QMap<QString, SessionItemWidget*> m_presentationTypeToWidget;
QWidget* m_blankWidget;
};
#endif // BORNAGAIN_GUI_VIEWS_COMMONWIDGETS_ITEMCOMBOWIDGET_H
// ************************************************************************************************
//
// BornAgain: simulate and fit reflection and scattering
//
//! @file GUI/Views/JobWidgets/JobOutputDataWidget.cpp
//! @brief Implements class JobOutputDataWidget
//!
//! @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/JobWidgets/JobOutputDataWidget.h"
#include "GUI/Models/JobItem.h"
#include "GUI/Models/JobModel.h"
#include "GUI/Views/JobWidgets/JobResultsPresenter.h"
#include <QVBoxLayout>
namespace {
const bool reuse_widget = true;
}
JobOutputDataWidget::JobOutputDataWidget(JobModel* jobModel, QWidget* parent)
: QWidget(parent), m_stackedWidget(new ItemStackPresenter<JobResultsPresenter>(reuse_widget))
{
setWindowTitle(QLatin1String("Job OutputData"));
setObjectName("JobOutputDataWidget");
setMinimumSize(400, 400);
setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
QVBoxLayout* mainLayout = new QVBoxLayout;
mainLayout->setMargin(0);
mainLayout->setSpacing(0);
mainLayout->addWidget(m_stackedWidget);
m_stackedWidget->setMinimumSize(600, 600);
m_stackedWidget->setModel(jobModel);
setLayout(mainLayout);
}
void JobOutputDataWidget::setItem(JobItem* jobItem)
{
if (!isValidJobItem(jobItem)) {
m_stackedWidget->hideWidgets();
return;
}
m_stackedWidget->setItem(jobItem);
}
void JobOutputDataWidget::onActivityChanged(JobViewActivity activity)
{
if (auto widget = m_stackedWidget->currentWidget())
widget->setPresentation(activity);
}
bool JobOutputDataWidget::isValidJobItem(JobItem* item)
{
if (!item)
return false;
// do not show running job items, the rest (canceled, fitted, etc) are shown
return !item->isRunning();
}
// ************************************************************************************************
//
// BornAgain: simulate and fit reflection and scattering
//
//! @file GUI/Views/JobWidgets/JobOutputDataWidget.h
//! @brief Defines class JobOutputDataWidget
//!
//! @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 BORNAGAIN_GUI_VIEWS_JOBWIDGETS_JOBOUTPUTDATAWIDGET_H
#define BORNAGAIN_GUI_VIEWS_JOBWIDGETS_JOBOUTPUTDATAWIDGET_H
#include "GUI/Views/CommonWidgets/ItemStackPresenter.h"
class JobResultsPresenter;
class JobModel;
class JobItem;
enum class JobViewActivity;
//! The JobOutputDataWidget class is a central widget of JobView, shows results of the simulation.
class JobOutputDataWidget : public QWidget {
Q_OBJECT
public:
JobOutputDataWidget(JobModel* jobModel, QWidget* parent = nullptr);
public slots:
void setItem(JobItem* jobItem);
void onActivityChanged(JobViewActivity activity);
protected:
virtual bool isValidJobItem(JobItem* item);
private:
ItemStackPresenter<JobResultsPresenter>* m_stackedWidget;
};
#endif // BORNAGAIN_GUI_VIEWS_JOBWIDGETS_JOBOUTPUTDATAWIDGET_H
......@@ -24,11 +24,17 @@
JobResultsPresenter::JobResultsPresenter(QWidget* parent) : ItemComboWidget(parent)
{
setWindowTitle("Job OutputData");
setObjectName("JobResultsPresenter");
registerWidget("Color Map", create_new<IntensityDataWidget>);
registerWidget("Projections", create_new<IntensityDataProjectionsWidget>);
registerWidget("Fit 1D Data", create_new<FitComparisonWidget1D>);
registerWidget("Fit 2D Data", create_new<FitComparisonWidget>);
registerWidget("Reflectometry", create_new<SpecularDataWidget>);
setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
setMinimumSize(600, 600);
}
QString JobResultsPresenter::itemPresentation() const
......@@ -40,34 +46,40 @@ QString JobResultsPresenter::itemPresentation() const
return value.isEmpty() ? selectedPresentation() : value;
}
void JobResultsPresenter::setPresentation(const QString& presentationType)
void JobResultsPresenter::setItem(SessionItem* item)
{
if (!currentItem())
return;
if (currentItem())
currentItem()->mapper()->unsubscribe(this);
if (item)
item->mapper()->setOnPropertyChange(
std::bind(&JobResultsPresenter::notifyJobPropertyChanged, this, std::placeholders::_1));
ItemComboWidget::setItem(item);
}
void JobResultsPresenter::setPresentation(const QString& presentationType)
{
ItemComboWidget::setPresentation(presentationType);
dynamic_cast<JobItem*>(currentItem())->setPresentationType(presentationType);
JobItem* item = dynamic_cast<JobItem*>(currentItem());
if (item && !presentationType.isEmpty())
item->setPresentationType(presentationType);
}
void JobResultsPresenter::setPresentation(JobViewActivity activity)
{
if (!currentItem())
return;
JobItem* jobItem = dynamic_cast<JobItem*>(currentItem());
if (!jobItem)
return;
m_activity = activity;
QString presentation;
switch (activity) {
case JobViewActivity::Fitting:
presentation = fitPresentationOfInstrument(jobItem->instrumentItem());
break;
case JobViewActivity::RealTime:
case JobViewActivity::JobView:
presentation = defaultPresentationOfInstrument(jobItem->instrumentItem());
break;
JobItem* jobItem = dynamic_cast<JobItem*>(currentItem());
if (jobItem && !jobItem->isRunning()) {
switch (activity) {
case JobViewActivity::Fitting:
presentation = fitPresentationOfInstrument(jobItem->instrumentItem());
break;
case JobViewActivity::RealTime:
case JobViewActivity::JobView:
presentation = defaultPresentationOfInstrument(jobItem->instrumentItem());
break;
}
}
setPresentation(presentation);
......@@ -79,7 +91,7 @@ void JobResultsPresenter::setPresentation(JobViewActivity activity)
QStringList JobResultsPresenter::activePresentationList(SessionItem* item)
{
JobItem* jobItem = dynamic_cast<JobItem*>(item);
if (!jobItem)
if (!jobItem || jobItem->isRunning())
return {};
ASSERT(jobItem->instrumentItem() != nullptr);
......@@ -95,7 +107,7 @@ QStringList JobResultsPresenter::activePresentationList(SessionItem* item)
QStringList JobResultsPresenter::presentationList(SessionItem* item)
{
JobItem* jobItem = dynamic_cast<JobItem*>(item);
if (!jobItem)
if (!jobItem || jobItem->isRunning())
return {};
ASSERT(jobItem->instrumentItem() != nullptr);
......@@ -132,3 +144,9 @@ QString JobResultsPresenter::fitPresentationOfInstrument(InstrumentItem* instrum
return "Fit 2D Data";
}
void JobResultsPresenter::notifyJobPropertyChanged(const QString& property)
{
if (JobItem::isStatusPropertyName(property))
setPresentation(m_activity);
}
......@@ -18,6 +18,7 @@
#include "GUI/Views/CommonWidgets/ItemComboWidget.h"
class InstrumentItem;
class JobItem;
enum class JobViewActivity;
//! Presents results of job (JobItem) using stack of different widgets and combo box in the
......@@ -29,7 +30,10 @@ class JobResultsPresenter : public ItemComboWidget {
public:
explicit JobResultsPresenter(QWidget* parent = nullptr);
void setItem(SessionItem* item) override;
void setPresentation(const QString& presentationType) override;
public slots:
void setPresentation(JobViewActivity activity);
protected:
......@@ -41,6 +45,10 @@ private:
QString defaultPresentationOfInstrument(InstrumentItem* instrumentItem);
QStringList defaultActivePresentationsOfInstrument(InstrumentItem* instrumentItem);
QString fitPresentationOfInstrument(InstrumentItem* instrumentItem);
void notifyJobPropertyChanged(const QString& property);
private:
JobViewActivity m_activity;
};
#endif // BORNAGAIN_GUI_VIEWS_JOBWIDGETS_JOBRESULTSPRESENTER_H
......@@ -19,8 +19,8 @@
#include "GUI/Views/FitWidgets/FitActivityPanel.h"
#include "GUI/Views/FitWidgets/JobMessagePanel.h"
#include "GUI/Views/FitWidgets/JobRealTimeWidget.h"
#include "GUI/Views/JobWidgets/JobOutputDataWidget.h"
#include "GUI/Views/JobWidgets/JobProgressAssistant.h"
#include "GUI/Views/JobWidgets/JobResultsPresenter.h"
#include "GUI/Views/JobWidgets/JobSelectorWidget.h"
#include "GUI/Views/JobWidgets/JobViewActivities.h"
#include "GUI/mainwindow/mainwindow.h"
......@@ -91,14 +91,14 @@ void JobView::onSelectionChanged(const QVector<JobItem*>& jobs)
JobItem* jobItem = nullptr;
if (jobs.size() == 1)
jobItem = jobs.front();
m_jobOutputDataWidget->setItem(jobItem);
m_jobResultsPresenter->setItem(jobItem);
m_jobRealTimeWidget->setItem(jobItem);
m_fitActivityPanel->setItem(jobItem);
}
void JobView::createSubWindows()
{
m_jobOutputDataWidget = new JobOutputDataWidget(m_document->jobModel(), this);
m_jobResultsPresenter = new JobResultsPresenter(this);
m_jobSelector = new JobSelectorWidget(m_document->jobModel(), this);
m_jobRealTimeWidget = new JobRealTimeWidget(m_document->jobModel(), this);
m_fitActivityPanel = new FitActivityPanel(m_document->jobModel(), this);
......@@ -115,7 +115,7 @@ void JobView::createSubWindows()
m_fitActivityPanel->setRealTimeWidget(m_jobRealTimeWidget);
m_fitActivityPanel->setJobMessagePanel(m_jobMessagePanel);
setCentralWidget(m_jobOutputDataWidget);
setCentralWidget(m_jobResultsPresenter);
resetLayout();
}
......@@ -141,9 +141,9 @@ void JobView::connectSignals()
void JobView::connectActivityRelated()
{
// Activity was changed: this -> JobOutputDataWidget
connect(this, &JobView::activityChanged, m_jobOutputDataWidget,
&JobOutputDataWidget::onActivityChanged);
// Activity was changed: this -> JobResultsPresenter
connect(this, &JobView::activityChanged, m_jobResultsPresenter,
qOverload<JobViewActivity>(&JobResultsPresenter::setPresentation));
}
//! Connects signals related to JobItem
......
......@@ -21,11 +21,11 @@
class MainWindow;
class JobView;
class JobSelectorWidget;
class JobOutputDataWidget;
class JobRealTimeWidget;
class FitActivityPanel;
class JobMessagePanel;
class JobProgressAssistant;
class JobResultsPresenter;
class JobItem;
class DocksController;
class ProjectDocument;
......@@ -66,7 +66,7 @@ private:
JobItem* m_currentItem;
JobSelectorWidget* m_jobSelector = nullptr;
JobOutputDataWidget* m_jobOutputDataWidget = nullptr;
JobResultsPresenter* m_jobResultsPresenter = nullptr;
JobRealTimeWidget* m_jobRealTimeWidget = nullptr;
FitActivityPanel* m_fitActivityPanel = nullptr;
JobMessagePanel* m_jobMessagePanel = nullptr;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment