From 94fbbe20f2beb9a0547043651a9c5dc6aa7225cf Mon Sep 17 00:00:00 2001
From: Matthias <github@mpuchner.de>
Date: Mon, 8 Feb 2021 17:09:01 +0100
Subject: [PATCH] Simplify action handling; simplify UI by in-place editing of
 real data items

---
 GUI/coregui/Models/RealDataModel.cpp          | 28 +++++++---
 GUI/coregui/Models/RealDataModel.h            |  5 +-
 .../RealDataPropertiesWidget.cpp              | 31 +----------
 .../RealDataPropertiesWidget.h                |  3 --
 .../RealDataSelectorActions.cpp               | 27 ----------
 .../RealDataSelectorActions.h                 |  2 -
 .../RealDataSelectorWidget.cpp                | 53 ++++++++++++++++++-
 .../RealDataSelectorWidget.h                  |  3 ++
 8 files changed, 80 insertions(+), 72 deletions(-)

diff --git a/GUI/coregui/Models/RealDataModel.cpp b/GUI/coregui/Models/RealDataModel.cpp
index d16f8321cd3..139220d0417 100644
--- a/GUI/coregui/Models/RealDataModel.cpp
+++ b/GUI/coregui/Models/RealDataModel.cpp
@@ -21,13 +21,6 @@ RealDataModel::RealDataModel(QObject* parent) : SessionModel(SessionXML::RealDat
     setObjectName(SessionXML::RealDataModelTag);
 }
 
-// Qt::ItemFlags RealDataModel::flags(const QModelIndex &index) const
-//{
-//    Qt::ItemFlags result_flags =  SessionModel::flags(index);
-//    result_flags |= Qt::ItemIsEditable;
-//    return result_flags;
-//}
-
 QVector<SessionItem*> RealDataModel::nonXMLData() const
 {
     QVector<SessionItem*> result;
@@ -41,3 +34,24 @@ QVector<SessionItem*> RealDataModel::nonXMLData() const
 
     return result;
 }
+
+Qt::ItemFlags RealDataModel::flags(const QModelIndex& index) const
+{
+    return SessionModel::flags(index) | Qt::ItemIsEditable;
+}
+
+bool RealDataModel::setData(const QModelIndex& index, const QVariant& value, int role)
+{
+    if (!index.isValid())
+        return false;
+
+    if (role == Qt::EditRole) {
+        SessionItem* item = itemForIndex(index);
+        if (item) {
+            item->setItemName(value.toString());
+            return true;
+        }
+    }
+
+    return SessionModel::setData(index, value, role);
+}
diff --git a/GUI/coregui/Models/RealDataModel.h b/GUI/coregui/Models/RealDataModel.h
index c84a3b3535b..dd26f55623c 100644
--- a/GUI/coregui/Models/RealDataModel.h
+++ b/GUI/coregui/Models/RealDataModel.h
@@ -24,9 +24,10 @@ class RealDataModel : public SessionModel {
 
 public:
     explicit RealDataModel(QObject* parent = 0);
-    //    Qt::ItemFlags flags(const QModelIndex &index) const;
 
-    QVector<SessionItem*> nonXMLData() const override;
+    virtual QVector<SessionItem*> nonXMLData() const override;
+    virtual Qt::ItemFlags flags(const QModelIndex& index) const override;
+    virtual bool setData(const QModelIndex& index, const QVariant& value, int role) override;
 };
 
 #endif // BORNAGAIN_GUI_COREGUI_MODELS_REALDATAMODEL_H
diff --git a/GUI/coregui/Views/ImportDataWidgets/RealDataPropertiesWidget.cpp b/GUI/coregui/Views/ImportDataWidgets/RealDataPropertiesWidget.cpp
index e0f6fc1d1ab..75b54ab76c4 100644
--- a/GUI/coregui/Views/ImportDataWidgets/RealDataPropertiesWidget.cpp
+++ b/GUI/coregui/Views/ImportDataWidgets/RealDataPropertiesWidget.cpp
@@ -22,17 +22,9 @@
 #include <QLineEdit>
 #include <QVBoxLayout>
 
