From d4a38bdf66638beb172c1f38cc5fbf9f75a2fabb Mon Sep 17 00:00:00 2001 From: Dmitry Yurov <d.yurov@fz-juelich.de> Date: Fri, 9 Feb 2018 19:06:02 +0100 Subject: [PATCH] Enable specular view in GUI Redmine: #1936 --- GUI/coregui/Models/JobItem.cpp | 19 +++++++++++++++++++ GUI/coregui/Models/JobItem.h | 1 + GUI/coregui/Models/JobModel.cpp | 2 ++ GUI/coregui/Models/JobModelFunctions.cpp | 1 - GUI/coregui/Models/item_constants.h | 1 + .../Views/JobWidgets/JobOutputDataWidget.cpp | 6 +++--- .../Views/JobWidgets/JobResultsPresenter.cpp | 15 +++++++++++++-- .../Views/JobWidgets/JobResultsPresenter.h | 1 + .../SpecularDataWidget.cpp | 19 +++++++++---------- GUI/coregui/Views/TestView.cpp | 7 +++++-- 10 files changed, 54 insertions(+), 18 deletions(-) diff --git a/GUI/coregui/Models/JobItem.cpp b/GUI/coregui/Models/JobItem.cpp index 0ceee6f1a2c..26b081705e4 100644 --- a/GUI/coregui/Models/JobItem.cpp +++ b/GUI/coregui/Models/JobItem.cpp @@ -263,6 +263,25 @@ QString JobItem::presentationType() return getItemValue(P_PRESENTATION_TYPE).toString(); } +QString JobItem::defaultPresentationType() +{ + auto instrument = instrumentItem(); + if (!instrument) + GUIHelpers::Error("Error in JobItem::defaultPresentationType: default presentation type " + "cannot be determined"); + + auto instrument_type = instrument->modelType(); + if (instrument_type == Constants::SpecularInstrumentType) + return Constants::SpecularDataPresentation; + else if (instrument_type == Constants::GISASInstrumentType + || instrument_type == Constants::OffSpecInstrumentType) + return Constants::IntensityDataPresentation; + else + GUIHelpers::Error("Error in JobItem::defaultPresentationType: unknown type of instrument " + "attached to the job item."); + return QString(); +} + //! Updates the name of file to store intensity data. void JobItem::updateIntensityDataFileName() diff --git a/GUI/coregui/Models/JobItem.h b/GUI/coregui/Models/JobItem.h index 927f40f0e57..0620a024703 100644 --- a/GUI/coregui/Models/JobItem.h +++ b/GUI/coregui/Models/JobItem.h @@ -98,6 +98,7 @@ public: RealDataItem* realDataItem(); QString presentationType(); + QString defaultPresentationType(); private: void updateIntensityDataFileName(); diff --git a/GUI/coregui/Models/JobModel.cpp b/GUI/coregui/Models/JobModel.cpp index 40e1c75fb09..8bf698d0f42 100644 --- a/GUI/coregui/Models/JobModel.cpp +++ b/GUI/coregui/Models/JobModel.cpp @@ -91,6 +91,8 @@ JobItem *JobModel::addJob(const MultiLayerItem *multiLayerItem, jobItem->getItem(JobItem::P_SAMPLE_NAME)->setValue(multiLayerItem->itemName()); jobItem->getItem(JobItem::P_INSTRUMENT_NAME)->setValue(instrumentItem->itemName()); + jobItem->setItemValue(JobItem::P_PRESENTATION_TYPE, jobItem->defaultPresentationType()); + ParameterTreeUtils::createParameterTree(jobItem); JobModelFunctions::setupJobItemOutput(jobItem); diff --git a/GUI/coregui/Models/JobModelFunctions.cpp b/GUI/coregui/Models/JobModelFunctions.cpp index 727a40ec8ac..e4ef5af0c73 100644 --- a/GUI/coregui/Models/JobModelFunctions.cpp +++ b/GUI/coregui/Models/JobModelFunctions.cpp @@ -62,7 +62,6 @@ void JobModelFunctions::setupJobItemOutput(JobItem* jobItem) } - //! Setups JobItem for fit. void JobModelFunctions::setupJobItemForFit(JobItem *jobItem, const RealDataItem *realDataItem) diff --git a/GUI/coregui/Models/item_constants.h b/GUI/coregui/Models/item_constants.h index 6fae1f0802f..85985474602 100644 --- a/GUI/coregui/Models/item_constants.h +++ b/GUI/coregui/Models/item_constants.h @@ -263,6 +263,7 @@ const ModelType AVERAGE_LAYER_MATERIAL = "Average Layer Material"; // --- Presentation types ---------------------------------------------------------- const QString IntensityDataPresentation = "Color Map"; +const QString SpecularDataPresentation = "Reflectometry"; const QString IntensityProjectionsPresentation = "Projections"; const QString FitComparisonPresentation = "Fit Data"; const QString MaskEditorPresentation = "Mask Editor"; diff --git a/GUI/coregui/Views/JobWidgets/JobOutputDataWidget.cpp b/GUI/coregui/Views/JobWidgets/JobOutputDataWidget.cpp index 063275eb403..e9639061d27 100644 --- a/GUI/coregui/Views/JobWidgets/JobOutputDataWidget.cpp +++ b/GUI/coregui/Views/JobWidgets/JobOutputDataWidget.cpp @@ -61,9 +61,9 @@ void JobOutputDataWidget::onActivityChanged(int activity) if (activity == JobViewFlags::FITTING_ACTIVITY) { widget->setPresentation(Constants::FitComparisonPresentation); } else if (activity == JobViewFlags::REAL_TIME_ACTIVITY) { - widget->setPresentation(Constants::IntensityDataPresentation); + widget->setDefaultPresentation(); } else if (activity == JobViewFlags::JOB_VIEW_ACTIVITY) { - widget->setPresentation(Constants::IntensityDataPresentation); + widget->setDefaultPresentation(); } } } @@ -74,5 +74,5 @@ bool JobOutputDataWidget::isValidJobItem(JobItem *item) return false; // do not show running job items, the rest (canceled, fitted, etc) are shown - return item->isRunning() ? false: true; + return !item->isRunning(); } diff --git a/GUI/coregui/Views/JobWidgets/JobResultsPresenter.cpp b/GUI/coregui/Views/JobWidgets/JobResultsPresenter.cpp index ddff3db8ae1..662224c08d0 100644 --- a/GUI/coregui/Views/JobWidgets/JobResultsPresenter.cpp +++ b/GUI/coregui/Views/JobWidgets/JobResultsPresenter.cpp @@ -13,10 +13,11 @@ // ************************************************************************** // #include "JobResultsPresenter.h" -#include "IntensityDataProjectionsWidget.h" #include "FitComparisonWidget.h" -#include "JobItem.h" +#include "IntensityDataProjectionsWidget.h" #include "IntensityDataWidget.h" +#include "JobItem.h" +#include "SpecularDataWidget.h" namespace { // Will switch to the presentation which was used before for given item @@ -32,6 +33,8 @@ JobResultsPresenter::JobResultsPresenter(QWidget* parent) create_new<IntensityDataProjectionsWidget>); registerWidget(Constants::FitComparisonPresentation, create_new<FitComparisonWidget>); + + registerWidget(Constants::SpecularDataPresentation, create_new<SpecularDataWidget>); } QString JobResultsPresenter::itemPresentation() const @@ -48,6 +51,13 @@ void JobResultsPresenter::setPresentation(const QString& presentationType) currentItem()->setItemValue(JobItem::P_PRESENTATION_TYPE, presentationType); } +void JobResultsPresenter::setDefaultPresentation() +{ + auto job_item = dynamic_cast<JobItem*>(currentItem()); + Q_ASSERT(job_item); + setPresentation(job_item->defaultPresentationType()); +} + //! Returns list of presentation types, available for given item. JobItem with fitting abilities //! is valid for IntensityDataWidget and FitComparisonWidget. @@ -68,6 +78,7 @@ QStringList JobResultsPresenter::presentationList(SessionItem* item) Q_ASSERT(item->modelType() == Constants::JobItemType); return QStringList() << Constants::IntensityDataPresentation + << Constants::SpecularDataPresentation << Constants::IntensityProjectionsPresentation << Constants::FitComparisonPresentation; } diff --git a/GUI/coregui/Views/JobWidgets/JobResultsPresenter.h b/GUI/coregui/Views/JobWidgets/JobResultsPresenter.h index 4a17aec49ee..908dd5e3393 100644 --- a/GUI/coregui/Views/JobWidgets/JobResultsPresenter.h +++ b/GUI/coregui/Views/JobWidgets/JobResultsPresenter.h @@ -28,6 +28,7 @@ public: explicit JobResultsPresenter(QWidget* parent = 0); void setPresentation(const QString& presentationType) override; + void setDefaultPresentation(); protected: QString itemPresentation() const override; diff --git a/GUI/coregui/Views/SpecularDataWidgets/SpecularDataWidget.cpp b/GUI/coregui/Views/SpecularDataWidgets/SpecularDataWidget.cpp index bf45393d6af..9ea1ec02f6c 100644 --- a/GUI/coregui/Views/SpecularDataWidgets/SpecularDataWidget.cpp +++ b/GUI/coregui/Views/SpecularDataWidgets/SpecularDataWidget.cpp @@ -13,11 +13,12 @@ // ************************************************************************** // #include "SpecularDataWidget.h" -#include "SpecularDataItem.h" -#include "SpecularDataCanvas.h" -#include "JobItem.h" +#include "GUIHelpers.h" #include "IntensityDataItemUtils.h" #include "IntensityDataPropertyWidget.h" +#include "JobItem.h" +#include "SpecularDataItem.h" +#include "SpecularDataCanvas.h" #include <QBoxLayout> #include <QMenu> @@ -69,12 +70,10 @@ void SpecularDataWidget::onContextMenuRequest(const QPoint& point) SpecularDataItem* SpecularDataWidget::specularDataItem() { - // temporarily commented out - // return IntensityDataItemUtils::intensityDataItem(currentItem()); + auto parent = currentItem(); + if (!parent || parent->modelType() != Constants::JobItemType) + throw GUIHelpers::Error( + "Error in SpecularDataWidget::specularDataItem: parent item is of unexpected type"); - // temporary solution, should be removed after starting to use - // JobItem - SpecularDataItem* result = dynamic_cast<SpecularDataItem*>(currentItem()); - Q_ASSERT(result); - return result; + return &parent->item<SpecularDataItem>(JobItem::T_OUTPUT); } diff --git a/GUI/coregui/Views/TestView.cpp b/GUI/coregui/Views/TestView.cpp index 69f62308b9d..380ef195d38 100644 --- a/GUI/coregui/Views/TestView.cpp +++ b/GUI/coregui/Views/TestView.cpp @@ -15,6 +15,7 @@ #include "TestView.h" #include "AccordionWidget.h" #include "JobModel.h" +#include "JobItem.h" #include "MaskEditor.h" #include "MaterialEditor.h" #include "MinimizerItem.h" @@ -184,13 +185,15 @@ void TestView::test_ba3d() void TestView::test_specular_data_widget() { SessionModel* tempModel = new SessionModel("Test", this); - auto data = fillTestItem(tempModel->insertNewItem(Constants::SpecularDataType)); + auto job_item = dynamic_cast<JobItem*>(tempModel->insertNewItem(Constants::JobItemType)); + fillTestItem(tempModel->insertNewItem(Constants::SpecularDataType, + tempModel->indexOfItem(job_item), -1, JobItem::T_OUTPUT)); QVBoxLayout *layout = new QVBoxLayout; layout->setMargin(0); layout->setSpacing(0); auto widget = new SpecularDataWidget(this); - widget->setItem(data); + widget->setItem(job_item); layout->addWidget(widget); setLayout(layout); } -- GitLab