From 25c69fd80fba39b603ce61e53a92c8765ec4d4eb Mon Sep 17 00:00:00 2001
From: Mikhail Svechnikov <m.svechnikov@fz-juelich.de>
Date: Tue, 27 Sep 2022 12:46:52 +0200
Subject: [PATCH] JobModel: jobs are unique pointers

---
 GUI/Model/Model/JobModel.cpp  | 24 ++++++++++--------------
 GUI/Model/Model/JobModel.h    |  2 +-
 GUI/View/Job/JobListModel.cpp |  1 -
 3 files changed, 11 insertions(+), 16 deletions(-)

diff --git a/GUI/Model/Model/JobModel.cpp b/GUI/Model/Model/JobModel.cpp
index 33d7a38a3ed..71778984d5a 100644
--- a/GUI/Model/Model/JobModel.cpp
+++ b/GUI/Model/Model/JobModel.cpp
@@ -52,13 +52,6 @@ JobModel::JobModel(QObject* parent)
 JobModel::~JobModel()
 {    
     delete m_queue_data;
-
-#ifdef NEW_JOB_MODEL
-    // jobs should be deleted explicitly, because they are not in tree anymore
-    qInfo() << "destruction of JobModel";
-    for(auto* jobItem : m_jobItems)
-        delete jobItem;
-#endif
 }
 
 JobItem* JobModel::getJobItemForIdentifier(const QString& identifier)
@@ -73,10 +66,10 @@ JobItem* JobModel::getJobItemForIdentifier(const QString& identifier)
 #ifdef NEW_JOB_MODEL
 JobItem *JobModel::createJobItem()
 {
-    JobItem* jobItem = new JobItem();
+    auto jobItem = std::make_unique<JobItem>();
     jobItem->setParentAndModel(nullptr, this);
-    m_jobItems.push_back(jobItem);
-    return jobItem;
+    m_jobItems.push_back(std::move(jobItem));
+    return m_jobItems.back().get();
 }
 #endif
 
@@ -116,7 +109,11 @@ JobItem* JobModel::addJob(const MultiLayerItem* sampleItem, const InstrumentItem
 QVector<JobItem*> JobModel::jobItems() const
 {
 #ifdef NEW_JOB_MODEL
-    return m_jobItems;
+    // QVector representation of unique pointers from m_jobItems
+    QVector<JobItem*> items(m_jobItems.size());
+    for(int i=0; i<items.size(); i++)
+        items[i] = m_jobItems[i].get();
+    return items;
 #else
     return topItems<JobItem>();
 #endif
@@ -207,7 +204,6 @@ void JobModel::readFrom(QXmlStreamReader* reader, MessageService* messageService
     beginResetModel();
     clear();
 
-//    GUI::Session::XML::readItems(reader, m_root_item, QString(), messageService);
     while (reader->readNextStartElement()) {
 
         if (reader->name().toString() == GUI::Session::XML::ItemTag) {
@@ -262,8 +258,8 @@ void JobModel::removeJob(JobItem* jobItem)
     m_queue_data->removeJob(jobItem->getIdentifier());
 
 #ifdef NEW_JOB_MODEL
-    delete jobItem;
-    m_jobItems.removeOne(jobItem);
+    int index = jobItems().indexOf(jobItem);
+    m_jobItems.erase(m_jobItems.begin() + index);
 #else
     removeRows(jobItem->index().row(), 1, QModelIndex());
 #endif
diff --git a/GUI/Model/Model/JobModel.h b/GUI/Model/Model/JobModel.h
index d459c56b15c..e99481475e6 100644
--- a/GUI/Model/Model/JobModel.h
+++ b/GUI/Model/Model/JobModel.h
@@ -68,7 +68,7 @@ private:
     QString generateJobName();
     JobQueueData* m_queue_data;
 #ifdef NEW_JOB_MODEL
-    QList<JobItem*> m_jobItems;
+    std::vector<std::unique_ptr<JobItem>> m_jobItems;
 #endif
 };
 
diff --git a/GUI/View/Job/JobListModel.cpp b/GUI/View/Job/JobListModel.cpp
index 1571e025762..6949cbcc375 100644
--- a/GUI/View/Job/JobListModel.cpp
+++ b/GUI/View/Job/JobListModel.cpp
@@ -101,7 +101,6 @@ void JobListModel::emitJobListModelChanged(JobItem* job)
         QModelIndex idx = index(i, 0);
         emit dataChanged(idx, idx);
     }
-//    qInfo() << "emitJobListModelChanged";
 }
 
 //--------------------------------------------------------------------------------------------------
-- 
GitLab