-namespace {
-const QString instrumentNameTooltip = "Name of real data";
-const QString selectorTooltip = "Select instrument to link with real data";
-} // namespace
-
 RealDataPropertiesWidget::RealDataPropertiesWidget(QWidget* parent)
     : QWidget(parent)
     , m_linkManager(new LinkInstrumentManager(this))
-    , m_dataNameMapper(new QDataWidgetMapper(this))
-    , m_dataNameLabel(new QLabel("Dataset"))
-    , m_dataNameEdit(new QLineEdit)
     , m_instrumentLabel(new QLabel("Linked instrument"))
     , m_instrumentCombo(new QComboBox)
     , m_currentDataItem(0)
@@ -44,14 +36,8 @@ RealDataPropertiesWidget::RealDataPropertiesWidget(QWidget* parent)
     mainLayout->setMargin(5);
     mainLayout->setSpacing(2);
 
-    m_dataNameLabel->setToolTip(instrumentNameTooltip);
-    m_dataNameEdit->setToolTip(instrumentNameTooltip);
-    m_instrumentLabel->setToolTip(selectorTooltip);
-    m_instrumentCombo->setToolTip(selectorTooltip);
+    m_instrumentCombo->setToolTip("Select instrument to link with real data");
 
-    mainLayout->addWidget(m_dataNameLabel);
-    mainLayout->addWidget(m_dataNameEdit);
-    mainLayout->addSpacing(5);
     mainLayout->addWidget(m_instrumentLabel);
     mainLayout->addWidget(m_instrumentCombo);
 
@@ -77,8 +63,6 @@ void RealDataPropertiesWidget::setModels(InstrumentModel* instrumentModel,
 
 void RealDataPropertiesWidget::setItem(SessionItem* item)
 {
-    m_dataNameMapper->clearMapping();
-
     if (item == m_currentDataItem)
         return;
 
@@ -100,13 +84,6 @@ void RealDataPropertiesWidget::setItem(SessionItem* item)
     m_currentDataItem->mapper()->setOnItemDestroy([this](SessionItem*) { m_currentDataItem = 0; },
                                                   this);
 
-    // Initialize QLineEdit to edit itemName directly in the model
-    m_dataNameMapper->setModel(item->model());
-    m_dataNameMapper->setRootIndex(item->index());
-    m_dataNameMapper->setCurrentModelIndex(item->getItem(SessionItem::P_NAME)->index());
-    m_dataNameMapper->addMapping(m_dataNameEdit, 1);
-    m_dataNameMapper->toFirst();
-
     // Set combo selector to show linked instrument
     setComboToIdentifier(item->getItemValue(RealDataItem::P_INSTRUMENT_ID).toString());
 }
@@ -195,12 +172,8 @@ void RealDataPropertiesWidget::setComboConnected(bool isConnected)
 
 void RealDataPropertiesWidget::setPropertiesEnabled(bool enabled)
 {
-    m_dataNameLabel->setEnabled(enabled);
-    m_dataNameEdit->setEnabled(enabled);
     m_instrumentLabel->setEnabled(enabled);
     m_instrumentCombo->setEnabled(enabled);
-    if (enabled == false) {
-        m_dataNameEdit->clear();
+    if (!enabled)
         m_instrumentCombo->setCurrentIndex(0);
-    }
 }
diff --git a/GUI/coregui/Views/ImportDataWidgets/RealDataPropertiesWidget.h b/GUI/coregui/Views/ImportDataWidgets/RealDataPropertiesWidget.h
index 8806ca88c45..6f5d81384ed 100644
--- a/GUI/coregui/Views/ImportDataWidgets/RealDataPropertiesWidget.h
+++ b/GUI/coregui/Views/ImportDataWidgets/RealDataPropertiesWidget.h
@@ -52,9 +52,6 @@ private:
     void setPropertiesEnabled(bool enabled);
 
     LinkInstrumentManager* m_linkManager;
-    QDataWidgetMapper* m_dataNameMapper;
-    QLabel* m_dataNameLabel;
-    QLineEdit* m_dataNameEdit;
     QLabel* m_instrumentLabel;
     QComboBox* m_instrumentCombo;
     QString m_current_id;
diff --git a/GUI/coregui/Views/ImportDataWidgets/RealDataSelectorActions.cpp b/GUI/coregui/Views/ImportDataWidgets/RealDataSelectorActions.cpp
index bc26fb7d199..2f57d46a657 100644
--- a/GUI/coregui/Views/ImportDataWidgets/RealDataSelectorActions.cpp
+++ b/GUI/coregui/Views/ImportDataWidgets/RealDataSelectorActions.cpp
@@ -222,33 +222,6 @@ void RealDataSelectorActions::onRotateDataRequest()
     QApplication::restoreOverrideCursor();
 }
 
