From 148c693e1afb72a2fa3eac335d9ead0cb5babb42 Mon Sep 17 00:00:00 2001
From: Matthias Puchner <github@mpuchner.de>
Date: Thu, 2 Dec 2021 16:17:50 +0100
Subject: [PATCH] reduce SessionModel usage for SampleModel

---
 GUI/Model/From/GUIDomainSampleVisitor.cpp | 2 +-
 GUI/Model/From/SampleListModel.cpp        | 6 ++++--
 GUI/Model/Sample/SampleModel.cpp          | 5 +++++
 GUI/Model/Sample/SampleModel.h            | 2 ++
 GUI/View/SampleDesigner/ScriptPanel.cpp   | 2 +-
 GUI/View/Toplevel/SimulationView.cpp      | 2 +-
 Tests/Unit/GUI/TestMultiLayerItem.cpp     | 8 ++++----
 7 files changed, 18 insertions(+), 9 deletions(-)

diff --git a/GUI/Model/From/GUIDomainSampleVisitor.cpp b/GUI/Model/From/GUIDomainSampleVisitor.cpp
index b8702754c15..f5de5e70078 100644
--- a/GUI/Model/From/GUIDomainSampleVisitor.cpp
+++ b/GUI/Model/From/GUIDomainSampleVisitor.cpp
@@ -132,7 +132,7 @@ void GUIDomainSampleVisitor::visit(const Layer* node)
 
 void GUIDomainSampleVisitor::visit(const MultiLayer* node)
 {
-    auto* multilayer_item = m_sampleModel->insertItem<MultiLayerItem>();
+    auto* multilayer_item = m_sampleModel->addMultiLayer();
     multilayer_item->setItemName(node->sampleName().c_str());
     multilayer_item->crossCorrLength().set(node->crossCorrLength());
     multilayer_item->setExternalField(node->externalField());
diff --git a/GUI/Model/From/SampleListModel.cpp b/GUI/Model/From/SampleListModel.cpp
index 31898bd8e16..09efed232d9 100644
--- a/GUI/Model/From/SampleListModel.cpp
+++ b/GUI/Model/From/SampleListModel.cpp
@@ -13,6 +13,7 @@
 //  ************************************************************************************************
 
 #include "GUI/Model/From/SampleListModel.h"
+#include "Base/Util/Assert.h"
 #include "GUI/Model/From/GUIExamplesFactory.h"
 #include "GUI/Model/Sample/MultiLayerItem.h"
 #include "GUI/Model/Sample/SampleModel.h"
@@ -32,7 +33,8 @@ SampleListModel::SampleListModel(QObject* parent, SampleModel* model)
 
 MultiLayerItem* SampleListModel::topMostItem() const
 {
-    return m_sampleModel->topItem<MultiLayerItem>();
+    ASSERT(!m_sampleModel->multiLayerItems().isEmpty());
+    return m_sampleModel->multiLayerItems().first();
 }
 
 int SampleListModel::rowCount(const QModelIndex& parent) const
@@ -131,7 +133,7 @@ QModelIndex SampleListModel::createSample()
 
     const int row = m_sampleModel->multiLayerItems().size();
     beginInsertRows(QModelIndex(), row, row);
-    auto* multilayer_item = m_sampleModel->insertItem<MultiLayerItem>();
+    auto* multilayer_item = m_sampleModel->addMultiLayer();
     multilayer_item->setItemName(suggestName(topItemNames(m_sampleModel), "Sample"));
     endInsertRows();
     return indexForItem(multilayer_item);
diff --git a/GUI/Model/Sample/SampleModel.cpp b/GUI/Model/Sample/SampleModel.cpp
index fb582f1bc54..c5d28d0cd74 100644
--- a/GUI/Model/Sample/SampleModel.cpp
+++ b/GUI/Model/Sample/SampleModel.cpp
@@ -77,6 +77,11 @@ QVector<ItemWithMaterial*> SampleModel::itemsWithMaterial() const
     return result;
 }
 
