From 8d2e050e7ddbfb8e28254b27a9c13539d8e76e92 Mon Sep 17 00:00:00 2001
From: Walter Van Herck <w.van.herck@fz-juelich.de>
Date: Mon, 25 Feb 2013 17:52:01 +0100
Subject: [PATCH] Added JobModel to execute asynchronous simulation jobs

---
 GUI/coregui/Models/JobModel.cpp       | 18 ++++++++++++++++++
 GUI/coregui/Models/JobModel.h         | 21 +++++++++++++++++++++
 GUI/coregui/Views/SimulationView.cpp  | 16 +++++++++++++---
 GUI/coregui/Views/SimulationView.h    |  1 +
 GUI/coregui/coregui.pro               |  6 ++++--
 GUI/coregui/mainwindow/mainwindow.cpp | 13 +++++++------
 6 files changed, 64 insertions(+), 11 deletions(-)
 create mode 100644 GUI/coregui/Models/JobModel.cpp
 create mode 100644 GUI/coregui/Models/JobModel.h

diff --git a/GUI/coregui/Models/JobModel.cpp b/GUI/coregui/Models/JobModel.cpp
new file mode 100644
index 00000000000..f76bee935e3
--- /dev/null
+++ b/GUI/coregui/Models/JobModel.cpp
@@ -0,0 +1,18 @@
+#include "JobModel.h"
+
+#include "Simulation.h"
+
+JobModel::JobModel(Simulation *p_simulation)
+    : mp_simulation(p_simulation)
+{
+}
+
+JobModel::~JobModel()
+{
+    delete mp_simulation;
+}
+
+void JobModel::run()
+{
+    mp_simulation->runSimulation();
+}
diff --git a/GUI/coregui/Models/JobModel.h b/GUI/coregui/Models/JobModel.h
new file mode 100644
index 00000000000..d2f43ceb667
--- /dev/null
+++ b/GUI/coregui/Models/JobModel.h
@@ -0,0 +1,21 @@
+#ifndef JOBMODEL_H
+#define JOBMODEL_H
+
+#include <QThread>
+
+class Simulation;
+
+class JobModel : public QThread
+{
+    Q_OBJECT
+
+public:
+    JobModel(Simulation *p_simulation);
+    virtual ~JobModel();
+
+protected:
+    void run();
+    Simulation *mp_simulation;
+};
+
+#endif // JOBMODEL_H
diff --git a/GUI/coregui/Views/SimulationView.cpp b/GUI/coregui/Views/SimulationView.cpp
index 1ee19bab2e3..5da1ac00414 100644
--- a/GUI/coregui/Views/SimulationView.cpp
+++ b/GUI/coregui/Views/SimulationView.cpp
@@ -2,6 +2,8 @@
 
 #include "SimulationDataModel.h"
 #include "Simulation.h"
+#include "JobModel.h"
+#include "mainwindow.h"
 
 #include <QGroupBox>
 #include <QPushButton>
@@ -104,8 +106,16 @@ void SimulationView::onRunSimulation()
     Simulation *p_sim = new Simulation;
     p_sim->setSample(*p_sample);
     p_sim->setInstrument(*p_instrument);
-    p_sim->runSimulation();
+    JobModel *p_new_job = new JobModel(p_sim);
+    connect(p_new_job, SIGNAL(finished()), this, SLOT(onJobFinished()));
+    p_new_job->start();
     // initialize a Simulation object and run it
-    QMessageBox::information(this, tr("Simulation Done"),
-                             tr("The simulation is done calculating."));
+    QMessageBox::information(this, tr("Simulation Started"),
+                             tr("The simulation is now calculating."));
+}
+
+void SimulationView::onJobFinished()
+{
+    QMessageBox::information(this, tr("Simulation Job Finished"),
+                             tr("A simulation job has finished."));
 }
diff --git a/GUI/coregui/Views/SimulationView.h b/GUI/coregui/Views/SimulationView.h
index a732d07c180..b8ee17b0811 100644
--- a/GUI/coregui/Views/SimulationView.h
+++ b/GUI/coregui/Views/SimulationView.h
@@ -17,6 +17,7 @@ public:
 
 public slots:
     void onRunSimulation();
+    void onJobFinished();
 
 private:
     SimulationDataModel *mp_simulation_data_model;
diff --git a/GUI/coregui/coregui.pro b/GUI/coregui/coregui.pro
index c0cf6c6d9f0..c3b7ebc1d54 100644
--- a/GUI/coregui/coregui.pro
+++ b/GUI/coregui/coregui.pro
@@ -38,7 +38,8 @@ SOURCES += \
     Views/SimulationView.cpp \
     Views/WelcomeView.cpp \
     Views/sampleeditor.cpp \
-    Views/sampleeditorstack.cpp
+    Views/sampleeditorstack.cpp \
+    Models/JobModel.cpp
 
 HEADERS  += \
     mainwindow/imode.h \
@@ -57,7 +58,8 @@ HEADERS  += \
     Views/SimulationView.h \
     Views/WelcomeView.h \
     Views/sampleeditor.h \
-    Views/sampleeditorstack.h
+    Views/sampleeditorstack.h \
+    Models/JobModel.h
 
 INCLUDEPATH += $$PWD/mainwindow $$PWD/utils $$PWD/welcomemanager $$PWD/samplemanager $$PWD/experimentmanager $$PWD/simulationmanager $$PWD/fitmanager
 INCLUDEPATH += $$PWD/mainwindow $$PWD/utils $$PWD/Views $$PWD/Models
diff --git a/GUI/coregui/mainwindow/mainwindow.cpp b/GUI/coregui/mainwindow/mainwindow.cpp
index cc7355c7f55..1d420254591 100644
--- a/GUI/coregui/mainwindow/mainwindow.cpp
+++ b/GUI/coregui/mainwindow/mainwindow.cpp
@@ -48,12 +48,12 @@ MainWindow::MainWindow(QWidget *parent)
     setCorner(Qt::BottomRightCorner, Qt::BottomDockWidgetArea);
 
     //m_tabWidget = new TaskSelectorWidget(this);
-    m_tabWidget = new Manhattan::FancyTabWidget(this);
-    m_welcomeView = new WelcomeManager(this);
-    m_instrumentView = new InstrumentView(mp_sim_data_model, this);
-    m_sampleView = new SampleManager(this);
-    m_simulationView = new SimulationView(mp_sim_data_model, this);
-    m_fitView = new FitManager(this);
+    m_tabWidget = new Manhattan::FancyTabWidget();
+    m_welcomeView = new WelcomeManager();
+    m_instrumentView = new InstrumentView(mp_sim_data_model);
+    m_sampleView = new SampleManager();
+    m_simulationView = new SimulationView(mp_sim_data_model);
+    m_fitView = new FitManager();
 
     m_tabWidget->insertTab(0, m_welcomeView, QIcon(":/images/mode_welcome.png"), "Welcome");
     m_tabWidget->insertTab(1, m_instrumentView, QIcon(":/images/mode_exp.png"), "Instrument");
@@ -77,6 +77,7 @@ MainWindow::~MainWindow()
 void MainWindow::onChangeTabWidget(int index)
 {
     // update views which depend on others
+    (void)index;
     m_simulationView->updateViewElements();
 }
 
-- 
GitLab