-void RealDataSelectorActions::onContextMenuRequest(const QPoint& point,
-                                                   const QModelIndex& indexAtPoint)
-{
-    QMenu menu;
-    menu.setToolTipsVisible(true);
-
-    setAllActionsEnabled(indexAtPoint.isValid());
-
-    m_import2dDataAction->setEnabled(true);
-    m_import1dDataAction->setEnabled(true);
-
-    menu.addAction(m_removeDataAction);
-    menu.addAction(m_rotateDataAction);
-    menu.addSeparator();
-    menu.addAction(m_import2dDataAction);
-    menu.addAction(m_import1dDataAction);
-    menu.exec(point);
-}
-
-void RealDataSelectorActions::setAllActionsEnabled(bool value)
-{
-    m_import2dDataAction->setEnabled(value);
-    m_import1dDataAction->setEnabled(value);
-    m_rotateDataAction->setEnabled(value);
-    m_removeDataAction->setEnabled(value);
-}
-
 void RealDataSelectorActions::updateSelection()
 {
     if (!m_selectionModel->hasSelection()) {
diff --git a/GUI/coregui/Views/ImportDataWidgets/RealDataSelectorActions.h b/GUI/coregui/Views/ImportDataWidgets/RealDataSelectorActions.h
index 5ba9fa6bfe8..3a3d7b9a573 100644
--- a/GUI/coregui/Views/ImportDataWidgets/RealDataSelectorActions.h
+++ b/GUI/coregui/Views/ImportDataWidgets/RealDataSelectorActions.h
@@ -37,10 +37,8 @@ public slots:
     void onImport2dDataAction();
     void onRemoveDataAction();
     void onRotateDataRequest();
-    void onContextMenuRequest(const QPoint& point, const QModelIndex& indexAtPoint);
 
 private:
-    void setAllActionsEnabled(bool value);
     void updateSelection();
     void importDataLoop(int ndim);
 
diff --git a/GUI/coregui/Views/ImportDataWidgets/RealDataSelectorWidget.cpp b/GUI/coregui/Views/ImportDataWidgets/RealDataSelectorWidget.cpp
index f7f209c5f79..fd52928aedd 100644
--- a/GUI/coregui/Views/ImportDataWidgets/RealDataSelectorWidget.cpp
+++ b/GUI/coregui/Views/ImportDataWidgets/RealDataSelectorWidget.cpp
@@ -19,6 +19,9 @@
 #include "GUI/coregui/Views/ImportDataWidgets/RealDataSelectorActions.h"
 #include "GUI/coregui/mainwindow/StyledToolBar.h"
 #include <QItemSelectionModel>
+#include <QLineEdit>
+#include <QListView>
+#include <QMenu>
 #include <QSplitter>
 #include <QVBoxLayout>
 
@@ -27,11 +30,19 @@ RealDataSelectorWidget::RealDataSelectorWidget(QWidget* parent)
     , m_selectorActions(new RealDataSelectorActions(this))
     , m_selectorWidget(new ItemSelectorWidget)
     , m_propertiesWidget(new RealDataPropertiesWidget)
+    , m_renameDataAction(new QAction(this))
 {
     setMinimumSize(128, 600);
     setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Expanding);
     setWindowTitle("RealDataSelectorWidget");
 
+    m_renameDataAction->setText("Rename this data");
+    m_renameDataAction->setIcon(QIcon()); // #TODO: Icon needed?
+    m_renameDataAction->setIconText("Rename");
+    m_renameDataAction->setToolTip("Rename data");
+    connect(m_renameDataAction, &QAction::triggered, this,
+            &RealDataSelectorWidget::onRenameDataRequest);
+
     QToolBar* toolBar = new StyledToolBar(this);
     toolBar->setMinimumSize(toolBar->minimumHeight(), toolBar->minimumHeight());
     toolBar->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
@@ -54,8 +65,8 @@ RealDataSelectorWidget::RealDataSelectorWidget(QWidget* parent)
     mainLayout->addWidget(splitter);
     setLayout(mainLayout);
 
-    connect(m_selectorWidget, &ItemSelectorWidget::contextMenuRequest, m_selectorActions,
-            &RealDataSelectorActions::onContextMenuRequest);
+    connect(m_selectorWidget, &ItemSelectorWidget::contextMenuRequest, this,
+            &RealDataSelectorWidget::onContextMenuRequest);
 
     connect(m_selectorWidget, &ItemSelectorWidget::selectionChanged, this,
             &RealDataSelectorWidget::onSelectionChanged);
@@ -86,3 +97,41 @@ void RealDataSelectorWidget::onSelectionChanged(SessionItem* item)
     m_propertiesWidget->setItem(item);
     emit selectionChanged(item);
 }
+
+void RealDataSelectorWidget::onContextMenuRequest(const QPoint& point,
+                                                  const QModelIndex& indexAtPoint)
+{
+
+    const auto setAllActionsEnabled = [this](bool value) {
+        m_selectorActions->m_import2dDataAction->setEnabled(value);
+        m_selectorActions->m_import1dDataAction->setEnabled(value);
+        m_selectorActions->m_rotateDataAction->setEnabled(value);
+        m_selectorActions->m_removeDataAction->setEnabled(value);
+        m_renameDataAction->setEnabled(value);
+    };
+
+    QMenu menu;
+    menu.setToolTipsVisible(true);
+
+    setAllActionsEnabled(indexAtPoint.isValid());
+
+    m_selectorActions->m_import2dDataAction->setEnabled(true);
+    m_selectorActions->m_import1dDataAction->setEnabled(true);
+
+    menu.addAction(m_renameDataAction);
+    menu.addAction(m_selectorActions->m_removeDataAction);
+    menu.addAction(m_selectorActions->m_rotateDataAction);
+    menu.addSeparator();
+    menu.addAction(m_selectorActions->m_import2dDataAction);
+    menu.addAction(m_selectorActions->m_import1dDataAction);
+    menu.exec(point);
+}
+
+void RealDataSelectorWidget::onRenameDataRequest()
+{
+    QModelIndex currentIndex = m_selectorWidget->selectionModel()->currentIndex();
+    if (!currentIndex.isValid())
+        return;
+
+    m_selectorWidget->listView()->edit(currentIndex);
+}
diff --git a/GUI/coregui/Views/ImportDataWidgets/RealDataSelectorWidget.h b/GUI/coregui/Views/ImportDataWidgets/RealDataSelectorWidget.h
index 743fff36460..8a1b5c5672f 100644
--- a/GUI/coregui/Views/ImportDataWidgets/RealDataSelectorWidget.h
+++ b/GUI/coregui/Views/ImportDataWidgets/RealDataSelectorWidget.h
@@ -44,11 +44,14 @@ signals:
 
 public slots:
     void onSelectionChanged(SessionItem* item);
+    void onContextMenuRequest(const QPoint& point, const QModelIndex& indexAtPoint);
+    void onRenameDataRequest();
 
 private:
     RealDataSelectorActions* m_selectorActions;
     ItemSelectorWidget* m_selectorWidget;
     RealDataPropertiesWidget* m_propertiesWidget;
+    QAction* m_renameDataAction;
 };
 
 #endif // BORNAGAIN_GUI_COREGUI_VIEWS_IMPORTDATAWIDGETS_REALDATASELECTORWIDGET_H
-- 
GitLab