diff --git a/GUI/Views/CommonWidgets/ItemComboToolBar.cpp b/GUI/Views/CommonWidgets/ItemComboToolBar.cpp index 2966aaba7e62279d26e5a3038abf539da6a442ba..3b40ad0ebe255b875f440303fcfdf60b3f0190aa 100644 --- a/GUI/Views/CommonWidgets/ItemComboToolBar.cpp +++ b/GUI/Views/CommonWidgets/ItemComboToolBar.cpp @@ -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); diff --git a/GUI/Views/CommonWidgets/ItemComboWidget.cpp b/GUI/Views/CommonWidgets/ItemComboWidget.cpp index b4cfcc7a554374e75b1c09861403a2e840efba22..521f1215b9c931ebc3d84c06685a197277a5dedc 100644 --- a/GUI/Views/CommonWidgets/ItemComboWidget.cpp +++ b/GUI/Views/CommonWidgets/ItemComboWidget.cpp @@ -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". diff --git a/GUI/Views/CommonWidgets/ItemComboWidget.h b/GUI/Views/CommonWidgets/ItemComboWidget.h index b3cfdcb2684023c9b872ff1a8629dfde16a9b917..91f46f5ee557d90c2459970d4455d87ce268b69e 100644 --- a/GUI/Views/CommonWidgets/ItemComboWidget.h +++ b/GUI/Views/CommonWidgets/ItemComboWidget.h @@ -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 diff --git a/GUI/Views/JobWidgets/JobOutputDataWidget.cpp b/GUI/Views/JobWidgets/JobOutputDataWidget.cpp deleted file mode 100644 index 828812cb9ff07642fb70808d95ef17569269061f..0000000000000000000000000000000000000000 --- a/GUI/Views/JobWidgets/JobOutputDataWidget.cpp +++ /dev/null @@ -1,69 +0,0 @@ -// ************************************************************************************************ -// -// 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(); -} diff --git a/GUI/Views/JobWidgets/JobOutputDataWidget.h b/GUI/Views/JobWidgets/JobOutputDataWidget.h deleted file mode 100644 index 36ca1e577dba5573992f40c7923dd1ec56e7d82a..0000000000000000000000000000000000000000 --- a/GUI/Views/JobWidgets/JobOutputDataWidget.h +++ /dev/null @@ -1,43 +0,0 @@ -// ************************************************************************************************ -// -// 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 diff --git a/GUI/Views/JobWidgets/JobResultsPresenter.cpp b/GUI/Views/JobWidgets/JobResultsPresenter.cpp index c6fcc76071535f8018d583939a1d6c611bb4fd6e..c98eb83672ab17a139d4e360c64e6cd55d61eff0 100644 --- a/GUI/Views/JobWidgets/JobResultsPresenter.cpp +++ b/GUI/Views/JobWidgets/JobResultsPresenter.cpp @@ -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); +} diff --git a/GUI/Views/JobWidgets/JobResultsPresenter.h b/GUI/Views/JobWidgets/JobResultsPresenter.h index a2454ecefc80c1dddb1054f35ed0034f2d62d635..7ebb7e26c0707de3b99c468f9b53bdf89ca351bc 100644 --- a/GUI/Views/JobWidgets/JobResultsPresenter.h +++ b/GUI/Views/JobWidgets/JobResultsPresenter.h @@ -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 diff --git a/GUI/Views/JobWidgets/JobView.cpp b/GUI/Views/JobWidgets/JobView.cpp index a3cb2dab0cbd80908413ff417fc6750db79f652f..8b807919054a38dcbb353711138ca5cae7bdba32 100644 --- a/GUI/Views/JobWidgets/JobView.cpp +++ b/GUI/Views/JobWidgets/JobView.cpp @@ -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 diff --git a/GUI/Views/JobWidgets/JobView.h b/GUI/Views/JobWidgets/JobView.h index d86456dac52e5a66abcae6d5c96a6bd0291818ec..ee1419a255f0d444c3f4090bd6b722fa53dd3cca 100644 --- a/GUI/Views/JobWidgets/JobView.h +++ b/GUI/Views/JobWidgets/JobView.h @@ -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;