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