From 3ff704a20a1bf8e1379ec9e4d8d30a623874afb0 Mon Sep 17 00:00:00 2001
From: "Joachim Wuttke (o)" <j.wuttke@fz-juelich.de>
Date: Mon, 26 Feb 2024 10:18:47 +0100
Subject: [PATCH] Samples: rm/cp fcts as for instruments

---
 GUI/Model/Sample/SamplesSet.cpp    |  3 ++
 GUI/Model/Sample/SamplesSet.h      | 13 +++++-
 GUI/View/List/SamplesQListView.cpp | 12 -----
 GUI/View/List/SamplesQListView.h   |  2 -
 GUI/View/List/SamplesQModel.cpp    | 44 +++++++++++-------
 GUI/View/List/SamplesQModel.h      |  8 ++--
 GUI/View/Views/SampleView.cpp      | 75 ++++++++++++++++++------------
 GUI/View/Views/SampleView.h        | 11 +++--
 8 files changed, 96 insertions(+), 72 deletions(-)

diff --git a/GUI/Model/Sample/SamplesSet.cpp b/GUI/Model/Sample/SamplesSet.cpp
index 49796667263..8dbfad6678f 100644
--- a/GUI/Model/Sample/SamplesSet.cpp
+++ b/GUI/Model/Sample/SamplesSet.cpp
@@ -27,6 +27,9 @@ const QString CurrentIndex("CurrentIndex");
 } // namespace Tag
 } // namespace
 
+SamplesSet::SamplesSet() = default;
+SamplesSet::~SamplesSet() = default;
+
 QStringList SamplesSet::sampleNames() const
 {
     QStringList existingNames;
diff --git a/GUI/Model/Sample/SamplesSet.h b/GUI/Model/Sample/SamplesSet.h
index 019b6b0ca72..eb71f9e4c5f 100644
--- a/GUI/Model/Sample/SamplesSet.h
+++ b/GUI/Model/Sample/SamplesSet.h
@@ -16,18 +16,27 @@
 #define BORNAGAIN_GUI_MODEL_SAMPLE_SAMPLESSET_H
 
 #include "Base/Types/VectorWC.h"
+#include <QObject>
 #include <QXmlStreamReader>
 
 class SampleItem;
 
 //! Main model to hold sample items.
 
-class SamplesSet : public VectorWC<SampleItem> {
+class SamplesSet : public QObject, public VectorWC<SampleItem> {
+    Q_OBJECT
 public:
-    QStringList sampleNames() const;
+    SamplesSet();
+    ~SamplesSet();
 
     void writeTo(QXmlStreamWriter* w) const;
     void readFrom(QXmlStreamReader* r);
+
+    QStringList sampleNames() const;
+
+signals:
+    void setChanged() const;
+    void currentModified() const;
 };
 
 #endif // BORNAGAIN_GUI_MODEL_SAMPLE_SAMPLESSET_H
diff --git a/GUI/View/List/SamplesQListView.cpp b/GUI/View/List/SamplesQListView.cpp
index 8aa69cf341e..fc1d20b9e07 100644
--- a/GUI/View/List/SamplesQListView.cpp
+++ b/GUI/View/List/SamplesQListView.cpp
@@ -71,15 +71,3 @@ void SamplesQListView::onCurrentChanged(const QModelIndex& index)
     gDoc->samplesModifier()->setCurrentIndex(index.row());
     emit currentSampleChanged(m_model->itemForIndex(index));
 }
-
-void SamplesQListView::removeSample(SampleItem* item)
-{
-    m_model->removeSample(item);
-    gDoc->setModified();
-}
-
-void SamplesQListView::copySample(SampleItem* item)
-{
-    m_model->copySample(item);
-    gDoc->setModified();
-}
diff --git a/GUI/View/List/SamplesQListView.h b/GUI/View/List/SamplesQListView.h
index fd583679e0b..e4f62497479 100644
--- a/GUI/View/List/SamplesQListView.h
+++ b/GUI/View/List/SamplesQListView.h
@@ -31,8 +31,6 @@ public:
                                  const QString& description);
     void importSampleFromPython();
     void onCurrentChanged(const QModelIndex& index);
-    void removeSample(SampleItem* item);
-    void copySample(SampleItem* item);
 signals:
     void currentSampleChanged(SampleItem* current);
 
diff --git a/GUI/View/List/SamplesQModel.cpp b/GUI/View/List/SamplesQModel.cpp
index bbc89e33cc8..45c281acd28 100644
--- a/GUI/View/List/SamplesQModel.cpp
+++ b/GUI/View/List/SamplesQModel.cpp
@@ -86,29 +86,23 @@ QModelIndex SamplesQModel::indexForItem(SampleItem* item) const
     return {};
 }
 
