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