From 3ba962aefbb558bc98b592a672623982e0794537 Mon Sep 17 00:00:00 2001 From: Gaute Lindkvist Date: Fri, 26 Jul 2019 14:54:54 +0200 Subject: [PATCH] #4471 Implement python script running and editor in ResInsight GUI, same as Octave. --- .../Application/RiaApplication.cpp | 102 ++++++++++++------ ApplicationCode/Application/RiaApplication.h | 9 +- .../Application/RiaGuiApplication.cpp | 4 +- .../Application/RiaPreferences.cpp | 7 ++ ApplicationCode/Application/RiaPreferences.h | 2 + .../RicfRunOctaveScript.cpp | 4 +- .../RicExecuteScriptFeature.cpp | 21 +++- .../RicExecuteScriptForCasesFeature.cpp | 2 +- .../ProjectDataModel/RimCalcScript.cpp | 65 +++++++++-- .../ProjectDataModel/RimCalcScript.h | 14 +++ .../ProjectDataModel/RimCommandObject.cpp | 2 +- .../ProjectDataModel/RimScriptCollection.cpp | 4 +- .../Resources/PythonScriptFile16x16.png | Bin 0 -> 802 bytes ApplicationCode/Resources/ResInsight.qrc | 1 + Fwk/AppFwk/CommonCode/cafUtils.cpp | 21 +++- Fwk/AppFwk/CommonCode/cafUtils.h | 3 +- 16 files changed, 200 insertions(+), 61 deletions(-) create mode 100644 ApplicationCode/Resources/PythonScriptFile16x16.png diff --git a/ApplicationCode/Application/RiaApplication.cpp b/ApplicationCode/Application/RiaApplication.cpp index 8f000f6b83..a4ca703e96 100644 --- a/ApplicationCode/Application/RiaApplication.cpp +++ b/ApplicationCode/Application/RiaApplication.cpp @@ -899,7 +899,73 @@ QStringList RiaApplication::octaveArguments() const //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -bool RiaApplication::launchProcess(const QString& program, const QStringList& arguments) +QProcessEnvironment RiaApplication::octaveProcessEnvironment() const +{ + QProcessEnvironment penv = QProcessEnvironment::systemEnvironment(); + +#ifdef WIN32 + // Octave plugins compiled by ResInsight are dependent on Qt (currently Qt 32-bit only) + // Some Octave installations for Windows have included Qt, and some don't. To make sure these plugins always can be + // executed, the path to octave_plugin_dependencies is added to global path + + QString pathString = penv.value("PATH", ""); + + if (pathString == "") + pathString = QApplication::applicationDirPath() + "\\octave_plugin_dependencies"; + else + pathString = QApplication::applicationDirPath() + "\\octave_plugin_dependencies" + ";" + pathString; + + penv.insert("PATH", pathString); +#else + // Set the LD_LIBRARY_PATH to make the octave plugins find the embedded Qt + QString ldPath = penv.value("LD_LIBRARY_PATH", ""); + + if (ldPath == "") + ldPath = QApplication::applicationDirPath(); + else + ldPath = QApplication::applicationDirPath() + ":" + ldPath; + + penv.insert("LD_LIBRARY_PATH", ldPath); +#endif + + return penv; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RiaApplication::pythonPath() const +{ + return m_preferences->pythonExecutable(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QProcessEnvironment RiaApplication::pythonProcessEnvironment() const +{ + QProcessEnvironment penv = QProcessEnvironment::systemEnvironment(); + penv.insert("RESINSIGHT_GRPC_PORT", QString("%1").arg(m_grpcServer->portNumber())); + penv.insert("RESINSIGHT_EXECUTABLE", QCoreApplication::applicationFilePath()); + + QStringList ripsLocations; +#ifdef WIN32 + ripsLocations << QCoreApplication::applicationDirPath() + "\\Python" + << QCoreApplication::applicationDirPath() + "\\..\\..\\Python"; + +#else + ripsLocations << QCoreApplication::applicationDirPath() + "/Python"; +#endif + + penv.insert("PYTHONPATH", QString("%1;%2").arg(penv.value("PYTHONPATH")).arg(ripsLocations.join(";"))); + + return penv; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RiaApplication::launchProcess(const QString& program, const QStringList& arguments, const QProcessEnvironment& processEnvironment) { if (m_workerProcess == nullptr) { @@ -920,34 +986,7 @@ bool RiaApplication::launchProcess(const QString& program, const QStringList& ar m_runningWorkerProcess = true; m_workerProcess = new caf::UiProcess(QCoreApplication::instance()); - QProcessEnvironment penv = QProcessEnvironment::systemEnvironment(); - -#ifdef WIN32 - // Octave plugins compiled by ResInsight are dependent on Qt (currently Qt 32-bit only) - // Some Octave installations for Windows have included Qt, and some don't. To make sure these plugins always can be - // executed, the path to octave_plugin_dependencies is added to global path - - QString pathString = penv.value("PATH", ""); - - if (pathString == "") - pathString = QApplication::applicationDirPath() + "\\octave_plugin_dependencies"; - else - pathString = QApplication::applicationDirPath() + "\\octave_plugin_dependencies" + ";" + pathString; - - penv.insert("PATH", pathString); -#else - // Set the LD_LIBRARY_PATH to make the octave plugins find the embedded Qt - QString ldPath = penv.value("LD_LIBRARY_PATH", ""); - - if (ldPath == "") - ldPath = QApplication::applicationDirPath(); - else - ldPath = QApplication::applicationDirPath() + ":" + ldPath; - - penv.insert("LD_LIBRARY_PATH", ldPath); -#endif - - m_workerProcess->setProcessEnvironment(penv); + m_workerProcess->setProcessEnvironment(processEnvironment); QCoreApplication::instance()->connect(m_workerProcess, SIGNAL(finished(int, QProcess::ExitStatus)), @@ -989,7 +1028,8 @@ bool RiaApplication::launchProcess(const QString& program, const QStringList& ar //-------------------------------------------------------------------------------------------------- bool RiaApplication::launchProcessForMultipleCases(const QString& program, const QStringList& arguments, - const std::vector& caseIds) + const std::vector& caseIds, + const QProcessEnvironment& processEnvironment) { m_currentCaseIds.clear(); std::copy(caseIds.begin(), caseIds.end(), std::back_inserter(m_currentCaseIds)); @@ -997,7 +1037,7 @@ bool RiaApplication::launchProcessForMultipleCases(const QString& progr m_currentProgram = program; m_currentArguments = arguments; - return launchProcess(m_currentProgram, m_currentArguments); + return launchProcess(m_currentProgram, m_currentArguments, processEnvironment); } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationCode/Application/RiaApplication.h b/ApplicationCode/Application/RiaApplication.h index 09f0f7326a..8ebb5484c1 100644 --- a/ApplicationCode/Application/RiaApplication.h +++ b/ApplicationCode/Application/RiaApplication.h @@ -33,6 +33,7 @@ #include #include #include +#include #include #include @@ -144,9 +145,13 @@ public: QString octavePath() const; QStringList octaveArguments() const; + QProcessEnvironment octaveProcessEnvironment() const; - bool launchProcess(const QString& program, const QStringList& arguments); - bool launchProcessForMultipleCases(const QString& program, const QStringList& arguments, const std::vector& caseIds); + QString pythonPath() const; + QProcessEnvironment pythonProcessEnvironment() const; + + bool launchProcess(const QString& program, const QStringList& arguments, const QProcessEnvironment& processEnvironment); + bool launchProcessForMultipleCases(const QString& program, const QStringList& arguments, const std::vector& caseIds, const QProcessEnvironment& processEnvironment); void terminateProcess(); void waitForProcess() const; diff --git a/ApplicationCode/Application/RiaGuiApplication.cpp b/ApplicationCode/Application/RiaGuiApplication.cpp index 78783583c0..e0c278aad1 100644 --- a/ApplicationCode/Application/RiaGuiApplication.cpp +++ b/ApplicationCode/Application/RiaGuiApplication.cpp @@ -1655,6 +1655,8 @@ void RiaGuiApplication::slotWorkerProcessFinished(int exitCode, QProcess::ExitSt { m_mainWindow->processMonitor()->stopMonitorWorkProcess(); + QProcessEnvironment processEnvironment = m_workerProcess->processEnvironment(); + // Execute delete later so that other slots that are hooked up // get a chance to run before we delete the object if (m_workerProcess) @@ -1684,7 +1686,7 @@ void RiaGuiApplication::slotWorkerProcessFinished(int exitCode, QProcess::ExitSt // If multiple cases are present, invoke launchProcess() which will set next current case, and run script on this case if (!m_currentCaseIds.empty()) { - launchProcess(m_currentProgram, m_currentArguments); + launchProcess(m_currentProgram, m_currentArguments, processEnvironment); } else { diff --git a/ApplicationCode/Application/RiaPreferences.cpp b/ApplicationCode/Application/RiaPreferences.cpp index 382478c581..e5363704f9 100644 --- a/ApplicationCode/Application/RiaPreferences.cpp +++ b/ApplicationCode/Application/RiaPreferences.cpp @@ -67,6 +67,10 @@ RiaPreferences::RiaPreferences(void) CAF_PDM_InitField(&octaveShowHeaderInfoWhenExecutingScripts, "octaveShowHeaderInfoWhenExecutingScripts", false, "Show Text Header When Executing Scripts", "", "", ""); octaveShowHeaderInfoWhenExecutingScripts.uiCapability()->setUiLabelPosition(caf::PdmUiItemInfo::HIDDEN); + CAF_PDM_InitField(&pythonExecutable, "pythonExecutable", QString("python"), "Python Executable Location", "", "", ""); + pythonExecutable.uiCapability()->setUiEditorTypeName(caf::PdmUiFilePathEditor::uiEditorTypeName()); + pythonExecutable.uiCapability()->setUiLabelPosition(caf::PdmUiItemInfo::TOP); + CAF_PDM_InitField(&ssihubAddress, "ssihubAddress", QString("http://"), "SSIHUB Address", "", "", ""); ssihubAddress.uiCapability()->setUiLabelPosition(caf::PdmUiItemInfo::TOP); @@ -273,6 +277,9 @@ void RiaPreferences::defineUiOrdering(QString uiConfigName, caf::PdmUiOrdering& octaveGroup->add(&octaveExecutable); octaveGroup->add(&octaveShowHeaderInfoWhenExecutingScripts); + caf::PdmUiGroup* pythonGroup = uiOrdering.addNewGroup("Python"); + pythonGroup->add(&pythonExecutable); + caf::PdmUiGroup* scriptGroup = uiOrdering.addNewGroup("Script files"); scriptGroup->add(&scriptDirectories); scriptGroup->add(&scriptEditorExecutable); diff --git a/ApplicationCode/Application/RiaPreferences.h b/ApplicationCode/Application/RiaPreferences.h index ebace447ab..dca4eb8d15 100644 --- a/ApplicationCode/Application/RiaPreferences.h +++ b/ApplicationCode/Application/RiaPreferences.h @@ -77,6 +77,8 @@ public: // Pdm Fields caf::PdmField octaveExecutable; caf::PdmField octaveShowHeaderInfoWhenExecutingScripts; + caf::PdmField pythonExecutable; + caf::PdmField ssihubAddress; caf::PdmField> defaultMeshModeType; diff --git a/ApplicationCode/CommandFileInterface/RicfRunOctaveScript.cpp b/ApplicationCode/CommandFileInterface/RicfRunOctaveScript.cpp index c9cf89e180..b43d8207c8 100644 --- a/ApplicationCode/CommandFileInterface/RicfRunOctaveScript.cpp +++ b/ApplicationCode/CommandFileInterface/RicfRunOctaveScript.cpp @@ -65,11 +65,11 @@ RicfCommandResponse RicfRunOctaveScript::execute() bool ok; if (caseIds.empty()) { - ok = RiaApplication::instance()->launchProcess(octavePath, processArguments); + ok = RiaApplication::instance()->launchProcess(octavePath, processArguments, RiaApplication::instance()->octaveProcessEnvironment()); } else { - ok = RiaApplication::instance()->launchProcessForMultipleCases(octavePath, processArguments, caseIds); + ok = RiaApplication::instance()->launchProcessForMultipleCases(octavePath, processArguments, caseIds, RiaApplication::instance()->octaveProcessEnvironment()); } RicfCommandResponse response; diff --git a/ApplicationCode/Commands/OctaveScriptCommands/RicExecuteScriptFeature.cpp b/ApplicationCode/Commands/OctaveScriptCommands/RicExecuteScriptFeature.cpp index e52539aa29..b01fb43976 100644 --- a/ApplicationCode/Commands/OctaveScriptCommands/RicExecuteScriptFeature.cpp +++ b/ApplicationCode/Commands/OctaveScriptCommands/RicExecuteScriptFeature.cpp @@ -56,12 +56,23 @@ void RicExecuteScriptFeature::onActionTriggered(bool isChecked) RimCalcScript* calcScript = selection[0]; RiaApplication* app = RiaApplication::instance(); - QString octavePath = app->octavePath(); - if (!octavePath.isEmpty()) + if (calcScript->scriptType() == RimCalcScript::OCTAVE) { - QStringList arguments = RimCalcScript::createCommandLineArguments(calcScript->absoluteFileName()); - - RiaApplication::instance()->launchProcess(octavePath, arguments); + QString octavePath = app->octavePath(); + if (!octavePath.isEmpty()) + { + QStringList arguments = RimCalcScript::createCommandLineArguments(calcScript->absoluteFileName()); + RiaApplication::instance()->launchProcess(octavePath, arguments, app->octaveProcessEnvironment()); + } + } + else if (calcScript->scriptType() == RimCalcScript::PYTHON) + { + QString pythonPath = app->pythonPath(); + if (!pythonPath.isEmpty()) + { + QStringList arguments = RimCalcScript::createCommandLineArguments(calcScript->absoluteFileName()); + RiaApplication::instance()->launchProcess(pythonPath, arguments, app->pythonProcessEnvironment()); + } } } diff --git a/ApplicationCode/Commands/OctaveScriptCommands/RicExecuteScriptForCasesFeature.cpp b/ApplicationCode/Commands/OctaveScriptCommands/RicExecuteScriptForCasesFeature.cpp index 9c3f0e1192..98fa643ee8 100644 --- a/ApplicationCode/Commands/OctaveScriptCommands/RicExecuteScriptForCasesFeature.cpp +++ b/ApplicationCode/Commands/OctaveScriptCommands/RicExecuteScriptForCasesFeature.cpp @@ -80,7 +80,7 @@ void RicExecuteScriptForCasesFeature::onActionTriggered(bool isChecked) if (caseIdsInSelection.size() > 0) { - RiaApplication::instance()->launchProcessForMultipleCases(octavePath, arguments, caseIdsInSelection); + RiaApplication::instance()->launchProcessForMultipleCases(octavePath, arguments, caseIdsInSelection, app->octaveProcessEnvironment()); } } } diff --git a/ApplicationCode/ProjectDataModel/RimCalcScript.cpp b/ApplicationCode/ProjectDataModel/RimCalcScript.cpp index ffaccf9832..2fe0ee41e4 100644 --- a/ApplicationCode/ProjectDataModel/RimCalcScript.cpp +++ b/ApplicationCode/ProjectDataModel/RimCalcScript.cpp @@ -48,6 +48,31 @@ RimCalcScript::RimCalcScript() //-------------------------------------------------------------------------------------------------- RimCalcScript::~RimCalcScript() {} +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimCalcScript::ScriptType RimCalcScript::scriptType(const QString& absoluteFileNameScript) +{ + QFileInfo fileInfo(absoluteFileNameScript); + if (fileInfo.suffix() == "py") + { + return PYTHON; + } + else if (fileInfo.suffix() == "m") + { + return OCTAVE; + } + return UNKNOWN; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimCalcScript::ScriptType RimCalcScript::scriptType() const +{ + return scriptType(absoluteFileName()); +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -55,20 +80,27 @@ QStringList RimCalcScript::createCommandLineArguments(const QString& absoluteFil { QStringList arguments; + if (scriptType(absoluteFileNameScript) == PYTHON) { - auto app = RiaApplication::instance(); - - arguments = app->octaveArguments(); - arguments.append("--path"); + arguments.append(absoluteFileNameScript); } - + else if (scriptType(absoluteFileNameScript) == OCTAVE) { - QFileInfo fi(absoluteFileNameScript); - QString octaveFunctionSearchPath = fi.absolutePath(); - QString absFilePath = fi.absoluteFilePath(); + { + auto app = RiaApplication::instance(); - arguments << octaveFunctionSearchPath; - arguments << absFilePath; + arguments = app->octaveArguments(); + arguments.append("--path"); + } + + { + QFileInfo fi(absoluteFileNameScript); + QString octaveFunctionSearchPath = fi.absolutePath(); + QString absFilePath = fi.absoluteFilePath(); + + arguments << octaveFunctionSearchPath; + arguments << absFilePath; + } } bool debugPrintArgumentText = false; @@ -76,8 +108,19 @@ QStringList RimCalcScript::createCommandLineArguments(const QString& absoluteFil { QString argumentString = arguments.join(" "); - RiaLogging::info("Octave arguments : " + argumentString); + RiaLogging::info("Scriptarguments : " + argumentString); } return arguments; } + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimCalcScript::defineUiTreeOrdering(caf::PdmUiTreeOrdering& uiTreeOrdering, QString uiConfigName /*= ""*/) +{ + if (scriptType() == PYTHON) + { + uiCapability()->setUiIconFromResourceString(":/PythonScriptFile16x16.png"); + } +} diff --git a/ApplicationCode/ProjectDataModel/RimCalcScript.h b/ApplicationCode/ProjectDataModel/RimCalcScript.h index 442bc97cf0..f477fa2ee1 100644 --- a/ApplicationCode/ProjectDataModel/RimCalcScript.h +++ b/ApplicationCode/ProjectDataModel/RimCalcScript.h @@ -30,11 +30,25 @@ class RimCalcScript : public caf::PdmObject CAF_PDM_HEADER_INIT; public: + enum ScriptType + { + OCTAVE = 0, + PYTHON = 1, + UNKNOWN = 2 + }; + RimCalcScript(); ~RimCalcScript() override; + ScriptType scriptType() const; + static ScriptType scriptType(const QString& fileName); + static QStringList createCommandLineArguments(const QString& absoluteFileNameScript); caf::PdmField absoluteFileName; caf::PdmField content; // TODO: Obsolete field, can be deleted on next project file revision. + +protected: + void defineUiTreeOrdering(caf::PdmUiTreeOrdering& uiTreeOrdering, QString uiConfigName = "") override; + }; diff --git a/ApplicationCode/ProjectDataModel/RimCommandObject.cpp b/ApplicationCode/ProjectDataModel/RimCommandObject.cpp index b260a82817..59f8704f21 100644 --- a/ApplicationCode/ProjectDataModel/RimCommandObject.cpp +++ b/ApplicationCode/ProjectDataModel/RimCommandObject.cpp @@ -96,7 +96,7 @@ void RimCommandExecuteScript::redo() arguments.append("--eval"); arguments << this->scriptText(); - RiaApplication::instance()->launchProcess(octavePath, arguments); + RiaApplication::instance()->launchProcess(octavePath, arguments, app->octaveProcessEnvironment()); } } diff --git a/ApplicationCode/ProjectDataModel/RimScriptCollection.cpp b/ApplicationCode/ProjectDataModel/RimScriptCollection.cpp index 523663027a..a464b2305a 100644 --- a/ApplicationCode/ProjectDataModel/RimScriptCollection.cpp +++ b/ApplicationCode/ProjectDataModel/RimScriptCollection.cpp @@ -81,8 +81,8 @@ void RimScriptCollection::readContentFromDisc() // Build a list of all scripts in the specified directory { - QString filter = "*.m"; - QStringList fileList = caf::Utils::getFilesInDirectory(directory, filter, true); + QStringList nameFilters; nameFilters << "*.m" << "*.py"; + QStringList fileList = caf::Utils::getFilesInDirectory(directory, nameFilters, true); int i; for (i = 0; i < fileList.size(); i++) diff --git a/ApplicationCode/Resources/PythonScriptFile16x16.png b/ApplicationCode/Resources/PythonScriptFile16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..351c1ac7387e5337f96e9ac55181a19609053f94 GIT binary patch literal 802 zcmV+-1Ks?IP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!~g&e!~vBn z4jTXf02y>eSaefwW^{L9a%BK_cXuvnZfkR6VQ^(GZ*pgw?mQX*00M$ZL_t(IPmNPe zOcOyA{$_vrM=RLqfr?SUlAy&v^aLjpPsT`M;@yKc6E8-NTnr~}9zA%`lL?6@&?88)3K6 zz{JEvB(T1|PKpBvcp%9;Z4YltyZE`?BBG1g@zc0IP2QLy+>;QnXBf!m^PrUojJ&Ai zJ(JM!X048=#WIR(RlNIF!_vwpv@9RGuF)Ba?nr8V0YRoHQQdcNYi1ZL59Ux@yaCIy z(Kao4FPfr5)#5U(186-c|XLA|dUytGZSU}kN z00cG-j|Alx@x;VM2U0|fx2N%Feg;EHj==f|_;oP9LDoj-b-}xJ_{mvtE|V72!$vxp z%_13((MZ6t8&J0IOK;)uGR)>5G>q4RwKxoj8b&!iFh`?xqcDaitd1?_|A>Ja#;hd?ZkP|Lwi-Gu2Ru)6vMqod>U zAss-bP%4#>%jFP@#bk*X^#o%Yy^H8jskDK8V+)1CB_f}Q7JHBa2K9BNQt2%nho)&5 g8yk}^@LvFb0dT?~9fQ_OEdT%j07*qoM6N<$g6+{+)c^nh literal 0 HcmV?d00001 diff --git a/ApplicationCode/Resources/ResInsight.qrc b/ApplicationCode/Resources/ResInsight.qrc index fe34b9b7f5..f92441653c 100644 --- a/ApplicationCode/Resources/ResInsight.qrc +++ b/ApplicationCode/Resources/ResInsight.qrc @@ -23,6 +23,7 @@ WellCollection.png octave.png OctaveScriptFile16x16.png + PythonScriptFile16x16.png Folder.png EclipseInput48x48.png Cases16x16.png diff --git a/Fwk/AppFwk/CommonCode/cafUtils.cpp b/Fwk/AppFwk/CommonCode/cafUtils.cpp index 04876063b8..f10bf8b3e2 100644 --- a/Fwk/AppFwk/CommonCode/cafUtils.cpp +++ b/Fwk/AppFwk/CommonCode/cafUtils.cpp @@ -80,18 +80,32 @@ QString Utils::absoluteFileName(const QString& fileName) return QDir::toNativeSeparators(fi.absoluteFilePath()); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QStringList Utils::getFilesInDirectory(const QString& dirPath, + const QString& nameFilter, + bool getAbsoluteFileNames) +{ + QStringList nameFilters; nameFilters << nameFilter; + return getFilesInDirectory(dirPath, nameFilters, getAbsoluteFileNames); +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -QStringList Utils::getFilesInDirectory(const QString& dirPath, const QString& filter, bool getAbsoluteFileNames) +QStringList Utils::getFilesInDirectory(const QString& dirPath, const QStringList& nameFilters, bool getAbsoluteFileNames) { QDir::SortFlags sortFlags = QDir::SortFlags(QDir::Name | QDir::IgnoreCase); // Only get files - QDir::Filters filters = QDir::Files; + QDir::Filters typeFilter = QDir::Files; - QDir dir(dirPath, filter, sortFlags, filters); + QDir dir(dirPath); + dir.setFilter(typeFilter); + dir.setNameFilters(nameFilters); + dir.setSorting(sortFlags); QFileInfoList fileInfoList = dir.entryInfoList(); @@ -110,7 +124,6 @@ QStringList Utils::getFilesInDirectory(const QString& dirPath, const QString& fi return retFileNames; } - //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/Fwk/AppFwk/CommonCode/cafUtils.h b/Fwk/AppFwk/CommonCode/cafUtils.h index 5bef77dfee..51430951b1 100644 --- a/Fwk/AppFwk/CommonCode/cafUtils.h +++ b/Fwk/AppFwk/CommonCode/cafUtils.h @@ -56,7 +56,8 @@ public: static double editToDouble(QLineEdit* lineEdit, double defaultVal); static QString absoluteFileName(const QString& fileName); - static QStringList getFilesInDirectory(const QString& dirPath, const QString& filter, bool getAbsoluteFileNames); + static QStringList getFilesInDirectory(const QString& dirPath, const QString& nameFilter, bool getAbsoluteFileNames); + static QStringList getFilesInDirectory(const QString& dirPath, const QStringList& nameFilters, bool getAbsoluteFileNames); static QString constructFullFileName(const QString& folder, const QString& baseFileName, const QString& extension); static QString makeValidFileBasename(const QString& fileBasenameCandidate);