From 884a0b7f424776800cd6815de8f7b5d358b62cbd Mon Sep 17 00:00:00 2001
From: anikhalder <halder.anik04@gmail.com>
Date: Wed, 28 Mar 2018 17:58:58 +0200
Subject: [PATCH] Move RealSpaceWidget from Test View to Sample View

---
 .../Views/RealSpaceWidgets/RealSpacePanel.cpp |  2 +-
 .../RealSpaceViewerDialog.cpp                 | 51 +++++++++++++++++++
 .../RealSpaceWidgets/RealSpaceViewerDialog.h  | 37 ++++++++++++++
 .../RealSpaceWidgets/RealSpaceWidget.cpp      |  8 ++-
 .../Views/RealSpaceWidgets/RealSpaceWidget.h  |  6 ++-
 .../Views/SampleDesigner/SampleToolBar.cpp    | 33 ++++++++++--
 .../Views/SampleDesigner/SampleToolBar.h      | 15 +++++-
 GUI/coregui/Views/SampleView.cpp              |  2 +-
 8 files changed, 142 insertions(+), 12 deletions(-)
 create mode 100644 GUI/coregui/Views/RealSpaceWidgets/RealSpaceViewerDialog.cpp
 create mode 100644 GUI/coregui/Views/RealSpaceWidgets/RealSpaceViewerDialog.h

diff --git a/GUI/coregui/Views/RealSpaceWidgets/RealSpacePanel.cpp b/GUI/coregui/Views/RealSpaceWidgets/RealSpacePanel.cpp
index 6041a8b3c24..bc95324a0bb 100644
--- a/GUI/coregui/Views/RealSpaceWidgets/RealSpacePanel.cpp
+++ b/GUI/coregui/Views/RealSpaceWidgets/RealSpacePanel.cpp
@@ -54,7 +54,7 @@ void RealSpacePanel::setModel(SampleModel* model)
 
     m_treeView->expandAll();
 
-    connect(m_model, &SampleModel::rowsInserted, [=](){m_treeView->expandAll();});
+    connect(m_model, &SampleModel::rowsInserted, this, [=](){m_treeView->expandAll();});
 
     connect(m_treeView->selectionModel(), &QItemSelectionModel::selectionChanged,
             this, &RealSpacePanel::onSelectionChanged, Qt::UniqueConnection);
diff --git a/GUI/coregui/Views/RealSpaceWidgets/RealSpaceViewerDialog.cpp b/GUI/coregui/Views/RealSpaceWidgets/RealSpaceViewerDialog.cpp
new file mode 100644
index 00000000000..1c0d750904e
--- /dev/null
+++ b/GUI/coregui/Views/RealSpaceWidgets/RealSpaceViewerDialog.cpp
@@ -0,0 +1,51 @@
+
+#include "RealSpaceViewerDialog.h"
+#include "RealSpaceWidget.h"
+
+#include "StyleUtils.h"
+#include <QAction>
+#include <QPushButton>
+#include <QSettings>
+#include <QVBoxLayout>
+
+#include <QApplication>
+
+namespace
+{
+const QSize minimum_dialog_size(600, 400);
+const QSize default_dialog_size(950, 600);
+}
+
+RealSpaceViewerDialog::RealSpaceViewerDialog(SampleModel *sampleModel, QTreeView *treeView,
+                                             QWidget *parent)
+    : QDialog(parent)
+    , m_sampleModel(sampleModel)
+    , m_treeView(treeView)
+{
+    setWindowTitle("Real Space Viewer");
+    setMinimumSize(minimum_dialog_size);
+    resize(default_dialog_size);
+    setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
+
+    QVBoxLayout *layout = new QVBoxLayout;
+    layout->setMargin(0);
+    layout->setSpacing(0);
+    //layout->setContentsMargins(0, 0, 0, 0);
+
+    #ifdef BORNAGAIN_OPENGL
+    RealSpaceWidget* widget = new RealSpaceWidget(m_sampleModel, m_treeView);
+    widget->setModel(m_sampleModel, m_treeView);
+    layout->addWidget(widget);
+    #endif
+
+    setLayout(layout);
+    StyleUtils::setResizable(this);
+}
+
+void RealSpaceViewerDialog::closeEvent(QCloseEvent *event)
+{
+    Q_UNUSED(event);
+    emit dialogClosed();
+}
+
+
diff --git a/GUI/coregui/Views/RealSpaceWidgets/RealSpaceViewerDialog.h b/GUI/coregui/Views/RealSpaceWidgets/RealSpaceViewerDialog.h
new file mode 100644
index 00000000000..748b668681d
--- /dev/null
+++ b/GUI/coregui/Views/RealSpaceWidgets/RealSpaceViewerDialog.h
@@ -0,0 +1,37 @@
+#ifndef REALSPACEVIEWERDIALOG_H
+#define REALSPACEVIEWERDIALOG_H
+
+#include "WinDllMacros.h"
+#include <QDialog>
+#include <memory>
+#include <SampleModel.h>
+#include <QTreeView>
+
+#include <QCloseEvent>
+
+class MaterialModel;
+class MaterialEditor;
+class ExternalProperty;
+class QBoxLayout;
+
+//! Dialog to hold RealSpaceViewer.
+
+class BA_CORE_API_ RealSpaceViewerDialog : public QDialog
+{
+    Q_OBJECT
+
+public:
+    RealSpaceViewerDialog(SampleModel* sampleModel, QTreeView* treeView, QWidget *parent = nullptr);
+
+    void closeEvent(QCloseEvent* event);
+
+signals:
+    void dialogClosed();
+
+private:
+    SampleModel *m_sampleModel;
+    QTreeView *m_treeView;
+};
+
+
+#endif // REALSPACEVIEWERDIALOG_H
diff --git a/GUI/coregui/Views/RealSpaceWidgets/RealSpaceWidget.cpp b/GUI/coregui/Views/RealSpaceWidgets/RealSpaceWidget.cpp
index e4606a45ab8..b52aeb41545 100644
--- a/GUI/coregui/Views/RealSpaceWidgets/RealSpaceWidget.cpp
+++ b/GUI/coregui/Views/RealSpaceWidgets/RealSpaceWidget.cpp
@@ -21,13 +21,16 @@
 #include <QLabel>
 #include <QDebug>
 
