From c8fd7cf664a29b089a37afb860d14e167bded905 Mon Sep 17 00:00:00 2001
From: Gennady Pospelov <g.pospelov@fz-juelich.de>
Date: Thu, 25 Sep 2014 11:40:50 +0200
Subject: [PATCH] ModelTuningWidget is connected with JobQueueModel

---
 GUI/coregui/Models/JobItem.cpp                |  3 +
 GUI/coregui/Models/JobQueueData.cpp           | 56 ++++++--------
 GUI/coregui/Models/JobQueueData.h             |  8 +-
 .../JobQueueWidgets/AdvModelTuningWidget.cpp  | 74 ++++++++++++++++++-
 .../JobQueueWidgets/AdvModelTuningWidget.h    | 19 ++++-
 .../JobQueueWidgets/JobRealTimeWidget.cpp     |  2 +-
 .../SimulationWidgets/ModelTuningDelegate.cpp | 10 ++-
 .../SimulationWidgets/ModelTuningDelegate.h   |  4 +-
 .../SimulationWidgets/ModelTuningWidget.cpp   |  2 +-
 GUI/coregui/Views/JobView.cpp                 | 10 +--
 10 files changed, 134 insertions(+), 54 deletions(-)

diff --git a/GUI/coregui/Models/JobItem.cpp b/GUI/coregui/Models/JobItem.cpp
index 7b6d83b8004..913e90b2b1f 100644
--- a/GUI/coregui/Models/JobItem.cpp
+++ b/GUI/coregui/Models/JobItem.cpp
@@ -79,6 +79,9 @@ void JobItem::initOutputDataItem()
 
 void JobItem::setResults(const Simulation *simulation)
 {
+    if(!simulation)
+        throw GUIHelpers::Error("JobItem::setResults() -> Error. Null simulation.");
+
 //    qDeleteAll(m_data_items);
 //    m_data_items.clear();
     if(m_data_items.isEmpty()) {
diff --git a/GUI/coregui/Models/JobQueueData.cpp b/GUI/coregui/Models/JobQueueData.cpp
index b832345e26b..8637c95f51c 100644
--- a/GUI/coregui/Models/JobQueueData.cpp
+++ b/GUI/coregui/Models/JobQueueData.cpp
@@ -107,24 +107,21 @@ QString JobQueueData::getIdentifierForJobItem(const JobItem *item)
 
 
 //! submit job and run it in a thread
-void JobQueueData::runJob(QString identifier)
+void JobQueueData::runJob(const QString &identifier)
 {
     if(getThread(identifier)) {
         qDebug() << "JobQueueData::runInThread() -> Thread is already running";
         return;
     }
 
-    // FIXME Simplify this part by getting rid from the method JobQueueData::createJob(QString jobName, Simulation *simulation, JobItem::RunPolicy run_policy)
-    // to allow only JobItem's with initialized InstrumentModel and SampleModel
-    Simulation *simulation = getSimulation(identifier);
-    if(!simulation) {
-        JobItem *jobItem = getJobItem(identifier);
-        simulation = QuickSimulationHelper::getSimulation(jobItem->getSampleModel(), jobItem->getInstrumentModel());
-        m_simulations[identifier] = simulation;
-    }
-    // endoffixme
+    if(getSimulation(identifier))
+        throw GUIHelpers::Error("JobQueueData::runJob() -> Error. Simulation is already existing.");
 
-    JobRunner *runner = new JobRunner(identifier, getSimulation(identifier));
+    JobItem *jobItem = getJobItem(identifier);
+    Simulation *simulation = QuickSimulationHelper::getSimulation(jobItem->getSampleModel(), jobItem->getInstrumentModel());
+    m_simulations[identifier] = simulation;
+
+    JobRunner *runner = new JobRunner(identifier, simulation);
     m_runners[identifier] = runner;
 
     QThread *thread = new QThread();
@@ -153,7 +150,7 @@ void JobQueueData::runJob(QString identifier)
 
 
 //! cancels running job
-void JobQueueData::cancelJob(QString identifier)
+void JobQueueData::cancelJob(const QString &identifier)
 {
     //qDebug() << "JobQueueData::cancelJob()";
     if(getThread(identifier)) {
@@ -166,7 +163,7 @@ void JobQueueData::cancelJob(QString identifier)
 
 
 //! remove job from list completely
-void JobQueueData::removeJob(QString identifier)
+void JobQueueData::removeJob(const QString &identifier)
 {
     qDebug() << "JobQueueData::removeJob" << identifier;
     cancelJob(identifier);
@@ -179,15 +176,7 @@ void JobQueueData::removeJob(QString identifier)
             break;
         }
     }
-    // removing simulations
-    for(QMap<QString, Simulation *>::iterator it=m_simulations.begin(); it!=m_simulations.end(); ++it) {
-        if(it.key() == identifier) {
-            delete it.value();
-            qDebug() << "       JobQueueData::removeJob   removing simulation" << identifier;
-            m_simulations.erase(it);
-            break;
-        }
-    }
+    clearSimulation(identifier);
 }
 
 
@@ -217,17 +206,9 @@ void JobQueueData::onFinishedJob()
 
     // propagating simulation results
     Simulation *simulation = getSimulation(runner->getIdentifier());
-    if(simulation) {
-        jobItem->setResults(simulation);
-//        jobItem->init();
-//        jobItem->getOutputDataItem()->setOutputData(simulation->getIntensityData());
-    }
+    jobItem->setResults(simulation);
 
-//    if(runner->isTerminated()) {
-//        jobItem->setStatus(JobItem::Canceled);
-//    } else {
-//        jobItem->setStatus(JobItem::Completed);
-//    }
+    // propagating status of runner
     jobItem->setStatus(runner->getStatus());
     if(runner->getStatus() == JobItem::Failed)
         jobItem->setComments(runner->getFailureMessage());
@@ -238,10 +219,9 @@ void JobQueueData::onFinishedJob()
     if(jobItem->getRunPolicy() & JobItem::RunImmediately)
         emit focusRequest(jobItem);
 
-//    qDebug() << "     JobQueueData::onFinishedJob() -> before emiting jobIsFinished()";
     emit jobIsFinished(runner->getIdentifier());
-//    qDebug() << "     JobQueueData::onFinishedJob() -> after emiting jobIsFinished(), before asigning runner for deletion";
 
+    clearSimulation(runner->getIdentifier());
     assignForDeletion(runner);
 //    qDebug() << "     JobQueueData::onFinishedJob() -> after emiting jobIsFinished(), after asigning runner for deletion";
 
@@ -329,6 +309,14 @@ void JobQueueData::assignForDeletion(JobRunner *runner)
 }
 
 
+void JobQueueData::clearSimulation(const QString &identifier)
+{
+    Simulation *simulation = getSimulation(identifier);
+    m_simulations.remove(identifier);
+    delete simulation;
+}
+
+
 //! generates job name
 QString JobQueueData::generateJobName()
 {
diff --git a/GUI/coregui/Models/JobQueueData.h b/GUI/coregui/Models/JobQueueData.h
index e95e10d0a00..88c9a368866 100644
--- a/GUI/coregui/Models/JobQueueData.h
+++ b/GUI/coregui/Models/JobQueueData.h
@@ -45,14 +45,16 @@ public slots:
     void onFinishedThread();
     void onCancelAllJobs();
 
-    void runJob(QString identifier);
-    void cancelJob(QString identifier);
-    void removeJob(QString identifier);
+    void runJob(const QString &identifier);
+    void cancelJob(const QString &identifier);
+    void removeJob(const QString &identifier);
 
     friend class QuickSimulationRunner;
 private:
     void assignForDeletion(QThread *thread);
     void assignForDeletion(JobRunner *runner);
+    void clearSimulation(const QString &identifier);
+
     void updateGlobalProgress();
 
     QString generateJobName();
diff --git a/GUI/coregui/Views/Components/JobQueueWidgets/AdvModelTuningWidget.cpp b/GUI/coregui/Views/Components/JobQueueWidgets/AdvModelTuningWidget.cpp
index 6f3118b697b..5da5958e93f 100644
--- a/GUI/coregui/Views/Components/JobQueueWidgets/AdvModelTuningWidget.cpp
+++ b/GUI/coregui/Views/Components/JobQueueWidgets/AdvModelTuningWidget.cpp
@@ -1,14 +1,23 @@
 #include "AdvModelTuningWidget.h"
 #include "JobItem.h"
 #include "QuickSimulationSettings.h"
+#include "QuickSimulationHelper.h"
+#include "GUIHelpers.h"
+#include "ModelTuningDelegate.h"
+#include "JobQueueData.h"
 #include <QLabel>
 #include <QVBoxLayout>
 #include <QTreeView>
+#include <QStandardItemModel>
+#include <QDebug>
 
-AdvModelTuningWidget::AdvModelTuningWidget(QWidget *parent)
+AdvModelTuningWidget::AdvModelTuningWidget(JobQueueData *jobQueueData, QWidget *parent)
     : QWidget(parent)
+    , m_jobQueueData(jobQueueData)
     , m_currentJobItem(0)
     , m_quickSimulationSettings(0)
+    , m_parameterModel(0)
+    , m_delegate(new ModelTuningDelegate)
 {
     setMinimumSize(128, 128);
     setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
@@ -22,6 +31,8 @@ AdvModelTuningWidget::AdvModelTuningWidget(QWidget *parent)
 
     m_treeView = new QTreeView();
     m_treeView->setStyleSheet("QTreeView::branch {background: palette(base);}QTreeView::branch:has-siblings:!adjoins-item {border-image: url(:/images/treeview-vline.png) 0;}QTreeView::branch:has-siblings:adjoins-item {border-image: url(:/images/treeview-branch-more.png) 0;}QTreeView::branch:!has-children:!has-siblings:adjoins-item {border-image: url(:/images/treeview-branch-end.png) 0;}QTreeView::branch:has-children:!has-siblings:closed,QTreeView::branch:closed:has-children:has-siblings {border-image: none;image: url(:/images/treeview-branch-closed.png);}QTreeView::branch:open:has-children:!has-siblings,QTreeView::branch:open:has-children:has-siblings  {border-image: none;image: url(:/images/treeview-branch-open.png);}");
+    m_treeView->setItemDelegate(m_delegate);
+    connect(m_delegate, SIGNAL(currentLinkChanged(ItemLink)), this, SLOT(onCurrentLinkChanged(ItemLink)));
 
     QVBoxLayout *mainLayout = new QVBoxLayout;
     mainLayout->setMargin(0);
@@ -35,7 +46,66 @@ AdvModelTuningWidget::AdvModelTuningWidget(QWidget *parent)
 
 }
 
+AdvModelTuningWidget::~AdvModelTuningWidget()
+{
+    delete m_parameterModel;
+}
+
+
 void AdvModelTuningWidget::setCurrentItem(JobItem *item)
 {
-    m_currentJobItem = item;
+    qDebug() << "AdvModelTuningWidget::setCurrentItem" << item;
+    if(m_currentJobItem != item) {
+        m_currentJobItem = item;
+        updateParameterModel();
+    }
+}
+
+void AdvModelTuningWidget::onCurrentLinkChanged(ItemLink link)
+{
+    qDebug() << "AdvModelTuningWidget::onCurrentLinkChanged";
+    Q_ASSERT(m_currentJobItem);
+
+    if(m_currentJobItem->isRunning()) {
+        qDebug() << "AdvModelTuningWidget::onCurrentLinkChanged(ItemLink link) -> Running...";
+        return;
+    }
+
+    if(link.getItem())
+    {
+        qDebug() << "AdvModelTuningWidget::onCurrentLinkChanged() -> Starting to tune model" << link.getItem()->modelType() << link.getPropertyName() << link.getValue();
+
+        link.getItem()->setRegisteredProperty(link.getPropertyName(), link.getValue());
+
+        m_jobQueueData->runJob(m_jobQueueData->getIdentifierForJobItem(m_currentJobItem));
+    }
+
+
+
+
+
+}
+
+
+void AdvModelTuningWidget::updateParameterModel()
+{
+    qDebug() << "AdvModelTuningWidget::updateParameterModel()";
+    if(m_parameterModel) {
+        m_treeView->setModel(0);
+        delete m_parameterModel;
+        m_parameterModel = 0;
+    }
+
+    if(!m_currentJobItem) return;
+
+    if(!m_currentJobItem->getSampleModel() || !m_currentJobItem->getInstrumentModel())
+        throw GUIHelpers::Error("AdvModelTuningWidget::updateParameterModel() -> Error. JobItem doesn't have sample or instrument model.");
+
+    m_parameterModel = QuickSimulationHelper::createParameterModel(m_currentJobItem->getSampleModel(), m_currentJobItem->getInstrumentModel());
+
+    m_treeView->setModel(m_parameterModel);
+//    m_treeView->setFixedHeight(height);
+    m_treeView->setColumnWidth(0,170);
+    m_treeView->expandAll();
+
 }
diff --git a/GUI/coregui/Views/Components/JobQueueWidgets/AdvModelTuningWidget.h b/GUI/coregui/Views/Components/JobQueueWidgets/AdvModelTuningWidget.h
index 7f8b832d122..7ee2e0e465d 100644
--- a/GUI/coregui/Views/Components/JobQueueWidgets/AdvModelTuningWidget.h
+++ b/GUI/coregui/Views/Components/JobQueueWidgets/AdvModelTuningWidget.h
@@ -1,11 +1,16 @@
 #ifndef ADVMODELTUNINGWIDGET_H
 #define ADVMODELTUNINGWIDGET_H
 
+#include "ItemLink.h"
 #include <QWidget>
-class QLabel;
+
 class JobItem;
 class QuickSimulationSettings;
+class ModelTuningDelegate;
+class JobQueueData;
 class QTreeView;
+class QStandardItemModel;
+
 
 class AdvModelTuningWidget : public QWidget
 {
@@ -13,15 +18,23 @@ class AdvModelTuningWidget : public QWidget
 
 public:
 
-    AdvModelTuningWidget(QWidget *parent = 0);
-    virtual ~AdvModelTuningWidget() {}
+    AdvModelTuningWidget(JobQueueData *jobQueueData, QWidget *parent = 0);
+    virtual ~AdvModelTuningWidget();
 
     void setCurrentItem(JobItem *item);
 
+public slots:
+    void onCurrentLinkChanged(ItemLink link);
+
 private:
+    void updateParameterModel();
+
+    JobQueueData *m_jobQueueData;
     JobItem *m_currentJobItem;
     QuickSimulationSettings *m_quickSimulationSettings;
     QTreeView *m_treeView;
+    QStandardItemModel *m_parameterModel;
+    ModelTuningDelegate *m_delegate;
 };
 
 
diff --git a/GUI/coregui/Views/Components/JobQueueWidgets/JobRealTimeWidget.cpp b/GUI/coregui/Views/Components/JobQueueWidgets/JobRealTimeWidget.cpp
index e8221810457..6eeca0354b7 100644
--- a/GUI/coregui/Views/Components/JobQueueWidgets/JobRealTimeWidget.cpp
+++ b/GUI/coregui/Views/Components/JobQueueWidgets/JobRealTimeWidget.cpp
@@ -75,7 +75,7 @@ void JobRealTimeWidget::itemClicked(JobItem * item)
     if( !widget && (item->getStatus() == JobItem::Completed || item->getStatus() == JobItem::Canceled)) {
 
         qDebug() << "JobOutputDataWidget::itemClicked() -> creating";
-        widget = new AdvModelTuningWidget();
+        widget = new AdvModelTuningWidget(m_jobQueueModel->getJobQueueData());
         widget->setCurrentItem(item);
         m_stack->addWidget(widget);
         m_jobItemToTuningWidget[item] = widget;
diff --git a/GUI/coregui/Views/Components/SimulationWidgets/ModelTuningDelegate.cpp b/GUI/coregui/Views/Components/SimulationWidgets/ModelTuningDelegate.cpp
index 4121592d15d..a3e14aa7a56 100644
--- a/GUI/coregui/Views/Components/SimulationWidgets/ModelTuningDelegate.cpp
+++ b/GUI/coregui/Views/Components/SimulationWidgets/ModelTuningDelegate.cpp
@@ -19,12 +19,14 @@
 
 
 
-ModelTuningDelegate::ModelTuningDelegate(int valueColumn, QObject *parent)
+ModelTuningDelegate::ModelTuningDelegate(QObject *parent)
     : QItemDelegate(parent)
+    , m_valueColumn(1)
+    , m_sliderRangeFactor(10.0)
+    , m_multiplyFactor(100)
+
 {
-    m_valueColumn = valueColumn;
-    m_multiplyFactor = 100;
-    m_sliderRangeFactor = 10.0;
+
 }
 
 void ModelTuningDelegate::paint(QPainter *painter,
diff --git a/GUI/coregui/Views/Components/SimulationWidgets/ModelTuningDelegate.h b/GUI/coregui/Views/Components/SimulationWidgets/ModelTuningDelegate.h
index ac7f3a0e627..eab0c340a64 100644
--- a/GUI/coregui/Views/Components/SimulationWidgets/ModelTuningDelegate.h
+++ b/GUI/coregui/Views/Components/SimulationWidgets/ModelTuningDelegate.h
@@ -12,7 +12,7 @@ class BA_CORE_API_ ModelTuningDelegate : public QItemDelegate
     Q_OBJECT
 
 public:
-    ModelTuningDelegate(int valueColumn, QObject *parent = 0);
+    ModelTuningDelegate(QObject *parent = 0);
 
     QSize sizeHint ( const QStyleOptionViewItem & option, const QModelIndex & /* index */) const
     {
@@ -29,6 +29,8 @@ public:
                       const QModelIndex &index) const;
     void setSliderRangeFactor(double value);
 
+    void setValueColumn(int valueColumn) { m_valueColumn = valueColumn; }
+
 signals:
     void currentLinkChanged(ItemLink link);
 
diff --git a/GUI/coregui/Views/Components/SimulationWidgets/ModelTuningWidget.cpp b/GUI/coregui/Views/Components/SimulationWidgets/ModelTuningWidget.cpp
index 9ecf81aa73b..ae0dbaf2803 100644
--- a/GUI/coregui/Views/Components/SimulationWidgets/ModelTuningWidget.cpp
+++ b/GUI/coregui/Views/Components/SimulationWidgets/ModelTuningWidget.cpp
@@ -19,7 +19,7 @@ ModelTuningWidget::ModelTuningWidget(SampleModel *sampleModel, InstrumentModel *
     : QWidget(parent)
     , m_parameterModel(0)
     , m_treeView(0)
-    , m_delegate(new ModelTuningDelegate(1))
+    , m_delegate(new ModelTuningDelegate)
     , m_sampleModel(0)
     , m_instrumentModel(0)
     , m_simulationRunner(0)
diff --git a/GUI/coregui/Views/JobView.cpp b/GUI/coregui/Views/JobView.cpp
index e7225bd1cf9..c66d3aa3fed 100644
--- a/GUI/coregui/Views/JobView.cpp
+++ b/GUI/coregui/Views/JobView.cpp
@@ -127,21 +127,21 @@ void JobView::resetToDefaultLayout()
 
     setTrackingEnabled(true);
 
-    onJobViewActivityRequest();
+    //onJobViewActivityRequest();
 }
 
 
 void JobView::onJobViewActivityRequest()
 {
-    m_d->m_dockWidgets[JobListDock]->show();
-    m_d->m_dockWidgets[RealTimeDock]->hide();
+//    m_d->m_dockWidgets[JobListDock]->show();
+//    m_d->m_dockWidgets[RealTimeDock]->hide();
 }
 
 
 void JobView::onRealTimeActivityRequest()
 {
-    m_d->m_dockWidgets[JobListDock]->hide();
-    m_d->m_dockWidgets[RealTimeDock]->show();
+//    m_d->m_dockWidgets[JobListDock]->hide();
+//    m_d->m_dockWidgets[RealTimeDock]->show();
 }
 
 
-- 
GitLab