From 5a5b3cc7b2aeed77c810235e2d737d93aa9636a9 Mon Sep 17 00:00:00 2001
From: Gennady Pospelov <g.pospelov@fz-juelich.de>
Date: Mon, 13 Jun 2016 15:59:27 +0200
Subject: [PATCH] New status for JobItem to mark running fitting; additional
 begin/end fit time properties set.

---
 GUI/coregui/Models/JobItem.cpp                | 21 ++++++++++++++-----
 GUI/coregui/Models/JobQueueData.cpp           |  8 ++-----
 GUI/coregui/Models/JobQueueData.h             |  1 +
 GUI/coregui/Models/item_constants.h           |  1 +
 .../Views/FitWidgets/FitSuiteWidget.cpp       | 13 ++++++++++++
 .../Views/FitWidgets/FittingWorker.cpp        | 16 +++++++++++++-
 GUI/coregui/Views/FitWidgets/FittingWorker.h  |  4 ++--
 .../Views/FitWidgets/RunFitManager.cpp        | 14 +++++++++++--
 GUI/coregui/Views/FitWidgets/RunFitManager.h  |  5 ++++-
 GUI/coregui/utils/GUIHelpers.cpp              |  6 ++++++
 GUI/coregui/utils/GUIHelpers.h                |  2 ++
 11 files changed, 74 insertions(+), 17 deletions(-)

diff --git a/GUI/coregui/Models/JobItem.cpp b/GUI/coregui/Models/JobItem.cpp
index d1ff79c8779..3e34b164322 100644
--- a/GUI/coregui/Models/JobItem.cpp
+++ b/GUI/coregui/Models/JobItem.cpp
@@ -30,6 +30,16 @@
 #include <QDateTime>
 #include <QDebug>
 
+namespace {
+    QVariant createStatusVariant() {
+        ComboProperty status;
+        status << Constants::STATUS_IDLE << Constants::STATUS_RUNNING
+               << Constants::STATUS_FITTING << Constants::STATUS_COMPLETED
+               << Constants::STATUS_CANCELED << Constants::STATUS_FAILED;
+        return status.getVariant();
+    }
+}
+
 const QString JobItem::P_IDENTIFIER = "Identifier";
 const QString JobItem::P_SAMPLE_NAME = "Sample";
 const QString JobItem::P_INSTRUMENT_NAME = "Instrument";
@@ -57,10 +67,10 @@ JobItem::JobItem()
     addProperty(P_INSTRUMENT_NAME, QString())->setEditable(false);
     addProperty(P_WITH_FITTING, false)->setVisible(false);
 
-    ComboProperty status;
-    status << Constants::STATUS_IDLE << Constants::STATUS_RUNNING << Constants::STATUS_COMPLETED
-           << Constants::STATUS_CANCELED << Constants::STATUS_FAILED;
-    addProperty(P_STATUS, status.getVariant())->setEditable(false);
+//    ComboProperty status;
+//    status << Constants::STATUS_IDLE << Constants::STATUS_RUNNING << Constants::STATUS_FITTING << Constants::STATUS_COMPLETED
+//           << Constants::STATUS_CANCELED << Constants::STATUS_FAILED;
+    addProperty(P_STATUS, createStatusVariant())->setEditable(false);
 
     addProperty(P_BEGIN_TIME, QString())->setEditable(false);
     addProperty(P_END_TIME, QString())->setEditable(false);
@@ -197,7 +207,8 @@ void JobItem::setEndTime(const QString &end_time)
 void JobItem::setDuration(int duration)
 {
     QString str;
-    str.sprintf("%7.3f", duration/1000.);
+    if(duration != 0)
+        str.sprintf("%7.3f", duration/1000.);
     setItemValue(P_DURATION, str.simplified());
 }
 
diff --git a/GUI/coregui/Models/JobQueueData.cpp b/GUI/coregui/Models/JobQueueData.cpp
index 761f1c8642a..902e425807f 100644
--- a/GUI/coregui/Models/JobQueueData.cpp
+++ b/GUI/coregui/Models/JobQueueData.cpp
@@ -22,7 +22,6 @@
 #include "DomainSimulationBuilder.h"
 #include "GUIHelpers.h"
 #include <QThread>
-#include <QDateTime>
 #include <QDebug>
 
 JobQueueData::JobQueueData(JobModel *jobModel)
@@ -154,9 +153,7 @@ void JobQueueData::onStartedJob()
     JobItem *jobItem = m_jobModel->getJobItemForIdentifier(runner->getIdentifier());
     jobItem->setProgress(0);
     jobItem->setStatus(Constants::STATUS_RUNNING);
-    QString begin_time
-            = QDateTime::currentDateTime().toString(QStringLiteral("yyyy.MM.dd hh:mm:ss"));
-    jobItem->setBeginTime(begin_time);
+    jobItem->setBeginTime(GUIHelpers::currentDateTime());
     jobItem->setEndTime(QString());
 }
 