-RealSpaceWidget::RealSpaceWidget(QWidget* parent)
+RealSpaceWidget::RealSpaceWidget(SampleModel *sampleModel, QTreeView *treeView, QWidget* parent)
     : QWidget(parent)
     , m_actions(new RealSpaceActions)
     , m_toolBar(new RealSpaceToolBar)
     , m_canvas(new RealSpaceCanvas)
     , m_panel(new RealSpacePanel)
 {
+    Q_UNUSED(sampleModel);
+    Q_UNUSED(treeView);
+
     QHBoxLayout* hlayout = new QHBoxLayout;
     hlayout->setMargin(0);
     hlayout->setSpacing(0);
@@ -61,8 +64,9 @@ RealSpaceWidget::RealSpaceWidget(QWidget* parent)
 
 }
 
-void RealSpaceWidget::setModel(SampleModel* model)
+void RealSpaceWidget::setModel(SampleModel* model, QTreeView *treeView)
 {
+    Q_UNUSED(treeView);
     m_panel->setModel(model);
     m_canvas->setModel(model);
 }
diff --git a/GUI/coregui/Views/RealSpaceWidgets/RealSpaceWidget.h b/GUI/coregui/Views/RealSpaceWidgets/RealSpaceWidget.h
index 1e5ecf9cf21..477e7885f02 100644
--- a/GUI/coregui/Views/RealSpaceWidgets/RealSpaceWidget.h
+++ b/GUI/coregui/Views/RealSpaceWidgets/RealSpaceWidget.h
@@ -18,6 +18,8 @@
 #include "WinDllMacros.h"
 #include <QWidget>
 
+#include <QTreeView>
+
 class RealSpaceToolBar;
 class RealSpaceCanvas;
 class RealSpaceActions;
@@ -31,9 +33,9 @@ class BA_CORE_API_ RealSpaceWidget : public QWidget
     Q_OBJECT
 
 public:
-    RealSpaceWidget(QWidget* parent = 0);
+    RealSpaceWidget(SampleModel* sampleModel, QTreeView* treeView, QWidget* parent = nullptr);
 
-    void setModel(SampleModel* model);
+    void setModel(SampleModel* model, QTreeView* treeView);
 
 private:
     RealSpaceActions* m_actions;
diff --git a/GUI/coregui/Views/SampleDesigner/SampleToolBar.cpp b/GUI/coregui/Views/SampleDesigner/SampleToolBar.cpp
index 6e8bfc69da3..b9c014dc595 100644
--- a/GUI/coregui/Views/SampleDesigner/SampleToolBar.cpp
+++ b/GUI/coregui/Views/SampleDesigner/SampleToolBar.cpp
@@ -24,9 +24,15 @@
 #include <QPushButton>
 #include <QToolButton>
 
+#include <RealSpaceViewerDialog.h>
+
 //! main tool bar on top of SampleView window
-SampleToolBar::SampleToolBar(QWidget *parent)
+SampleToolBar::SampleToolBar(SampleModel *sampleModel, QTreeView *treeView,
+                             QWidget *parent)
     : StyledToolBar(parent)
