From 8bd969105a555e121c556e0645bda5cd60c54244 Mon Sep 17 00:00:00 2001 From: Klaus Basan Date: Sat, 12 May 2018 21:04:13 +0200 Subject: [PATCH] XSwiftBus install dialog (for local environment) * can also be called from menu * improved file check * renamed some functions --- src/blackgui/copyxswiftbusdialog.cpp | 7 +++--- src/blackgui/copyxswiftbusdialog.h | 4 ++-- src/blackmisc/fileutils.cpp | 15 +++++++++++- src/blackmisc/fileutils.h | 7 ++++-- .../simulation/xplane/xplaneutil.cpp | 11 +++++++-- src/blackmisc/simulation/xplane/xplaneutil.h | 3 +++ src/swiftguistandard/swiftguistd.cpp | 5 +--- src/swiftguistandard/swiftguistd.h | 3 +++ src/swiftguistandard/swiftguistdmenus.cpp | 23 ++++++++++++++++++- 9 files changed, 63 insertions(+), 15 deletions(-) diff --git a/src/blackgui/copyxswiftbusdialog.cpp b/src/blackgui/copyxswiftbusdialog.cpp index 720b0c8d2..487ab7ff4 100644 --- a/src/blackgui/copyxswiftbusdialog.cpp +++ b/src/blackgui/copyxswiftbusdialog.cpp @@ -24,11 +24,12 @@ using namespace BlackCore::Context; namespace BlackGui { - int CCopyXSwiftBusDialog::displayDialogAndCopyBuildFiles(const QString &xplaneRootDir, QWidget *parent) + int CCopyXSwiftBusDialog::displayDialogAndCopyBuildFiles(const QString &xplaneRootDir, bool checkLatestFile, QWidget *parent) { - if (!CBuildConfig::isLocalDeveloperDebugBuild()) { return -1; } - if (!CXPlaneUtil::hasNewerXSwiftBusBuild(xplaneRootDir)) { return 0; } if (sGui && sGui->isShuttingDown()) { return 0; } + if (!CBuildConfig::isLocalDeveloperDebugBuild()) { return -1; } + if (checkLatestFile && !CXPlaneUtil::hasNewerXSwiftBusBuild(xplaneRootDir)) { return 0; } + if (!CXPlaneUtil::hasXSwiftBusBuildAndPluginDir(xplaneRootDir)) { return 0; } if (sGui && sGui->getIContextSimulator()) { if (sGui->getIContextSimulator()->isSimulatorAvailable()) diff --git a/src/blackgui/copyxswiftbusdialog.h b/src/blackgui/copyxswiftbusdialog.h index 817c3cb3c..28afb5bca 100644 --- a/src/blackgui/copyxswiftbusdialog.h +++ b/src/blackgui/copyxswiftbusdialog.h @@ -24,8 +24,8 @@ namespace BlackGui { public: //! Display a dialog to copy the latest XSwiftBus files - //! \remark only displayed in a local environment - static int displayDialogAndCopyBuildFiles(const QString &xplaneRootDir, QWidget *parent = nullptr); + //! \remark normally only displayed in a local environment + static int displayDialogAndCopyBuildFiles(const QString &xplaneRootDir, bool checkLatestFile = true, QWidget *parent = nullptr); }; } // ns #endif diff --git a/src/blackmisc/fileutils.cpp b/src/blackmisc/fileutils.cpp index aadf9d948..6462f20b6 100644 --- a/src/blackmisc/fileutils.cpp +++ b/src/blackmisc/fileutils.cpp @@ -300,7 +300,7 @@ namespace BlackMisc return result; } - QFileInfo CFileUtils::findNewestFile(const QDir &dir, bool recursive, const QStringList &nameFilters, const QStringList &excludeDirectories) + QFileInfo CFileUtils::findLastModified(const QDir &dir, bool recursive, const QStringList &nameFilters, const QStringList &excludeDirectories) { if (isExcludedDirectory(dir, excludeDirectories)) { return QString(); } const QFileInfoList files = enumerateFiles(dir, recursive, nameFilters, excludeDirectories); @@ -313,6 +313,19 @@ namespace BlackMisc return *it; } + QFileInfo CFileUtils::findLastCreated(const QDir &dir, bool recursive, const QStringList &nameFilters, const QStringList &excludeDirectories) + { + if (isExcludedDirectory(dir, excludeDirectories)) { return QString(); } + const QFileInfoList files = enumerateFiles(dir, recursive, nameFilters, excludeDirectories); + if (files.isEmpty()) { return {}; } + + auto it = std::max_element(files.cbegin(), files.cend(), [](const QFileInfo & a, const QFileInfo & b) + { + return a.created() < b.created(); + }); + return *it; + } + const QStringList &CFileUtils::getSwiftExecutables() { static const QStringList executables( diff --git a/src/blackmisc/fileutils.h b/src/blackmisc/fileutils.h index 901e73607..46ac7ed9d 100644 --- a/src/blackmisc/fileutils.h +++ b/src/blackmisc/fileutils.h @@ -125,8 +125,11 @@ namespace BlackMisc //! Returns list of all files in dir, optionally matching a wildcard and predicate. static QFileInfoList enumerateFiles(const QDir &dir, bool recursive, const QStringList &nameFilters = {}, const QStringList &excludeDirectories = {}, std::function predicate = {}); - //! Returns path to the newest file in dir, optionally matching a wildcard, or empty string. - static QFileInfo findNewestFile(const QDir &dir, bool recursive, const QStringList &nameFilters = {}, const QStringList &excludeDirectories = {}); + //! Returns path to the last modifed file in dir, optionally matching a wildcard, or empty string. + static QFileInfo findLastModified(const QDir &dir, bool recursive, const QStringList &nameFilters = {}, const QStringList &excludeDirectories = {}); + + //! Returns path to the last created file in dir, optionally matching a wildcard, or empty string. + static QFileInfo findLastCreated(const QDir &dir, bool recursive, const QStringList &nameFilters = {}, const QStringList &excludeDirectories = {}); //! Get all swift executables static const QStringList &getSwiftExecutables(); diff --git a/src/blackmisc/simulation/xplane/xplaneutil.cpp b/src/blackmisc/simulation/xplane/xplaneutil.cpp index acc8626ef..47deb2c91 100644 --- a/src/blackmisc/simulation/xplane/xplaneutil.cpp +++ b/src/blackmisc/simulation/xplane/xplaneutil.cpp @@ -205,6 +205,13 @@ namespace BlackMisc return {}; } + bool CXPlaneUtil::hasXSwiftBusBuildAndPluginDir(const QString &xplaneRootDir) + { + if (CDirectoryUtils::getXSwiftBusBuildDirectory().isEmpty()) { return false; } + const QString xswiftBusPluginDir = CXPlaneUtil::xswiftbusPluginDir(xplaneRootDir); + return (!xswiftBusPluginDir.isEmpty()); + } + QStringList CXPlaneUtil::findConflictingPlugins(const QString &pluginDir) { const QStringList files = findAllXplFiles(pluginDir); @@ -246,10 +253,10 @@ namespace BlackMisc const QString xswiftBusPluginDir = CXPlaneUtil::xswiftbusPluginDir(xplaneRootDir); if (xswiftBusPluginDir.isEmpty()) { return false; } - const QFileInfo fiLatestBuild = CFileUtils::findNewestFile(CDirectoryUtils::getXSwiftBusBuildDirectory(), true, xplFileFilter()); + const QFileInfo fiLatestBuild = CFileUtils::findLastModified(CDirectoryUtils::getXSwiftBusBuildDirectory(), true, xplFileFilter()); if (!fiLatestBuild.lastModified().isValid()) { return false; } - const QFileInfo fiLatestDeployed = CFileUtils::findNewestFile(xswiftBusPluginDir, true, xplFileFilter()); + const QFileInfo fiLatestDeployed = CFileUtils::findLastModified(xswiftBusPluginDir, true, xplFileFilter()); if (!fiLatestDeployed.lastModified().isValid()) { return true; } // not yet existing // newer? diff --git a/src/blackmisc/simulation/xplane/xplaneutil.h b/src/blackmisc/simulation/xplane/xplaneutil.h index 2e04acc37..81faed28b 100644 --- a/src/blackmisc/simulation/xplane/xplaneutil.h +++ b/src/blackmisc/simulation/xplane/xplaneutil.h @@ -74,6 +74,9 @@ namespace BlackMisc //! XSwiftBus legacy directory static QString xswiftbusLegacyDir(const QString &xplaneRootDir = CXPlaneUtil::xplaneRootDir()); + //! Both directories, plugin and + static bool hasXSwiftBusBuildAndPluginDir(const QString &xplaneRootDir); + //! Finds conflicting plugins //! \remark uses CXPlaneUtil::xplanePluginPath as default static QStringList findConflictingPlugins(const QString &pluginDir = {}); diff --git a/src/swiftguistandard/swiftguistd.cpp b/src/swiftguistandard/swiftguistd.cpp index b8e5418ad..f35893eb4 100644 --- a/src/swiftguistandard/swiftguistd.cpp +++ b/src/swiftguistandard/swiftguistd.cpp @@ -18,7 +18,6 @@ #include "blackgui/components/logcomponent.h" #include "blackgui/components/dbloaddatadialog.h" #include "blackgui/components/settingscomponent.h" -#include "blackgui/copyxswiftbusdialog.h" #include "blackgui/guiapplication.h" #include "blackgui/guiutility.h" #include "blackgui/overlaymessagesframe.h" @@ -425,9 +424,7 @@ void SwiftGuiStd::verifyPrerequisites() } } - const QString xPlaneRootDir = ui->comp_MainInfoArea->getSettingsComponent()->getSimulatorSettings(CSimulatorInfo::XPLANE).getSimulatorDirectoryOrDefault(); - const int c = CCopyXSwiftBusDialog::displayDialogAndCopyBuildFiles(xPlaneRootDir, this); - if (c > 0) { CLogMessage(this).info("Copied %1 files from build directory") << c; } + this->copyXSwiftBusDialog(true); } void SwiftGuiStd::checkDbDataLoaded() diff --git a/src/swiftguistandard/swiftguistd.h b/src/swiftguistandard/swiftguistd.h index 588b6c54c..dd22ae53b 100644 --- a/src/swiftguistandard/swiftguistd.h +++ b/src/swiftguistandard/swiftguistd.h @@ -259,6 +259,9 @@ private: //! Ckeck if the DB data have been loaded void checkDbDataLoaded(); + + //! Copy the XSwiftBus files from build directory + void copyXSwiftBusDialog(bool checkFileTimestamp); }; #pragma pop_macro("interface") diff --git a/src/swiftguistandard/swiftguistdmenus.cpp b/src/swiftguistandard/swiftguistdmenus.cpp index fbca4fa9f..ecee82fed 100644 --- a/src/swiftguistandard/swiftguistdmenus.cpp +++ b/src/swiftguistandard/swiftguistdmenus.cpp @@ -12,11 +12,12 @@ #include "blackgui/guiactionbind.h" #include "blackgui/guiapplication.h" #include "blackgui/foreignwindows.h" - +#include "blackgui/copyxswiftbusdialog.h" #include "blackmisc/aviation/altitude.h" #include "blackmisc/network/urllist.h" #include "blackmisc/pq/units.h" #include "blackmisc/logmessage.h" +#include "blackconfig/buildconfig.h" #include "swiftguistd.h" #include "ui_swiftguistd.h" @@ -28,12 +29,14 @@ #include #include +using namespace BlackConfig; using namespace BlackGui; using namespace BlackCore; using namespace BlackMisc; using namespace BlackMisc::PhysicalQuantities; using namespace BlackMisc::Aviation; using namespace BlackMisc::Network; +using namespace BlackMisc::Simulation; void SwiftGuiStd::onMenuClicked() { @@ -137,6 +140,17 @@ void SwiftGuiStd::initMenus() ui->menu_InfoAreas->addActions(ui->comp_MainInfoArea->getInfoAreaSelectActions(true, ui->menu_InfoAreas)); ui->menu_MovingMap->setIcon(CIcons::swiftMap16()); + if (CBuildConfig::isLocalDeveloperDebugBuild() && ui->menu_File) + { + QAction *a = new QAction(CIcons::swift16(), "Copy XSwiftBus dialog"); + ui->menu_File->insertAction(ui->menu_File->actions().at(5), a); + c = connect(a, &QAction::triggered, this, [ = ] + { + this->copyXSwiftBusDialog(false); + }); + Q_ASSERT_X(c, Q_FUNC_INFO, "connect failed"); + } + // for hotkeys const QString swift(CGuiActionBindHandler::pathSwiftPilotClient()); static const CActionBind swiftRoot(swift, CIcons::swift16()); // inserts action for root folder @@ -145,3 +159,10 @@ void SwiftGuiStd::initMenus() m_menuHotkeyHandlers.append(CGuiActionBindHandler::bindMenu(ui->menu_File, swift + "File")); m_menuHotkeyHandlers.append(CGuiActionBindHandler::bindMenu(ui->menu_Window, swift + "Window")); } + +void SwiftGuiStd::copyXSwiftBusDialog(bool checkFileTimestamp) +{ + const QString xPlaneRootDir = ui->comp_MainInfoArea->getSettingsComponent()->getSimulatorSettings(CSimulatorInfo::XPLANE).getSimulatorDirectoryOrDefault(); + const int c = CCopyXSwiftBusDialog::displayDialogAndCopyBuildFiles(xPlaneRootDir, checkFileTimestamp, this); + if (c > 0) { CLogMessage(this).info("Copied %1 files from build directory") << c; } +}