From 660f3fc17b3070cc3a17c24148255ea5c7be590a Mon Sep 17 00:00:00 2001 From: Mat Sutcliffe Date: Sun, 9 Aug 2020 01:46:16 +0100 Subject: [PATCH] Issue #69 Menu item to launch CSL2XSB in own models component --- .../components/dbownmodelscomponent.cpp | 26 +++++++++++++++++++ .../components/dbownmodelscomponent.h | 4 +++ src/blackmisc/processctrl.cpp | 9 ++++--- 3 files changed, 35 insertions(+), 4 deletions(-) diff --git a/src/blackgui/components/dbownmodelscomponent.cpp b/src/blackgui/components/dbownmodelscomponent.cpp index a1911a1da..0ca616ac2 100644 --- a/src/blackgui/components/dbownmodelscomponent.cpp +++ b/src/blackgui/components/dbownmodelscomponent.cpp @@ -17,6 +17,7 @@ #include "blackcore/db/databaseutils.h" #include "blackmisc/icons.h" #include "blackmisc/logmessage.h" +#include "blackmisc/processctrl.h" #include "blackmisc/statusmessage.h" #include "blackconfig/buildconfig.h" #include "ui_dbownmodelscomponent.h" @@ -292,6 +293,16 @@ namespace BlackGui this->requestSimulatorModels(simulator, IAircraftModelLoader::InBackgroundNoCache); } + void CDbOwnModelsComponent::runScriptCSL2XSB() + { + static const QString script = QDir(CDirectoryUtils::shareDirectory()).filePath("CSL2XSB/CSL2XSB.exe"); + for (const QString &modelDir : m_simulatorSettings.getModelDirectoriesOrDefault(CSimulatorInfo::xplane())) + { + CLogMessage(this).info(u"Running CSL2XSB on model directory %1") << modelDir; + CProcessCtrl::startDetached(script, { QDir::cleanPath(modelDir) }, true); + } + } + void CDbOwnModelsComponent::CLoadModelsMenu::customMenu(CMenuActions &menuActions) { if (!sGui || sGui->isShuttingDown()) { return; } @@ -602,6 +613,21 @@ namespace BlackGui } menuActions.addAction(m_clearCacheActions[4], CMenuAction::pathSimulatorModelsClearCache()); } + + if (sims.isXPlane() && CBuildConfig::isRunningOnWindowsNtPlatform() && CBuildConfig::buildWordSize() == 64) + { + if (!m_csl2xsbAction) + { + m_csl2xsbAction = new QAction(CIcons::appTerminal16(), "XPlane: run CSL2XSB on all models", this); + connect(m_csl2xsbAction, &QAction::triggered, ownModelsComp, [ownModelsComp](bool checked) + { + if (!ownModelsComp) { return; } + Q_UNUSED(checked) + ownModelsComp->runScriptCSL2XSB(); + }); + } + menuActions.addAction(m_csl2xsbAction, CMenuAction::pathSimulator()); + } } this->nestedCustomMenu(menuActions); } diff --git a/src/blackgui/components/dbownmodelscomponent.h b/src/blackgui/components/dbownmodelscomponent.h index d78ee27be..9e7977a64 100644 --- a/src/blackgui/components/dbownmodelscomponent.h +++ b/src/blackgui/components/dbownmodelscomponent.h @@ -192,6 +192,9 @@ namespace BlackGui //! Confirmed forced reload void confirmedForcedReload(const BlackMisc::Simulation::CSimulatorInfo &simulator); + //! Run CSL2XSB script + void runScriptCSL2XSB(); + //! The menu for loading and handling own models for mapping tasks //! \note This is specific for that very component //! \fixme MS 2018-12 Move to namespace scope and add Q_OBJECT @@ -210,6 +213,7 @@ namespace BlackGui QList m_loadActions; //!< load actions QList m_reloadActions; //!< reload actions QList m_clearCacheActions; //!< clear own models cahce if ever needed + QAction *m_csl2xsbAction = nullptr; //!< run csl2xsb script }; }; } // ns diff --git a/src/blackmisc/processctrl.cpp b/src/blackmisc/processctrl.cpp index ef50fe9b4..503c088d3 100644 --- a/src/blackmisc/processctrl.cpp +++ b/src/blackmisc/processctrl.cpp @@ -33,10 +33,11 @@ namespace BlackMisc memset (&startupInfo, 0, sizeof (startupInfo)); startupInfo.cb = sizeof (startupInfo); - QString command; - command += program; - command += ' '; - command += arguments.join(' ').replace('/', '\\'); + QString command = '"' % QString(program).replace('/', '\\') % '"'; + if (!arguments.isEmpty()) + { + command += " \"" % arguments.join('" "').replace('/', '\\') % '"'; + } DWORD flags = 0; flags |= NORMAL_PRIORITY_CLASS;