+    , m_sampleModel(sampleModel)
+    , m_treeView(treeView)
+    , m_dialog(nullptr)
 {
     // Select & Pan
     QToolButton *selectionPointerButton = new QToolButton;
@@ -121,7 +127,8 @@ SampleToolBar::SampleToolBar(QWidget *parent)
     //m_RealSpaceViewerButton->setIcon(QIcon(":/SampleDesigner/images/toolbar_materialeditor.png"));
     m_RealSpaceViewerButton->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
     m_RealSpaceViewerButton->setToolTip("Open real space 3D viewer.");
-    //connect(m_RealSpaceViewerButton, SIGNAL(clicked()), this, SLOT(onRealSpaceViewerCall()));
+    m_RealSpaceViewerButton->setCheckable(true);
+    connect(m_RealSpaceViewerButton, SIGNAL(clicked()), this, SLOT(onRealSpaceViewerCall()));
     addWidget(m_RealSpaceViewerButton);
 
     // Additional actions
@@ -136,7 +143,6 @@ SampleToolBar::SampleToolBar(QWidget *parent)
     addAction(m_zoomInAction);
 }
 
-
 void SampleToolBar::onViewSelectionMode(int mode)
 {
     if(mode == DesignerView::RUBBER_SELECTION || mode == DesignerView::HAND_DRAG)
@@ -156,5 +162,24 @@ void SampleToolBar::onMaterialEditorCall()
 
 void SampleToolBar::onRealSpaceViewerCall()
 {
-    // to be implemented
+    // on first click, the RSV button is checked and the dialog window is created
+    if(m_RealSpaceViewerButton->isChecked())
+    {
+        m_dialog = new RealSpaceViewerDialog(m_sampleModel, m_treeView, this);
+        //m_dialog->setWindowFlags(Qt::Window); // to have minimize, maximize and close buttons
+        m_dialog->show();
+
+        // on closing of dialog window, uncheck the RSV button
+        connect(m_dialog, &RealSpaceViewerDialog::dialogClosed,
+                this, &SampleToolBar::onDialogClosed);
+    }
+    // on subsequent clicks (uncheck or check) of RSV button, it is always set as checked
+    // so as to keep only one instance of the dialog window alive
+    else
+        m_RealSpaceViewerButton->setChecked(true);
+}
+
+void SampleToolBar::onDialogClosed()
+{
+    m_RealSpaceViewerButton->setChecked(false);
 }
diff --git a/GUI/coregui/Views/SampleDesigner/SampleToolBar.h b/GUI/coregui/Views/SampleDesigner/SampleToolBar.h
index effa927a8b3..29017512ab4 100644
--- a/GUI/coregui/Views/SampleDesigner/SampleToolBar.h
+++ b/GUI/coregui/Views/SampleDesigner/SampleToolBar.h
@@ -17,6 +17,10 @@
 
 #include "StyledToolBar.h"
 
+#include "SampleModel.h"
+#include <QTreeView>
+#include "RealSpaceViewerDialog.h"
+
 class QAction;
 class QToolButton;
 class QToolBar;
@@ -31,7 +35,8 @@ class BA_CORE_API_ SampleToolBar : public StyledToolBar
     Q_OBJECT
 
 public:
-    explicit SampleToolBar(QWidget *parent = 0);
+    explicit SampleToolBar(SampleModel* sampleModel, QTreeView* treeView,
+                           QWidget *parent = 0);
 
 signals:
     void deleteItems();
@@ -46,7 +51,9 @@ public slots:
     void onViewSelectionMode(int);
     void onScaleComboChanged(const QString &);
     void onMaterialEditorCall();
+
     void onRealSpaceViewerCall();
+    void onDialogClosed();
 
 private:
     QButtonGroup *m_pointerModeGroup;
@@ -55,9 +62,13 @@ private:
     QToolButton *m_alignItemsButton;
     QComboBox *m_scaleCombo;
     QToolButton *m_materialEditorButton;
-    QToolButton *m_RealSpaceViewerButton;
     QAction *m_zoomInAction;
     QAction *m_zoomOutAction;
+
+    QToolButton *m_RealSpaceViewerButton;
+    SampleModel *m_sampleModel;
+    QTreeView *m_treeView;
+    RealSpaceViewerDialog *m_dialog;
 };
 
 #endif // SAMPLETOOLBAR_H
diff --git a/GUI/coregui/Views/SampleView.cpp b/GUI/coregui/Views/SampleView.cpp
index cd4efb0edc4..96b5661aee4 100644
--- a/GUI/coregui/Views/SampleView.cpp
+++ b/GUI/coregui/Views/SampleView.cpp
@@ -261,7 +261,7 @@ void SampleView::connectSignals()
     connect(this, SIGNAL(resetLayout()), this, SLOT(resetToDefaultLayout()));
 
     // toolBar should be initialized after MaterialBrowser
-    m_toolBar = new SampleToolBar(this);
+    m_toolBar = new SampleToolBar(getSampleModel(), getTreeView(), this);
     connect(m_toolBar, SIGNAL(deleteItems()),
             m_sampleDesigner->getView(), SLOT(deleteSelectedItems()));
     connect(m_toolBar, SIGNAL(selectionMode(int)), m_sampleDesigner->getView(), SLOT(onSelectionMode(int)));
-- 
GitLab