From 6a5feebed5ddf3b6e523685955f7f0475461c76d Mon Sep 17 00:00:00 2001
From: Matthias Puchner <github@mpuchner.de>
Date: Fri, 10 Dec 2021 10:37:56 +0100
Subject: [PATCH] class -> namespace (PyImportAssistant), docu

---
 GUI/View/Main/PyImportAssistant.cpp | 111 +++++++++++++---------------
 GUI/View/Main/PyImportAssistant.h   |  24 ++----
 2 files changed, 59 insertions(+), 76 deletions(-)

diff --git a/GUI/View/Main/PyImportAssistant.cpp b/GUI/View/Main/PyImportAssistant.cpp
index f8a890e900a..337a28478ac 100644
--- a/GUI/View/Main/PyImportAssistant.cpp
+++ b/GUI/View/Main/PyImportAssistant.cpp
@@ -62,36 +62,9 @@ QString getCandidate(const QStringList& funcNames)
     return funcNames.front();
 }
 
-} // namespace
-
-std::unique_ptr<MultiLayer> PyImportAssistant::importMultiLayer()
-{
-    auto fileName = fileNameToOpen();
-
-    if (fileName.isEmpty())
-        return {};
-
-    QString snippet = readFile(fileName);
-    if (snippet.isEmpty())
-        return {};
-
-    QString funcName = getPySampleFunctionName(snippet);
-    if (funcName.isEmpty())
-        return {};
-
-    auto multilayer = createMultiLayer(snippet, funcName);
-    if (!multilayer)
-        return {};
-
-    if (multilayer->sampleName() == "Unnamed")
-        multilayer->setSampleName(GUI::Util::Path::baseName(fileName).toStdString());
-
-    return multilayer;
-}
-
 //! Lets user to select Python file on disk.
 
-QString PyImportAssistant::fileNameToOpen()
+QString fileNameToOpen()
 {
     QString dirname = ProjectManager::instance()->userImportDir();
 
@@ -100,25 +73,16 @@ QString PyImportAssistant::fileNameToOpen()
         appSettings->useNativeFileDialog() ? QFileDialog::Options()
                                            : QFileDialog::DontUseNativeDialog);
 
-    saveImportDir(result);
+    if (!result.isEmpty())
+        ProjectManager::instance()->setImportDir(GUI::Util::Path::fileDir(result));
 
     return result;
 }
 
-//! Saves file location as a future import dir.
-
-void PyImportAssistant::saveImportDir(const QString& fileName)
-{
-    if (fileName.isEmpty())
-        return;
-
-    ProjectManager::instance()->setImportDir(GUI::Util::Path::fileDir(fileName));
-}
-
 //! Read content of text file and returns it as a multi-line string.
 //! Pop-ups warning dialog in the case of failure.
 
-QString PyImportAssistant::readFile(const QString& fileName)
+QString readFile(const QString& fileName)
 {
     QFile file(fileName);
     if (file.open(QIODevice::ReadOnly | QIODevice::Text))
@@ -131,33 +95,31 @@ QString PyImportAssistant::readFile(const QString& fileName)
     return {};
 }
 
-//! Returns the name of function which might generate a MultiLayer in Python code snippet.
-//! Pop-ups dialog and asks user for help in the case of doubts.
+//! Creates a multi-layer by executing a funcName in embedded Python.
+//! Function is supposed to be in code provided by 'snippet'.
 
-QString PyImportAssistant::getPySampleFunctionName(const QString& snippet)
+std::unique_ptr<MultiLayer> createMultiLayer(const QString& snippet, const QString& funcName)
 {
-    QStringList funcList;
+    std::unique_ptr<MultiLayer> result;
 
     QApplication::setOverrideCursor(Qt::WaitCursor);
     try {
-        auto funcs = Py::Import::listOfFunctions(snippet.toStdString(), bornagainDir());
-        funcList = GUI::Util::String::fromStdStrings(funcs);
+        result = Py::Import::createFromPython(snippet.toStdString(), funcName.toStdString(),
+                                              bornagainDir());
     } catch (const std::exception& ex) {
         QApplication::restoreOverrideCursor();
-        QString message("Exception thrown while acquiring functions from Python code.\n\n");
+        QString message("Exception thrown while executing Python code to create multilayer.\n\n");
         QString details = QString::fromStdString(std::string(ex.what()));
         DetailedMessageBox(baWin, "Python failure", message, details).exec();
-
-        return "";
     }
     QApplication::restoreOverrideCursor();
 
-    return selectPySampleFunction(funcList);
+    return result;
 }
 
 //! Lets user select a function name which generates a MultiLayer.
 
