From 8b69b7a637014293a4611463931ffede2a30b1a4 Mon Sep 17 00:00:00 2001 From: Lars Toenning Date: Sun, 12 May 2019 10:05:38 +0200 Subject: [PATCH] Ref T631, Adding FG default directories Only works on windows so far --- .../aircraftmodelloaderflightgear.cpp | 11 ++- .../simulation/flightgear/flightgearutil.cpp | 73 +++++++++++++++++++ .../simulation/flightgear/flightgearutil.h | 51 +++++++++++++ .../simulation/settings/simulatorsettings.cpp | 10 ++- 4 files changed, 137 insertions(+), 8 deletions(-) create mode 100644 src/blackmisc/simulation/flightgear/flightgearutil.cpp create mode 100644 src/blackmisc/simulation/flightgear/flightgearutil.h diff --git a/src/blackmisc/simulation/flightgear/aircraftmodelloaderflightgear.cpp b/src/blackmisc/simulation/flightgear/aircraftmodelloaderflightgear.cpp index bdb9bc1de..6be7fafca 100644 --- a/src/blackmisc/simulation/flightgear/aircraftmodelloaderflightgear.cpp +++ b/src/blackmisc/simulation/flightgear/aircraftmodelloaderflightgear.cpp @@ -51,7 +51,7 @@ namespace BlackMisc { aircraftIt.next(); if (CFileUtils::isExcludedDirectory(aircraftIt.fileInfo(), excludeDirectories, Qt::CaseInsensitive)) { continue; } - if (aircraftIt.filePath().toStdString().find("/AI/Aircraft") != std::string::npos) { continue; } + if (aircraftIt.filePath().contains("/AI/Aircraft")) { continue; } CAircraftModel model; QString modelName = aircraftIt.fileName(); modelName = modelName.remove("-set.xml"); @@ -108,11 +108,14 @@ namespace BlackMisc CAircraftModelList allModels; for (const QString &rootDirectory : rootDirectories) { - if (QDir(rootDirectory + "/AI/Aircraft").exists()) + QString dir = rootDirectory; + dir.replace('\\','/'); + if (dir.contains("/AI/Aircraft")) { - allModels.push_back(parseAIAirplanes(rootDirectory + "/AI/Aircraft", excludeDirectories)); + allModels.push_back(parseAIAirplanes(dir, excludeDirectories)); + } else { + allModels.push_back(parseFlyableAirplanes(dir, excludeDirectories)); } - allModels.push_back(parseFlyableAirplanes(rootDirectory, excludeDirectories)); } return allModels; diff --git a/src/blackmisc/simulation/flightgear/flightgearutil.cpp b/src/blackmisc/simulation/flightgear/flightgearutil.cpp new file mode 100644 index 000000000..708b3fbb4 --- /dev/null +++ b/src/blackmisc/simulation/flightgear/flightgearutil.cpp @@ -0,0 +1,73 @@ +/* Copyright (C) 2019 + * swift Project Community / Contributors + * + * This file is part of swift project. It is subject to the license terms in the LICENSE file found in the top-level + * directory of this distribution. No part of swift project, including this file, may be copied, modified, propagated, + * or distributed except according to the terms contained in the LICENSE file. + */ + +#include "flightgearutil.h" +#include "blackmisc/fileutils.h" +#include "blackmisc/directoryutils.h" +#include "blackconfig/buildconfig.h" +#include "qsystemdetection.h" +#include +#include +#include +#include +#include +#include +#include + +using namespace BlackConfig; + +namespace BlackMisc +{ + namespace Simulation + { + namespace Flightgear + { + + const QString &CFlightgearUtil::flightgearRootDir() + { + static QString flightgearRootDir; + if (CBuildConfig::isRunningOnWindowsNtPlatform()){ + QSettings flightgearRegistry("HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\FlightGear_is1", QSettings::NativeFormat); + flightgearRootDir = flightgearRegistry.value("InstallLocation").toString().trimmed(); + } + return flightgearRootDir; + } + + + bool CFlightgearUtil::isFlightgearRootDirExisting() + { + static const bool exists = QDir(flightgearRootDir()).exists(); + return exists; + } + + QStringList CFlightgearUtil::modelDirectoriesFromSimDir(const QString &simulatorDir) + { + QStringList dirs; + if (CBuildConfig::isRunningOnWindowsNtPlatform() && !simulatorDir.isEmpty()){ + QString terraSyncFolder = QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation) + "/Flightgear/Aircraft"; + if(QDir(terraSyncFolder).exists()){ dirs.append(terraSyncFolder); } + QString fgdataAIFolder = simulatorDir + "data/AI/Aircraft"; + if (QDir(fgdataAIFolder).exists()) { dirs.append(fgdataAIFolder); } + } + return dirs; + } + + const QStringList &CFlightgearUtil::flightgearModelDirectories() + { + static const QStringList dirs = flightgearRootDir().isEmpty() ? QStringList() : modelDirectoriesFromSimDir(flightgearRootDir()); + return dirs; + } + + const QStringList &CFlightgearUtil::flightgearModelExcludeDirectoryPatterns() + { + static const QStringList empty; + return empty; + } + } // namespace + } // namespace +} // namespace diff --git a/src/blackmisc/simulation/flightgear/flightgearutil.h b/src/blackmisc/simulation/flightgear/flightgearutil.h new file mode 100644 index 000000000..6aea400ad --- /dev/null +++ b/src/blackmisc/simulation/flightgear/flightgearutil.h @@ -0,0 +1,51 @@ +/* Copyright (C) 2019 + * swift Project Community / Contributors + * + * This file is part of swift project. It is subject to the license terms in the LICENSE file found in the top-level + * directory of this distribution. No part of swift project, including this file, may be copied, modified, propagated, + * or distributed except according to the terms contained in the LICENSE file. + */ + +//! \file + +#ifndef BLACKMISC_SIMULATION_FLIGHTGEAR_FLIGHTGEARUTIL_H +#define BLACKMISC_SIMULATION_FLIGHTGEAR_FLIGHTGEARUTIL_H + +#include "blackmisc/blackmiscexport.h" + +#include + +namespace BlackMisc +{ + namespace Simulation + { + namespace Flightgear + { + //! Flightgear utils + class BLACKMISC_EXPORT CFlightgearUtil + { + public: + //! Constructor + CFlightgearUtil() = delete; + + //! Flightgear root directory + //! Currently only available for windows and if Flightgear is installed through installer. + static const QString &flightgearRootDir(); + + //! Is the flightgearRootDir existing? + static bool isFlightgearRootDirExisting(); + + //! Model directories from simulator directory + static QStringList modelDirectoriesFromSimDir(const QString &simulatorDir); + + //! Directories with models + static const QStringList &flightgearModelDirectories(); + + //! Exclude directories for models + static const QStringList &flightgearModelExcludeDirectoryPatterns(); + }; + } // namespace + } // namespace +} // namespace + +#endif // guard diff --git a/src/blackmisc/simulation/settings/simulatorsettings.cpp b/src/blackmisc/simulation/settings/simulatorsettings.cpp index 7dbfb939b..ad48239b5 100644 --- a/src/blackmisc/simulation/settings/simulatorsettings.cpp +++ b/src/blackmisc/simulation/settings/simulatorsettings.cpp @@ -10,6 +10,7 @@ #include "blackmisc/simulation/simulatedaircraft.h" #include "blackmisc/simulation/fscommon/fscommonutil.h" #include "blackmisc/simulation/xplane/xplaneutil.h" +#include "blackmisc/simulation/flightgear/flightgearutil.h" #include "blackmisc/stringutils.h" #include "blackconfig/buildconfig.h" #include @@ -18,6 +19,7 @@ using namespace BlackConfig; using namespace BlackMisc::PhysicalQuantities; using namespace BlackMisc::Simulation::FsCommon; using namespace BlackMisc::Simulation::XPlane; +using namespace BlackMisc::Simulation::Flightgear; namespace BlackMisc { @@ -497,7 +499,7 @@ namespace BlackMisc QStringList dirs; switch (m_simulator.getSimulator()) { - case CSimulatorInfo::FG: break; + case CSimulatorInfo::FG: dirs = QStringList(CFlightgearUtil::modelDirectoriesFromSimDir(s)); break; case CSimulatorInfo::FS9: dirs = QStringList({CFsCommonUtil::fs9AircraftDirFromSimDir(s)}); break; case CSimulatorInfo::FSX: dirs = QStringList({CFsCommonUtil::fsxSimObjectsDirFromSimDir(s)}); break; case CSimulatorInfo::P3D: @@ -570,7 +572,7 @@ namespace BlackMisc { case CSimulatorInfo::FG: { - return e; + return CFlightgearUtil::flightgearModelDirectories(); } case CSimulatorInfo::FS9: { @@ -607,7 +609,7 @@ namespace BlackMisc static const QString empty; switch (simulator.getSimulator()) { - case CSimulatorInfo::FG: return empty; + case CSimulatorInfo::FG: return CFlightgearUtil::flightgearRootDir(); case CSimulatorInfo::FS9: return CFsCommonUtil::fs9Dir(); case CSimulatorInfo::FSX: return CFsCommonUtil::fsxDir(); case CSimulatorInfo::P3D: return CFsCommonUtil::p3dDir(); @@ -625,7 +627,7 @@ namespace BlackMisc static const QStringList empty; switch (simulator.getSimulator()) { - case CSimulatorInfo::FG: return empty; + case CSimulatorInfo::FG: return CFlightgearUtil::flightgearModelExcludeDirectoryPatterns(); case CSimulatorInfo::FS9: return CFsCommonUtil::fs9AircraftObjectsExcludeDirectoryPatterns(); case CSimulatorInfo::FSX: return CFsCommonUtil::fsxSimObjectsExcludeDirectoryPatterns(); case CSimulatorInfo::P3D: return CFsCommonUtil::p3dSimObjectsExcludeDirectoryPatterns();