+MultiLayerItem* SampleModel::addMultiLayer()
+{
+    return insertItem<MultiLayerItem>();
+}
+
 void SampleModel::removeMultiLayer(MultiLayerItem* item)
 {
     removeItem(item);
diff --git a/GUI/Model/Sample/SampleModel.h b/GUI/Model/Sample/SampleModel.h
index e923341fc2a..591441a369e 100644
--- a/GUI/Model/Sample/SampleModel.h
+++ b/GUI/Model/Sample/SampleModel.h
@@ -38,6 +38,8 @@ public:
     //! Returns vector of SessionItems having MaterialProperty on board.
     QVector<ItemWithMaterial*> itemsWithMaterial() const;
 
+    //! Adds a multilayer and returns the new item.
+    MultiLayerItem* addMultiLayer();
     void removeMultiLayer(MultiLayerItem* item);
 
 signals:
diff --git a/GUI/View/SampleDesigner/ScriptPanel.cpp b/GUI/View/SampleDesigner/ScriptPanel.cpp
index db157586f30..427eb3e3ae3 100644
--- a/GUI/View/SampleDesigner/ScriptPanel.cpp
+++ b/GUI/View/SampleDesigner/ScriptPanel.cpp
@@ -111,7 +111,7 @@ QString ScriptPanel::generateCodeSnippet()
     m_cautionSign->clear();
     QString result;
 
-    for (const MultiLayerItem* sampleItem : m_sampleModel->topItems<MultiLayerItem>()) {
+    for (const MultiLayerItem* sampleItem : m_sampleModel->multiLayerItems()) {
         try {
             auto multilayer = GUI::Model::DomainObjectBuilder::buildMultiLayer(*sampleItem);
             if (!result.isEmpty())
diff --git a/GUI/View/Toplevel/SimulationView.cpp b/GUI/View/Toplevel/SimulationView.cpp
index 61ce8f53090..1e5a2f3c1d0 100644
--- a/GUI/View/Toplevel/SimulationView.cpp
+++ b/GUI/View/Toplevel/SimulationView.cpp
@@ -236,7 +236,7 @@ void SimulationView::updateFunctionalityNarrowing()
 
 QVector<MultiLayerItem*> SimulationView::multiLayerItems() const
 {
-    return m_document->sampleModel()->topItems<MultiLayerItem>();
+    return m_document->sampleModel()->multiLayerItems();
 }
 
 QVector<InstrumentItem*> SimulationView::instrumentItems() const
diff --git a/Tests/Unit/GUI/TestMultiLayerItem.cpp b/Tests/Unit/GUI/TestMultiLayerItem.cpp
index d9bf4b176f1..209171ce56c 100644
--- a/Tests/Unit/GUI/TestMultiLayerItem.cpp
+++ b/Tests/Unit/GUI/TestMultiLayerItem.cpp
@@ -16,7 +16,7 @@ TEST_F(TestMultiLayerItem, twoLayerSystem)
 {
     SampleModel model;
 
-    auto* multilayer = model.insertItem<MultiLayerItem>();
+    auto* multilayer = model.addMultiLayer();
     auto* top = model.insertItem<LayerItem>(multilayer);
     auto* bottom = model.insertItem<LayerItem>(multilayer);
 
@@ -45,7 +45,7 @@ TEST_F(TestMultiLayerItem, threeLayerSystem)
 {
     SampleModel model;
 
-    auto* multilayer = model.insertItem<MultiLayerItem>();
+    auto* multilayer = model.addMultiLayer();
     auto* top = model.insertItem<LayerItem>(multilayer);
     auto* middle = model.insertItem<LayerItem>(multilayer);
     auto* bottom = model.insertItem<LayerItem>(multilayer);
@@ -80,7 +80,7 @@ TEST_F(TestMultiLayerItem, movingMiddleLayerOnTop)
 {
     SampleModel model;
 
-    auto* multilayer = model.insertItem<MultiLayerItem>();
+    auto* multilayer = model.addMultiLayer();
     auto* top = model.insertItem<LayerItem>(multilayer);
     auto* middle = model.insertItem<LayerItem>(multilayer);
     auto* bottom = model.insertItem<LayerItem>(multilayer);
@@ -128,7 +128,7 @@ TEST_F(TestMultiLayerItem, movingLayerOnCanvas)
 {
     SampleModel model;
 
-    auto* multilayer = model.insertItem<MultiLayerItem>();
+    auto* multilayer = model.addMultiLayer();
     auto* top = model.insertItem<LayerItem>(multilayer);
     model.insertItem<LayerItem>(multilayer);
 
-- 
GitLab