diff --git a/src/blackcore/application.cpp b/src/blackcore/application.cpp index 51493d18c..88806a869 100644 --- a/src/blackcore/application.cpp +++ b/src/blackcore/application.cpp @@ -111,6 +111,7 @@ namespace BlackCore Q_ASSERT_X(!sApp, Q_FUNC_INFO, "already initialized"); Q_ASSERT_X(QCoreApplication::instance(), Q_FUNC_INFO, "no application object"); + m_applicationInfo.setApplicationDataDirectory(CDirectoryUtils::normalizedApplicationDataDirectory()); QCoreApplication::setApplicationName(m_applicationName); QCoreApplication::setApplicationVersion(CBuildConfig::getVersionString()); this->setObjectName(m_applicationName); @@ -138,7 +139,7 @@ namespace BlackCore const QString tempPath(this->getTemporaryDirectory()); BlackMisc::setMockCacheRootDirectory(tempPath); } - m_alreadyRunning = CApplication::getRunningApplications().containsApplication(CApplication::getSwiftApplication()); + m_alreadyRunning = CApplication::getRunningApplications().containsApplication(CApplication::getApplicationInfo().getApplication()); this->initParser(); this->initLogging(); this->tagApplicationDataDirectory(); @@ -229,12 +230,6 @@ namespace BlackCore this->gracefulShutdown(); } - const CApplicationInfo &CApplication::getApplicationInfo() const - { - static const CApplicationInfo a(CApplication::getSwiftApplication()); - return a; - } - CApplicationInfoList CApplication::getRunningApplications() { CApplicationInfoList apps; @@ -251,7 +246,7 @@ namespace BlackCore bool CApplication::isAlreadyRunning() const { - return getRunningApplications().containsBy([this](const CApplicationInfo & info) { return info.getApplication() == getSwiftApplication(); }); + return getRunningApplications().containsBy([this](const CApplicationInfo & info) { return info.getApplication() == getApplicationInfo().getApplication(); }); } bool CApplication::isShuttingDown() const diff --git a/src/blackcore/application.h b/src/blackcore/application.h index 7c16d97bf..2c65c6bdb 100644 --- a/src/blackcore/application.h +++ b/src/blackcore/application.h @@ -111,9 +111,6 @@ namespace BlackCore //! Destructor virtual ~CApplication(); - //! Application information - const BlackMisc::CApplicationInfo &getApplicationInfo() const; - //! Information about all running apps (including this one only if exec() has already been called) static BlackMisc::CApplicationInfoList getRunningApplications(); @@ -130,6 +127,9 @@ namespace BlackCore //! \threadsafe bool isShuttingDown() const; + //! swift application running + const BlackMisc::CApplicationInfo &getApplicationInfo() const { return m_applicationInfo; } + //! Application name and version const QString &getApplicationName() const { return m_applicationName; } @@ -142,9 +142,6 @@ namespace BlackCore //! Force single application (only one instance) void setSingleApplication(bool singleApplication); - //! swift application running - BlackMisc::CApplicationInfo::Application getSwiftApplication() const { return m_applicationInfo.getApplication(); } - //! Executable names for the given applications QString getExecutableForApplication(BlackMisc::CApplicationInfo::Application application) const; diff --git a/src/blackgui/components/copyconfigurationcomponent.cpp b/src/blackgui/components/copyconfigurationcomponent.cpp index b4274c516..6074db2de 100644 --- a/src/blackgui/components/copyconfigurationcomponent.cpp +++ b/src/blackgui/components/copyconfigurationcomponent.cpp @@ -24,6 +24,7 @@ #include #include #include +#include using namespace BlackMisc; using namespace BlackMisc::Simulation; @@ -246,7 +247,6 @@ namespace BlackGui destinationModel->setNameFilters(this->getSourceFileFilter()); destinationModel->setNameFilterDisables(m_nameFilterDisables); - // source const QString sourceDir = this->getOtherVersionsSelectedDirectory(); if (!sourceModel || m_initializedSourceDir != sourceDir) @@ -399,8 +399,8 @@ namespace BlackGui void CCopyConfigurationComponent::initMultiSimulatorCache(IMultiSimulatorModelCaches *cache, const QString &fileName) { const CSimulatorInfo info = cache->getSimulatorForFilename(fileName); - if (info.isNoSimulator()) return; - if (cache->isSaved(info)) return; // already a file and hence in .rev + if (info.isNoSimulator()) { return; } + if (cache->isSaved(info)) { return; } // already a file and hence in .rev const QFileInfo fi(fileName); const CStatusMessage msg = cache->setCacheTimestamp(fi.lastModified(), info); // create cache file and timestamp in .rev if (msg.isFailure()) @@ -412,13 +412,14 @@ namespace BlackGui void CCopyConfigurationComponent::initOtherSwiftVersions() { ui->cb_OtherVersions->clear(); - const QMap otherVersions = CDirectoryUtils::applicationDataDirectoryMap(true); + const QMap otherVersions = CDirectoryUtils::applicationDataDirectoryMapWithoutCurrentVersion(); for (const QString &directory : otherVersions.keys()) { const CApplicationInfo info(otherVersions.value(directory)); if (info.isNull()) { - ui->cb_OtherVersions->addItem(CDirectoryUtils::decodeNormalizedDirectory(directory)); + const QString infoString = CDirectoryUtils::decodeNormalizedDirectory(directory); + ui->cb_OtherVersions->addItem(infoString); } else { diff --git a/src/blackgui/components/copyconfigurationcomponent.h b/src/blackgui/components/copyconfigurationcomponent.h index dfdf00b49..fe1e9c02d 100644 --- a/src/blackgui/components/copyconfigurationcomponent.h +++ b/src/blackgui/components/copyconfigurationcomponent.h @@ -119,8 +119,8 @@ namespace BlackGui //! Set widths void setWidths(); - QStringList m_otherVersionDirs; QScopedPointer ui; + QStringList m_otherVersionDirs; QString m_initializedSourceDir; QString m_initializedDestinationDir; bool m_logCopiedFiles = true; @@ -128,8 +128,8 @@ namespace BlackGui bool m_withBootstrapFile = false; // caches will be explicitly initialized in initCaches - BlackMisc::Simulation::Data::CModelCaches m_modelCaches{ false, this }; - BlackMisc::Simulation::Data::CModelSetCaches m_modelSetCaches{ false, this }; + BlackMisc::Simulation::Data::CModelCaches m_modelCaches { false, this }; + BlackMisc::Simulation::Data::CModelSetCaches m_modelSetCaches { false, this }; // caches will be initialized so they can be overriden // those caches do not harm if they exists default initialized diff --git a/src/blackgui/models/serverlistmodel.h b/src/blackgui/models/serverlistmodel.h index a4da3d2a9..2d24137dd 100644 --- a/src/blackgui/models/serverlistmodel.h +++ b/src/blackgui/models/serverlistmodel.h @@ -18,7 +18,6 @@ class QObject; -namespace BlackMisc { namespace Network { class CServer; } } namespace BlackGui { namespace Models diff --git a/src/blackgui/views/aircraftmodelview.cpp b/src/blackgui/views/aircraftmodelview.cpp index 9ad5d217d..aaae73b69 100644 --- a/src/blackgui/views/aircraftmodelview.cpp +++ b/src/blackgui/views/aircraftmodelview.cpp @@ -68,18 +68,10 @@ namespace BlackGui this->setSortIndicator(); switch (mode) { - case CAircraftModelListModel::StashModel: - m_menus = MenuDefaultNoClear; - break; - case CAircraftModelListModel::Database: - m_menus = MenuDefaultDbViews; - break; - case CAircraftModelListModel::VPilotRuleModel: - m_menus = MenuDefaultNoClear | MenuStashing; - break; - case CAircraftModelListModel::OwnAircraftModelMappingTool: - m_menus = MenuDefaultNoClear | MenuStashing | MenuLoadAndSave; - break; + case CAircraftModelListModel::StashModel: m_menus = MenuDefaultNoClear; break; + case CAircraftModelListModel::Database: m_menus = MenuDefaultDbViews; break; + case CAircraftModelListModel::VPilotRuleModel: m_menus = MenuDefaultNoClear | MenuStashing; break; + case CAircraftModelListModel::OwnAircraftModelMappingTool: m_menus = MenuDefaultNoClear | MenuStashing | MenuLoadAndSave; break; case CAircraftModelListModel::OwnAircraftModelClient: default: m_menus = MenuDefaultNoClear | MenuBackend; diff --git a/src/blackgui/views/serverview.cpp b/src/blackgui/views/serverview.cpp index 9b6370a81..3b11cce27 100644 --- a/src/blackgui/views/serverview.cpp +++ b/src/blackgui/views/serverview.cpp @@ -7,8 +7,7 @@ * contained in the LICENSE file. */ -#include "blackgui/models/serverlistmodel.h" -#include "blackgui/views/serverview.h" +#include "serverview.h" using namespace BlackMisc; using namespace BlackGui::Models; diff --git a/src/blackgui/views/serverview.h b/src/blackgui/views/serverview.h index 051f1a410..35db21bd8 100644 --- a/src/blackgui/views/serverview.h +++ b/src/blackgui/views/serverview.h @@ -13,13 +13,11 @@ #define BLACKGUI_VIEWS_SERVERVIEW_H #include "blackgui/blackguiexport.h" -#include "blackgui/models/serverlistmodel.h" #include "blackgui/views/viewbase.h" -#include "blackmisc/network/serverlist.h" +#include "blackgui/models/serverlistmodel.h" class QWidget; -namespace BlackMisc { namespace Network { class CServer; } } namespace BlackGui { namespace Views diff --git a/src/blackgui/views/viewbase.cpp b/src/blackgui/views/viewbase.cpp index 90b71aa6b..0fcb02c40 100644 --- a/src/blackgui/views/viewbase.cpp +++ b/src/blackgui/views/viewbase.cpp @@ -104,7 +104,7 @@ namespace BlackGui saveJson->setContext(Qt::WidgetShortcut); QShortcut *deleteRow = new QShortcut(CShortcut::keyDelete(), this); - connect(deleteRow, &QShortcut::activated, this, &CViewBaseNonTemplate::ps_removeSelectedRows); + connect(deleteRow, &QShortcut::activated, this, &CViewBaseNonTemplate::removeSelectedRowsChecked); deleteRow->setObjectName("Remove selected rows for " + this->objectName()); deleteRow->setContext(Qt::WidgetShortcut); @@ -258,7 +258,7 @@ namespace BlackGui a->setChecked(this->displayAutomatically()); break; } - case MenuRemoveSelectedRows: { ma.addAction(CIcons::delete16(), "Remove selected rows", CMenuAction::pathViewAddRemove(), { this, &CViewBaseNonTemplate::ps_removeSelectedRows }, CShortcut::keyDelete()); break; } + case MenuRemoveSelectedRows: { ma.addAction(CIcons::delete16(), "Remove selected rows", CMenuAction::pathViewAddRemove(), { this, &CViewBaseNonTemplate::removeSelectedRowsChecked }, CShortcut::keyDelete()); break; } case MenuClear: { ma.addAction(CIcons::delete16(), "Clear", CMenuAction::pathViewAddRemove(), { this, &CViewBaseNonTemplate::clear }); break; } case MenuFilter: { @@ -827,7 +827,7 @@ namespace BlackGui } } - void CViewBaseNonTemplate::ps_removeSelectedRows() + void CViewBaseNonTemplate::removeSelectedRowsChecked() { if (!m_enableDeleteSelectedRows) { return; } this->removeSelectedRows(); diff --git a/src/blackgui/views/viewbase.h b/src/blackgui/views/viewbase.h index d9383ef7c..35bfc2824 100644 --- a/src/blackgui/views/viewbase.h +++ b/src/blackgui/views/viewbase.h @@ -540,8 +540,8 @@ namespace BlackGui void setSingleSelection(); //! @} - //! Remove selected rows - void ps_removeSelectedRows(); + //! Remove selected rows if enabled + void removeSelectedRowsChecked(); //! Toggle auto display flag void toggleAutoDisplay(); diff --git a/src/blackmisc/directoryutils.cpp b/src/blackmisc/directoryutils.cpp index 87f732cec..b371b3fce 100644 --- a/src/blackmisc/directoryutils.cpp +++ b/src/blackmisc/directoryutils.cpp @@ -11,6 +11,7 @@ #include "directoryutils.h" #include "fileutils.h" +#include "stringutils.h" #include "range.h" #include "blackconfig/buildconfig.h" #include @@ -119,7 +120,7 @@ namespace BlackMisc static const QFileInfoList fileInfoList([] { const QDir swiftAppData(CDirectoryUtils::applicationDataDirectory()); // contains 1..n subdirs - if (!swiftAppData.isReadable()) return QFileInfoList(); + if (!swiftAppData.isReadable()) { return QFileInfoList(); } return swiftAppData.entryInfoList({}, QDir::Dirs | QDir::NoDotAndDotDot, QDir::Time); }()); return fileInfoList; @@ -143,29 +144,42 @@ namespace BlackMisc return dirs; } - QMap CDirectoryUtils::applicationDataDirectoryMap(bool withoutCurrent) + const QMap &CDirectoryUtils::applicationDataDirectoryMapWithoutCurrentVersion() { - static const CApplicationInfo nullInfo; - QMap dirs; - - for (const QFileInfo &info : CDirectoryUtils::applicationDataDirectories()) + static const QMap dirs = [ = ] { - if (withoutCurrent && info.filePath().contains(normalizedApplicationDirectory(), Qt::CaseInsensitive)) continue; - const QString appInfoFile = CFileUtils::appendFilePaths(info.filePath(), CApplicationInfo::fileName()); - const QString appInfoJson = CFileUtils::readFileToString(appInfoFile); - if (appInfoJson.isEmpty()) + QMap directories; + for (const QFileInfo &info : CDirectoryUtils::applicationDataDirectories()) { - dirs.insert(info.filePath(), nullInfo); + if (caseInsensitiveStringCompare(info.filePath(), CDirectoryUtils::normalizedApplicationDataDirectory())) { continue; } + + // the application info will be written by each swift application started + // so the application type will always contain that application + const QString appInfoFile = CFileUtils::appendFilePaths(info.filePath(), CApplicationInfo::fileName()); + const QString appInfoJson = CFileUtils::readFileToString(appInfoFile); + CApplicationInfo appInfo; + if (appInfoJson.isEmpty()) + { + const QString exeDir = CDirectoryUtils::decodeNormalizedDirectory(info.filePath()); + appInfo.setExecutablePath(exeDir); + } + else + { + appInfo = CApplicationInfo::fromJson(appInfoJson); + } + appInfo.setApplicationDataDirectory(info.filePath()); + directories.insert(info.filePath(), appInfo); } - else - { - const CApplicationInfo appInfo = CApplicationInfo::fromJson(appInfoJson); - dirs.insert(info.filePath(), appInfo); - } - } + return directories; + }(); return dirs; } + bool CDirectoryUtils::hasOtherSwiftDataDirectories() + { + return CDirectoryUtils::applicationDataDirectoryMapWithoutCurrentVersion().size() > 0; + } + const QString &CDirectoryUtils::normalizedApplicationDataDirectory() { static const QString p = CFileUtils::appendFilePaths(applicationDataDirectory(), normalizedApplicationDirectory()); diff --git a/src/blackmisc/directoryutils.h b/src/blackmisc/directoryutils.h index 469a39ef5..fb3e4ed3a 100644 --- a/src/blackmisc/directoryutils.h +++ b/src/blackmisc/directoryutils.h @@ -46,6 +46,7 @@ namespace BlackMisc static QString executableFilePath(const QString &executable); //! swift application data directory, contains 0..n swift installation directories + //! \remark use CDirectoryUtils::normalizedApplicationDataDirectory for one specific version static const QString &applicationDataDirectory(); //! swift application data sub directories @@ -58,13 +59,17 @@ namespace BlackMisc static QStringList applicationDataDirectoryList(bool withoutCurrent = false, bool decodedDirName = false); //! swift application data sub directories with info if available - static QMap applicationDataDirectoryMap(bool withoutCurrent = false); + static const QMap &applicationDataDirectoryMapWithoutCurrentVersion(); + + //! Other swift data directories + static bool hasOtherSwiftDataDirectories(); //! Is MacOS application bundle? //! \remark: Means the currently running executable is a MacOS bundle, but not all our executables are bundles on MacOS static bool isMacOSAppBundle(); //! swift application data directory for one specific installation (a version) + //! \remark use CDirectoryUtils::applicationDataDirectory for one all swift versions static const QString &normalizedApplicationDataDirectory(); //! Where resource files (static DB files, ...) etc are located diff --git a/src/blackmisc/stringutils.cpp b/src/blackmisc/stringutils.cpp index 8e4d47494..1ceb76bfa 100644 --- a/src/blackmisc/stringutils.cpp +++ b/src/blackmisc/stringutils.cpp @@ -339,6 +339,6 @@ namespace BlackMisc if (in.isEmpty()) { return ignoreEmpty ? e : ea; } return QStringLiteral("\"") % in % QStringLiteral("\""); } -} +} // ns //! \endcond diff --git a/src/blackmisc/variant.cpp b/src/blackmisc/variant.cpp index be6e38427..193c7c7bd 100644 --- a/src/blackmisc/variant.cpp +++ b/src/blackmisc/variant.cpp @@ -192,7 +192,8 @@ namespace BlackMisc auto *meta = Private::getValueObjectMetaInfo(typeId); if (meta) { - CJsonScope scope("value"); + CJsonScope scope("value"); // tracker + Q_UNUSED(scope); m_v = QVariant(typeId, nullptr); // this will call convertFromJson if there is no MemoizedJson