@@ -275,8 +272,7 @@ void JobQueueData::clearSimulation(const QString &identifier)
 
 void JobQueueData::processFinishedJob(JobRunner *runner, JobItem *jobItem)
 {
-    QString end_time = QDateTime::currentDateTime().toString("yyyy.MM.dd hh:mm:ss");
-    jobItem->setEndTime(end_time);
+    jobItem->setEndTime(GUIHelpers::currentDateTime());
     jobItem->setDuration(runner->getSimulationDuration());
 
     // propagating status of runner
diff --git a/GUI/coregui/Models/JobQueueData.h b/GUI/coregui/Models/JobQueueData.h
index d81628aa8a7..87dea678f91 100644
--- a/GUI/coregui/Models/JobQueueData.h
+++ b/GUI/coregui/Models/JobQueueData.h
@@ -50,6 +50,7 @@ public slots:
     void onStartedJob();
     void onProgressUpdate();
     void onFinishedJob();
+
     void onFinishedThread();
     void onCancelAllJobs();
 
diff --git a/GUI/coregui/Models/item_constants.h b/GUI/coregui/Models/item_constants.h
index 363a43ad625..03dc82a4eb6 100644
--- a/GUI/coregui/Models/item_constants.h
+++ b/GUI/coregui/Models/item_constants.h
@@ -188,6 +188,7 @@ const ModelType UnitsQyQz = "Qy,Qz";
 
 const ModelType STATUS_IDLE = "Idle";
 const ModelType STATUS_RUNNING = "Running";
+const ModelType STATUS_FITTING = "Fitting";
 const ModelType STATUS_COMPLETED = "Completed";
 const ModelType STATUS_CANCELED = "Canceled";
 const ModelType STATUS_FAILED = "Failed";
diff --git a/GUI/coregui/Views/FitWidgets/FitSuiteWidget.cpp b/GUI/coregui/Views/FitWidgets/FitSuiteWidget.cpp
index a91c1315308..c130ad551be 100644
--- a/GUI/coregui/Views/FitWidgets/FitSuiteWidget.cpp
+++ b/GUI/coregui/Views/FitWidgets/FitSuiteWidget.cpp
@@ -30,6 +30,7 @@
 #include "MinimizerSettingsWidget.h"
 #include "FitResultsWidget.h"
 #include "mainwindow_constants.h"
+#include "GUIHelpers.h"
 #include <QVBoxLayout>
 #include <QTabWidget>
 #include <QMessageBox>
@@ -190,14 +191,26 @@ void FitSuiteWidget::stopFitting()
 
 void FitSuiteWidget::onFittingStarted()
 {
+    m_currentItem->setStatus(Constants::STATUS_FITTING);
+    m_currentItem->setProgress(0);
+    m_currentItem->setStatus(Constants::STATUS_RUNNING);
+    m_currentItem->setBeginTime(GUIHelpers::currentDateTime());
+    m_currentItem->setEndTime(QString());
+    m_currentItem->setDuration(0);
+
     qDebug() << "FitSuiteWidget::onFittingStarted()";
     emit fittingStarted(m_currentItem);
 }
 
 void FitSuiteWidget::onFittingFinished()
 {
+    m_currentItem->setStatus(Constants::STATUS_COMPLETED);
+    m_currentItem->setEndTime(GUIHelpers::currentDateTime());
+    m_currentItem->setProgress(100);
+    m_currentItem->setDuration(m_manager->getDuration());
     qDebug() << "FitSuiteWidget::onFittingFinished()";
     m_currentItem->fitSuiteItem()->mapper()->unsubscribe(this);
+    Q_ASSERT(0);
     emit fittingFinished(m_currentItem);
 }
 
diff --git a/GUI/coregui/Views/FitWidgets/FittingWorker.cpp b/GUI/coregui/Views/FitWidgets/FittingWorker.cpp
index 0da53a4cf46..5aa13717094 100644
--- a/GUI/coregui/Views/FitWidgets/FittingWorker.cpp
+++ b/GUI/coregui/Views/FitWidgets/FittingWorker.cpp
@@ -16,17 +16,25 @@
 
 #include "FittingWorker.h"
 #include "FitSuite.h"
+#include <QDateTime>
+#include <QDebug>
 
 void FittingWorker::startFit()
 {
+    int duration(0);
+    QDateTime beginTime = QDateTime::currentDateTime();
+
     m_fitsuite->resetInterrupt();
     emit started();
     try {
         m_fitsuite->runFit();
+        duration = durationSince(beginTime);
+
     } catch(const std::exception& ex) {
+        duration = durationSince(beginTime);
         emit error(QString::fromLatin1(ex.what()));
     }
-    emit finished();
+    emit finished(duration);
 }
 
 void FittingWorker::interruptFitting()
@@ -36,3 +44,9 @@ void FittingWorker::interruptFitting()
     }
 }
 
+int FittingWorker::durationSince(const QDateTime &since)
+{
+    QDateTime endTime = QDateTime::currentDateTime();
+    return int(since.msecsTo(endTime));
+}
+
diff --git a/GUI/coregui/Views/FitWidgets/FittingWorker.h b/GUI/coregui/Views/FitWidgets/FittingWorker.h
index c96bda1dd4f..71684535ec4 100644
--- a/GUI/coregui/Views/FitWidgets/FittingWorker.h
+++ b/GUI/coregui/Views/FitWidgets/FittingWorker.h
@@ -41,12 +41,12 @@ signals:
 
     void started();
 