-void SamplesQModel::removeSample(SampleItem* item)
+void SamplesQModel::removeSample()
 {
-    QModelIndex index = indexForItem(item);
-    if (!index.isValid())
-        return;
-
-    beginRemoveRows(index.parent(), index.row(), index.row());
-    set()->delete_element(item);
+    const size_t row = set()->currentIndex();
+    ASSERT(row != size_t(-1));
+    beginRemoveRows({}, row, row);
+    set()->delete_current();
     endRemoveRows();
+
+    emit set()->setChanged();
 }
 
-QModelIndex SamplesQModel::copySample(SampleItem* item)
+QModelIndex SamplesQModel::copySample()
 {
-    ASSERT(item);
-    const QStringList existingNames = set()->sampleNames();
-
-    const int row = set()->size();
-    beginInsertRows(QModelIndex(), row, row);
-    SampleItem* copied_item = item->clone();
-    copied_item->setName(GUI::Util::String::suggestName(existingNames, item->name()));
-    set()->push_back(copied_item);
-    endInsertRows();
-    return indexForItem(copied_item);
+    const SampleItem* t = set()->currentItem();
+    ASSERT(t);
+    SampleItem* t2 = t->clone();
+    return pushSample(t2);
 }
 
 QModelIndex SamplesQModel::createSample()
@@ -128,6 +122,20 @@ QModelIndex SamplesQModel::createSample()
     return indexForItem(t);
 }
 
+QModelIndex SamplesQModel::pushSample(SampleItem* t)
+{
+    if (!t)
+        return {};
+    const size_t row = set()->size();
+    beginInsertRows({}, row, row);
+    set()->push_back(t);
+    endInsertRows();
+
+    emit set()->setChanged();
+
+    return createIndex(row, 0);
+}
+
 QModelIndex SamplesQModel::createSampleFromExamples(const QString& className, const QString& title,
                                                     const QString& description)
 {
diff --git a/GUI/View/List/SamplesQModel.h b/GUI/View/List/SamplesQModel.h
index 17dadc98505..54986f0a745 100644
--- a/GUI/View/List/SamplesQModel.h
+++ b/GUI/View/List/SamplesQModel.h
@@ -34,11 +34,9 @@ public:
     const SampleItem* itemForIndex(const QModelIndex& index) const;
     QModelIndex indexForItem(SampleItem* item) const;
 
-    //! Remove the given sample. nullptr is allowed.
-    void removeSample(SampleItem* item);
-
-    //! Copy the given sample.
-    QModelIndex copySample(SampleItem* item);
+    void removeSample();
+    QModelIndex copySample();
+    QModelIndex pushSample(SampleItem*);
 
     //! Create a new sample (sample) and return the index of it.
     QModelIndex createSample();
diff --git a/GUI/View/Views/SampleView.cpp b/GUI/View/Views/SampleView.cpp
index 739c45026f0..51e78045471 100644
--- a/GUI/View/Views/SampleView.cpp
+++ b/GUI/View/Views/SampleView.cpp
@@ -29,6 +29,7 @@
 #include "GUI/View/Realspace/RealspaceWidget.h"
 #include "GUI/View/Sample/SampleEditor.h"
 #include "GUI/View/Sample/ScriptPanel.h"
+#include "GUI/View/Setup/FrameActions.h"
 #include "GUI/View/Widget/StyledToolbar.h"
 #include <QBoxLayout>
 #include <QCheckBox>
@@ -52,6 +53,7 @@ SampleView::SampleView()
     auto* toolbar = new StyledToolbar;
     layout->addWidget(toolbar);
     toolbar->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
+    setToolbarActions(toolbar);
 
     // Everything below
     auto* hLayout = new QHBoxLayout;
@@ -94,7 +96,38 @@ SampleView::SampleView()
         m_realspace_panel->setMaximumHeight(QWIDGETSIZE_MAX);
     });
 
