From c4e0982fe005cd6a0c96184593e6f6e59a80ec1f Mon Sep 17 00:00:00 2001 From: Gennady Pospelov <g.pospelov@fz-juelich.de> Date: Thu, 19 Oct 2017 14:12:46 +0200 Subject: [PATCH] ParameterTuninngWidget become SessionItemWidget (fixed crash on JobItem delete) --- .../JobWidgets/ParameterTuningWidget.cpp | 81 +++++++++---------- .../Views/JobWidgets/ParameterTuningWidget.h | 15 ++-- 2 files changed, 45 insertions(+), 51 deletions(-) diff --git a/GUI/coregui/Views/JobWidgets/ParameterTuningWidget.cpp b/GUI/coregui/Views/JobWidgets/ParameterTuningWidget.cpp index 069f9b543fa..835784e316d 100644 --- a/GUI/coregui/Views/JobWidgets/ParameterTuningWidget.cpp +++ b/GUI/coregui/Views/JobWidgets/ParameterTuningWidget.cpp @@ -46,10 +46,9 @@ const QString style_sheet = ParameterTuningWidget::ParameterTuningWidget(QWidget* parent) - : QWidget(parent) + : SessionItemWidget(parent) , m_toolBar(new JobRealTimeToolBar(this)) , m_jobModel(nullptr) - , m_currentJobItem(nullptr) , m_parameterTuningModel(nullptr) , m_sliderSettingsWidget(new SliderSettingsWidget(this)) , m_treeView(new QTreeView) @@ -84,31 +83,6 @@ ParameterTuningWidget::ParameterTuningWidget(QWidget* parent) this, &ParameterTuningWidget::restoreModelsOfCurrentJobItem); } -void ParameterTuningWidget::setItem(JobItem* item) -{ - if (m_currentJobItem == item) { - return; - - } else { - if (m_currentJobItem) - m_currentJobItem->mapper()->unsubscribe(this); - - m_currentJobItem = item; - if (!m_currentJobItem) - return; - - m_jobModel = dynamic_cast<JobModel*>(m_currentJobItem->model()); - - updateParameterModel(); - updateDragAndDropSettings(); - - m_currentJobItem->mapper()->setOnPropertyChange( - [this](const QString& name) { onPropertyChanged(name); }, this); - - onPropertyChanged(JobItem::P_STATUS); - } -} - QItemSelectionModel* ParameterTuningWidget::selectionModel() { Q_ASSERT(m_treeView); @@ -130,14 +104,14 @@ QVector<ParameterItem*> ParameterTuningWidget::getSelectedParameters() void ParameterTuningWidget::onCurrentLinkChanged(SessionItem* item) { - Q_ASSERT(m_currentJobItem); + Q_ASSERT(jobItem()); - if (m_currentJobItem->isRunning()) + if (jobItem()->isRunning()) return; if (item) { // link.updateItem(); // FIXME circular dependency if uncomment - m_jobModel->runJob(m_currentJobItem->index()); + m_jobModel->runJob(jobItem()->index()); } } @@ -148,9 +122,9 @@ void ParameterTuningWidget::onSliderValueChanged(double value) void ParameterTuningWidget::onLockZValueChanged(bool value) { - if (!m_currentJobItem) + if (!jobItem()) return; - if (IntensityDataItem* intensityDataItem = m_currentJobItem->intensityDataItem()) + if (IntensityDataItem* intensityDataItem = jobItem()->intensityDataItem()) intensityDataItem->setZAxisLocked(value); } @@ -158,10 +132,10 @@ void ParameterTuningWidget::updateParameterModel() { Q_ASSERT(m_jobModel); - if (!m_currentJobItem) + if (!jobItem()) return; - if (!m_currentJobItem->multiLayerItem() || !m_currentJobItem->instrumentItem()) + if (!jobItem()->multiLayerItem() || !jobItem()->instrumentItem()) throw GUIHelpers::Error("ModelTuningWidget::updateParameterModel() -> Error." "JobItem doesn't have sample or instrument model."); @@ -171,7 +145,7 @@ void ParameterTuningWidget::updateParameterModel() m_treeView->setModel(m_parameterTuningModel); m_treeView->setRootIndex( - m_parameterTuningModel->mapFromSource(m_currentJobItem->parameterContainerItem()->index())); + m_parameterTuningModel->mapFromSource(jobItem()->parameterContainerItem()->index())); if (m_treeView->columnWidth(0) < 170) m_treeView->setColumnWidth(0, 170); m_treeView->expandAll(); @@ -185,15 +159,15 @@ void ParameterTuningWidget::onCustomContextMenuRequested(const QPoint& point) void ParameterTuningWidget::restoreModelsOfCurrentJobItem() { Q_ASSERT(m_jobModel); - Q_ASSERT(m_currentJobItem); + Q_ASSERT(jobItem()); - if (m_currentJobItem->isRunning()) + if (jobItem()->isRunning()) return; closeActiveEditors(); - m_jobModel->restore(m_currentJobItem); - m_jobModel->runJob(m_currentJobItem->index()); + m_jobModel->restore(jobItem()); + m_jobModel->runJob(jobItem()->index()); } void ParameterTuningWidget::makeSelected(ParameterItem* item) @@ -215,15 +189,28 @@ void ParameterTuningWidget::contextMenuEvent(QContextMenuEvent* ) // reimplemented to suppress context menu from QMainWindow } +void ParameterTuningWidget::subscribeToItem() +{ + m_jobModel = dynamic_cast<JobModel*>(jobItem()->model()); + + updateParameterModel(); + updateDragAndDropSettings(); + + jobItem()->mapper()->setOnPropertyChange( + [this](const QString& name) { onPropertyChanged(name); }, this); + + onPropertyChanged(JobItem::P_STATUS); +} + void ParameterTuningWidget::onPropertyChanged(const QString& property_name) { if (property_name == JobItem::P_STATUS) { m_warningSign->clear(); - if (m_currentJobItem->isFailed()) { + if (jobItem()->isFailed()) { QString message; message.append("Current parameter values cause simulation failure.\n\n"); - message.append(m_currentJobItem->getComments()); + message.append(jobItem()->getComments()); m_warningSign->setWarningMessage(message); } @@ -231,17 +218,23 @@ void ParameterTuningWidget::onPropertyChanged(const QString& property_name) } } +JobItem* ParameterTuningWidget::jobItem() +{ + return dynamic_cast<JobItem*>(currentItem()); +} + + //! Disable drag-and-drop abilities, if job is in fit running state. void ParameterTuningWidget::updateDragAndDropSettings() { - Q_ASSERT(m_currentJobItem); - if (m_currentJobItem->getStatus() == Constants::STATUS_FITTING) { + Q_ASSERT(jobItem()); + if (jobItem()->getStatus() == Constants::STATUS_FITTING) { setTuningDelegateEnabled(false); m_treeView->setDragDropMode(QAbstractItemView::NoDragDrop); } else { setTuningDelegateEnabled(true); - if (m_currentJobItem->isValidForFitting()) + if (jobItem()->isValidForFitting()) m_treeView->setDragDropMode(QAbstractItemView::DragOnly); } } diff --git a/GUI/coregui/Views/JobWidgets/ParameterTuningWidget.h b/GUI/coregui/Views/JobWidgets/ParameterTuningWidget.h index 22e72a3b795..217b2c2e506 100644 --- a/GUI/coregui/Views/JobWidgets/ParameterTuningWidget.h +++ b/GUI/coregui/Views/JobWidgets/ParameterTuningWidget.h @@ -17,8 +17,7 @@ #ifndef PARAMETERTUNINGWIDGET_H #define PARAMETERTUNINGWIDGET_H -#include <QWidget> -#include <memory> +#include "SessionItemWidget.h" class JobRealTimeToolBar; class JobModel; @@ -32,15 +31,16 @@ class QTreeView; class WarningSign; class ParameterItem; -class ParameterTuningWidget : public QWidget +//! Main widget for real time parameter tuning. +//! Contains a tree for parameter tuning and the model to provide drag-and-drop in FitActivityPanel. + +class ParameterTuningWidget : public SessionItemWidget { Q_OBJECT public: explicit ParameterTuningWidget(QWidget* parent = 0); - void setItem(JobItem* item); - QItemSelectionModel* selectionModel(); QVector<ParameterItem*> getSelectedParameters(); @@ -58,6 +58,8 @@ public slots: protected: void resizeEvent(QResizeEvent* event); void contextMenuEvent(QContextMenuEvent*); + virtual void subscribeToItem(); + virtual void unsubscribeFromItem(); private slots: void onPropertyChanged(const QString& property_name); @@ -65,14 +67,13 @@ private slots: void onCustomContextMenuRequested(const QPoint& point); private: + JobItem* jobItem(); void updateDragAndDropSettings(); - void setTuningDelegateEnabled(bool enabled); void closeActiveEditors(); JobRealTimeToolBar* m_toolBar; JobModel* m_jobModel; - JobItem* m_currentJobItem; ParameterTuningModel* m_parameterTuningModel; SliderSettingsWidget* m_sliderSettingsWidget; QTreeView* m_treeView; -- GitLab