-QString PyImportAssistant::selectPySampleFunction(const QStringList& funcNames)
+QString selectPySampleFunction(const QStringList& funcNames)
 {
     QString result;
 
@@ -180,29 +142,58 @@ QString PyImportAssistant::selectPySampleFunction(const QStringList& funcNames)
     return result;
 }
 
-//! Creates a multi-layer by executing a funcName in embedded Python.
-//! Function is supposed to be in code provided by 'snippet'.
+//! Returns the name of function which might generate a MultiLayer in Python code snippet.
+//! Pop-ups dialog and asks user for help in the case of doubts.
 
-std::unique_ptr<MultiLayer> PyImportAssistant::createMultiLayer(const QString& snippet,
-                                                                const QString& funcName)
+QString getPySampleFunctionName(const QString& snippet)
 {
-    std::unique_ptr<MultiLayer> result;
+    QStringList funcList;
 
     QApplication::setOverrideCursor(Qt::WaitCursor);
     try {
-        result = Py::Import::createFromPython(snippet.toStdString(), funcName.toStdString(),
-                                              bornagainDir());
+        auto funcs = Py::Import::listOfFunctions(snippet.toStdString(), bornagainDir());
+        funcList = GUI::Util::String::fromStdStrings(funcs);
     } catch (const std::exception& ex) {
         QApplication::restoreOverrideCursor();
-        QString message("Exception thrown while executing Python code to create multilayer.\n\n");
+        QString message("Exception thrown while acquiring functions from Python code.\n\n");
         QString details = QString::fromStdString(std::string(ex.what()));
         DetailedMessageBox(baWin, "Python failure", message, details).exec();
+
+        return "";
     }
     QApplication::restoreOverrideCursor();
 
-    return result;
+    return selectPySampleFunction(funcList);
+}
+
+} // namespace
+
+std::unique_ptr<MultiLayer> PyImportAssistant::importMultiLayer()
+{
+    auto fileName = fileNameToOpen();
+
+    if (fileName.isEmpty())
+        return {};
+
+    QString snippet = readFile(fileName);
+    if (snippet.isEmpty())
+        return {};
+
+    QString funcName = getPySampleFunctionName(snippet);
+    if (funcName.isEmpty())
+        return {};
+
+    auto multilayer = createMultiLayer(snippet, funcName);
+    if (!multilayer)
+        return {};
+
+    if (multilayer->sampleName() == "Unnamed")
+        multilayer->setSampleName(GUI::Util::Path::baseName(fileName).toStdString());
+
+    return multilayer;
 }
 
+
 //! Populates GUI models with domain multilayer.
 
 MultiLayerItem* PyImportAssistant::populateModels(SampleModel* sampleModel,
diff --git a/GUI/View/Main/PyImportAssistant.h b/GUI/View/Main/PyImportAssistant.h
index 59c59b13e07..03aef4efa75 100644
--- a/GUI/View/Main/PyImportAssistant.h
+++ b/GUI/View/Main/PyImportAssistant.h
@@ -23,28 +23,20 @@ class SampleModel;
 class MaterialModel;
 class MultiLayerItem;
 class MultiLayer;
-class QString;
-class QStringList;
 
 //! Assists in importing Python object to GUI models.
 
-class PyImportAssistant {
+namespace PyImportAssistant {
 
-public:
-    static std::unique_ptr<MultiLayer> importMultiLayer();
+//! Show select-file dialog, try to import via python, return created multilayer.
+//!
+//! If sth. went wrong, a dialog has presented already and nullptr is returned.
+std::unique_ptr<MultiLayer> importMultiLayer();
 
-    static MultiLayerItem* populateModels(SampleModel* sampleModel, MaterialModel* materialModel,
-                                          const MultiLayer& multilayer);
+MultiLayerItem* populateModels(SampleModel* sampleModel, MaterialModel* materialModel,
+                               const MultiLayer& multilayer);
 
-private:
-    static QString fileNameToOpen();
-    static void saveImportDir(const QString& fileName);
-    static QString readFile(const QString& fileName);
-    static QString getPySampleFunctionName(const QString& snippet);
-    static QString selectPySampleFunction(const QStringList& funcNames);
-    static std::unique_ptr<MultiLayer> createMultiLayer(const QString& snippet,
-                                                        const QString& funcName);
-};
+} // namespace PyImportAssistant
 
 #endif // BORNAGAIN_PYTHON
 
-- 
GitLab