-    //... Toolbar actions
+    //... Finish
+
+    connect(m_qlistview, &SamplesQListView::currentSampleChanged, editor,
+            &SampleEditor::setCurrentSample);
+
+    connect(m_qlistview, &SamplesQListView::currentSampleChanged,
+            [&](SampleItem* m) { onRequestViewInRealspace(m); });
+
+    connect(m_qlistview, &SamplesQListView::currentSampleChanged, scriptPanel,
+            &ScriptPanel::setCurrentSample);
+
+    connect(editor, &SampleEditor::modified, scriptPanel, &ScriptPanel::onSampleModified);
+
+    connect(editor, &SampleEditor::requestViewInRealspace, this,
+            &SampleView::onRequestViewInRealspace);
+
+    connect(editor, &SampleEditor::aboutToRemoveItem, this, &SampleView::onAboutToRemoveItem);
+
+    connect(editor, &SampleEditor::modified, m_realspace_panel->widget(),
+            &RealspaceWidget::updateScene);
+
+    connect(editor, &SampleEditor::modified, gDoc.get(), &ProjectDocument::setModified);
+}
+
+SampleView::~SampleView()
+{
+    saveSplitterPos();
+}
+
+void SampleView::setToolbarActions(QToolBar* toolbar)
+{
+    //... New sample action
 
     auto* new_sample_action = new QAction("New", this);
     new_sample_action->setIcon(QIcon(":/images/shape-square-plus.svg"));
@@ -104,6 +137,18 @@ SampleView::SampleView()
     connect(new_sample_action, &QAction::triggered, m_qlistview,
             &SamplesQListView::createNewSample);
 
+    //... Copy and remove actions
+
+    m_rm_action = ActionFactory::createRemoveAction("sample", this);
+    toolbar->addAction(m_rm_action);
+    connect(m_rm_action, &QAction::triggered, m_qlistmodel, &SamplesQModel::removeSample);
+
+    m_cp_action = ActionFactory::createCopyAction("sample", this);
+    toolbar->addAction(m_cp_action);
+    connect(m_cp_action, &QAction::triggered, m_qlistmodel, &SamplesQModel::copySample);
+
+    //... Save and load actions
+
 #ifdef BORNAGAIN_PYTHON
     auto* import_sample_action = new QAction("Import", this);
     import_sample_action->setIcon(QIcon(":/images/import.svg"));
@@ -134,34 +179,6 @@ SampleView::SampleView()
             m_qlistview->createSampleFromLibrary(exampleName, title, description);
         });
     }
-
-    //... Finish
-
-    connect(m_qlistview, &SamplesQListView::currentSampleChanged, editor,
-            &SampleEditor::setCurrentSample);
-
-    connect(m_qlistview, &SamplesQListView::currentSampleChanged,
-            [&](SampleItem* m) { onRequestViewInRealspace(m); });
-
-    connect(m_qlistview, &SamplesQListView::currentSampleChanged, scriptPanel,
-            &ScriptPanel::setCurrentSample);
-
-    connect(editor, &SampleEditor::modified, scriptPanel, &ScriptPanel::onSampleModified);
-
-    connect(editor, &SampleEditor::requestViewInRealspace, this,
-            &SampleView::onRequestViewInRealspace);
-
-    connect(editor, &SampleEditor::aboutToRemoveItem, this, &SampleView::onAboutToRemoveItem);
-
-    connect(editor, &SampleEditor::modified, m_realspace_panel->widget(),
-            &RealspaceWidget::updateScene);
-
-    connect(editor, &SampleEditor::modified, gDoc.get(), &ProjectDocument::setModified);
-}
-
-SampleView::~SampleView()
-{
-    saveSplitterPos();
 }
 
 void SampleView::applySplitterPos()
diff --git a/GUI/View/Views/SampleView.h b/GUI/View/Views/SampleView.h
index 16db6081e34..910a0dedabb 100644
--- a/GUI/View/Views/SampleView.h
+++ b/GUI/View/Views/SampleView.h
@@ -15,10 +15,11 @@
 #ifndef BORNAGAIN_GUI_VIEW_VIEWS_SAMPLEVIEW_H
 #define BORNAGAIN_GUI_VIEW_VIEWS_SAMPLEVIEW_H
 
-#include <QShowEvent>
+#include <QAction>
 #include <QWidget>
 
 class Item3D;
+class QToolBar;
 class RealspacePanel;
 class SamplesQListView;
 class SamplesQModel;
@@ -30,9 +31,8 @@ public:
     ~SampleView();
 
 private:
-    //! Show the item in the real space view
-    //!
-    //! If the real space view is not visible at the moment, it will be shown.
+    void setToolbarActions(QToolBar* toolbar);
+    void updateActions();
     void onRequestViewInRealspace(Item3D* item);
 
     void onAboutToRemoveItem(Item3D* item);
@@ -43,6 +43,9 @@ private:
     SamplesQModel* m_qlistmodel;
     SamplesQListView* m_qlistview;
     RealspacePanel* m_realspace_panel;
+
+    QAction* m_rm_action;
+    QAction* m_cp_action;
 };
 
 #endif // BORNAGAIN_GUI_VIEW_VIEWS_SAMPLEVIEW_H
-- 
GitLab