-    void finished();
+    void finished(int duration);
 
     void error(const QString &message);
 
 private:
-
+    int durationSince(const class QDateTime &since);
     std::shared_ptr<FitSuite> m_fitsuite;
 
 };
diff --git a/GUI/coregui/Views/FitWidgets/RunFitManager.cpp b/GUI/coregui/Views/FitWidgets/RunFitManager.cpp
index 341e7e4b12b..be9ae56d6f3 100644
--- a/GUI/coregui/Views/FitWidgets/RunFitManager.cpp
+++ b/GUI/coregui/Views/FitWidgets/RunFitManager.cpp
@@ -19,11 +19,13 @@
 #include "FitSuite.h"
 #include <QThread>
 #include <memory>
+#include <QDebug>
 
 RunFitManager::RunFitManager(QObject *parent)
     : QObject(parent)
     , m_fitSuite(nullptr)
     , m_is_fit_running{false}
+    , m_duration(0)
 {
 }
 
@@ -51,7 +53,7 @@ void RunFitManager::runFitting()
 
     connect(fw, SIGNAL(error(QString)), this, SLOT(intern_error(QString)));
 
-    connect(fw, SIGNAL(finished()), this, SLOT(intern_workerFinished()));
+    connect(fw, SIGNAL(finished(int)), this, SLOT(intern_workerFinished(int)));
 
     // delete fitting worker and thread when done
     connect(fw, SIGNAL(finished()), fw, SLOT(deleteLater()));
@@ -61,6 +63,13 @@ void RunFitManager::runFitting()
     thread->start();
 }
 
+//! Returns duration of fit in msec.
+
+int RunFitManager::getDuration()
+{
+    return m_duration;
+}
+
 void RunFitManager::interruptFitting()
 {
     if (m_is_fit_running) {
@@ -68,9 +77,10 @@ void RunFitManager::interruptFitting()
     }
 }
 
-void RunFitManager::intern_workerFinished()
+void RunFitManager::intern_workerFinished(int duration)
 {
     m_is_fit_running = false;
+    m_duration = duration;
     m_fitSuite.reset();
     emit finishedFitting();
 }
diff --git a/GUI/coregui/Views/FitWidgets/RunFitManager.h b/GUI/coregui/Views/FitWidgets/RunFitManager.h
index 23be3005607..7ebcb631ab2 100644
--- a/GUI/coregui/Views/FitWidgets/RunFitManager.h
+++ b/GUI/coregui/Views/FitWidgets/RunFitManager.h
@@ -35,6 +35,8 @@ public:
 
     void runFitting();
 
+    int getDuration();
+
 public slots:
     void interruptFitting();
 
@@ -47,7 +49,7 @@ signals:
 
 // only used by manager for communication with FittingWorker
 private slots:
-    void intern_workerFinished();
+    void intern_workerFinished(int duration);
 
     void intern_workerStarted();
 
@@ -59,6 +61,7 @@ signals:
 private:
     std::shared_ptr<FitSuite> m_fitSuite;
     std::atomic<bool> m_is_fit_running;
+    int m_duration;
 };
 
 #endif
diff --git a/GUI/coregui/utils/GUIHelpers.cpp b/GUI/coregui/utils/GUIHelpers.cpp
index 04847aff7e6..7dce5a0c5f1 100644
--- a/GUI/coregui/utils/GUIHelpers.cpp
+++ b/GUI/coregui/utils/GUIHelpers.cpp
@@ -25,6 +25,7 @@
 #include <QMessageBox>
 #include <QPushButton>
 #include <QFileInfo>
+#include <QDateTime>
 #include <QDebug>
 
 namespace GUIHelpers {
@@ -213,5 +214,10 @@ QString fileDir(const QString &fileName)
     return QString();
 }
 
+QString currentDateTime()
+{
+    return QDateTime::currentDateTime().toString("yyyy.MM.dd hh:mm:ss");;
+}
+
 
 } // namespace GUIHelpers
diff --git a/GUI/coregui/utils/GUIHelpers.h b/GUI/coregui/utils/GUIHelpers.h
index 3f4b7f9ec43..f7a9b0e486c 100644
--- a/GUI/coregui/utils/GUIHelpers.h
+++ b/GUI/coregui/utils/GUIHelpers.h
@@ -68,6 +68,8 @@ BA_CORE_API_ bool parseVersion(const QString &version, int &major_num, int &mino
 
 BA_CORE_API_ bool isVersionMatchMinimal(const QString &version, const QString &minimal_version);
 
+BA_CORE_API_ QString currentDateTime();
+
 template<class T, class... Ts> std::unique_ptr<T> make_unique(Ts&&... params)
 {
     return std::unique_ptr<T>(new T(std::forward<Ts>(params)...));
-- 
GitLab