diff --git a/src/blackgui/pluginconfigwindow.h b/src/blackgui/pluginconfigwindow.h index 36302c574..4d4c0af3d 100644 --- a/src/blackgui/pluginconfigwindow.h +++ b/src/blackgui/pluginconfigwindow.h @@ -17,6 +17,9 @@ namespace BlackGui { + /** + * Base class for plugin config window. + */ class BLACKGUI_EXPORT CPluginConfigWindow : public QWidget { Q_OBJECT diff --git a/src/blackgui/qss/stdwidget.qss b/src/blackgui/qss/stdwidget.qss index a77811a28..855f1914d 100644 --- a/src/blackgui/qss/stdwidget.qss +++ b/src/blackgui/qss/stdwidget.qss @@ -47,6 +47,14 @@ QDialog::separator:hover { background: transparent; } +QFileDialog #sidebar { + background: black; +} + +QFileDialog QToolButton { + background: inherit; +} + /** Required when dock widget is floating 1) background-image not working on QDockWidget, so I use direct children for that diff --git a/src/blackmisc/fileutilities.cpp b/src/blackmisc/fileutilities.cpp index 799a2a8cf..568c43c8e 100644 --- a/src/blackmisc/fileutilities.cpp +++ b/src/blackmisc/fileutilities.cpp @@ -59,4 +59,32 @@ namespace BlackMisc return QDir::cleanPath(path1 + QDir::separator() + path2); } + bool CFileUtils::copyRecursively(const QString &sourceDir, const QString &destinationDir) + { + QFileInfo sourceFileInfo(sourceDir); + if (sourceFileInfo.isDir()) + { + QDir targetDir(destinationDir); + if (!targetDir.mkpath(".")) + { + return false; + } + + QDir originDir(sourceFileInfo.absoluteFilePath()); + auto fileNames = originDir.entryList(QDir::Files | QDir::Dirs | QDir::NoDotAndDotDot | QDir::Hidden | QDir::System); + for (const QString &fileName: fileNames) + { + if (!copyRecursively(originDir.absoluteFilePath(fileName), targetDir.absoluteFilePath(fileName))) + return false; + } + } + else + { + if (!QFile::copy(sourceDir, destinationDir)) + return false; + } + + return true; + } + } // ns diff --git a/src/blackmisc/fileutilities.h b/src/blackmisc/fileutilities.h index 22b0c2ff1..12f908369 100644 --- a/src/blackmisc/fileutilities.h +++ b/src/blackmisc/fileutilities.h @@ -39,6 +39,10 @@ namespace BlackMisc //! Append file paths //! \sa CNetworkUtils::buildUrl for URLs static QString appendFilePaths(const QString &path1, const QString &path2); + + //! If `sourceDir` is a directory, copies it recursively, so that `sourceDir` becomes `destinationDir`. + //! If it is a file, just copies the file. + static bool copyRecursively(const QString &sourceDir, const QString &destinationDir); }; } // ns diff --git a/src/plugins/simulator/xplane_config/plugin_xplane_config.pro b/src/plugins/simulator/xplane_config/plugin_xplane_config.pro index e7d09acd2..7c059992d 100644 --- a/src/plugins/simulator/xplane_config/plugin_xplane_config.pro +++ b/src/plugins/simulator/xplane_config/plugin_xplane_config.pro @@ -15,6 +15,6 @@ HEADERS += *.h FORMS += *.ui DISTFILES += simulator_xplane_config.json -DESTDIR = $$BuildRoot/bin/plugins/simulator +DESTDIR = $$DestRoot/bin/plugins/simulator load(common_post) diff --git a/src/plugins/simulator/xplane_config/simulatorxplaneconfigwindow.cpp b/src/plugins/simulator/xplane_config/simulatorxplaneconfigwindow.cpp index 13d361c2b..d11c80125 100644 --- a/src/plugins/simulator/xplane_config/simulatorxplaneconfigwindow.cpp +++ b/src/plugins/simulator/xplane_config/simulatorxplaneconfigwindow.cpp @@ -2,6 +2,7 @@ #include "ui_simulatorxplaneconfigwindow.h" #include "blackcore/dbus_server.h" #include "blackmisc/simulation/xplane/xplaneutil.h" +#include "blackmisc/fileutilities.h" #include #include #include @@ -10,6 +11,14 @@ using namespace BlackGui; +namespace +{ + QString xBusOriginDir() + { + return QCoreApplication::applicationDirPath() % QStringLiteral("/../xbus"); + } +} + namespace BlackSimPlugin { namespace XPlane @@ -30,7 +39,10 @@ namespace BlackSimPlugin ui->cp_XBusServer->setCurrentText(m_xbusServerSetting.get()); - connect(ui->pb_InstallXBus, &QPushButton::clicked, this, &CSimulatorXPlaneConfigWindow::ps_installXBus); + if (xBusAvailable()) + connect(ui->pb_InstallXBus, &QPushButton::clicked, this, &CSimulatorXPlaneConfigWindow::ps_installXBus); + else + ui->pb_InstallXBus->setEnabled(false); } CSimulatorXPlaneConfigWindow::~CSimulatorXPlaneConfigWindow() @@ -38,6 +50,11 @@ namespace BlackSimPlugin } + bool CSimulatorXPlaneConfigWindow::xBusAvailable() + { + return QDir(xBusOriginDir()).exists(); + } + void CSimulatorXPlaneConfigWindow::ps_storeSettings() { if (ui->cp_XBusServer->currentText() != m_xbusServerSetting.get()) @@ -55,23 +72,30 @@ namespace BlackSimPlugin QString path = QFileDialog::getExistingDirectory(parentWidget(), tr("Choose your X-Plane install directory"), xPlaneLocation, - QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks); + QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks | QFileDialog::DontUseNativeDialog); - path.append("/Resources/plugins/xbus/64/"); - QDir xbusDir(path); - if (!xbusDir.exists()) + if (path.isEmpty()) // canceled + return; + + path.append("/Resources/plugins"); + if (!QDir(path).exists()) { - if (!xbusDir.mkpath(".")) - { - return; - } + QMessageBox::warning(this, tr("Invalid X-Plane directory"), tr("%1 is not a valid X-Plane installation.").arg(path)); + return; } - QString origin = QCoreApplication::applicationDirPath() % QStringLiteral("/../xbus/64/lin.xpl"); - QString destination = path % "/lin.xpl"; - QFile::copy(origin, destination); + path.append("/xbus"); - QMessageBox::information(this, tr("XBus installed"), tr("You may now launch your X-Plane and start using XBus!")); + // TODO Use QtConcurrent here, maybe? + bool result = BlackMisc::CFileUtils::copyRecursively(xBusOriginDir(), path); + if (result) + { + QMessageBox::information(this, tr("XBus installed"), tr("You may now launch your X-Plane and start using XBus!")); + } + else + { + QMessageBox::warning(this, tr("Failed installing XBus"), tr("Failed installing the XBus plugin in your X-Plane installation directory; try installing it manually.")); + } } } } diff --git a/src/plugins/simulator/xplane_config/simulatorxplaneconfigwindow.h b/src/plugins/simulator/xplane_config/simulatorxplaneconfigwindow.h index ac7a43b62..ef5a9a464 100644 --- a/src/plugins/simulator/xplane_config/simulatorxplaneconfigwindow.h +++ b/src/plugins/simulator/xplane_config/simulatorxplaneconfigwindow.h @@ -38,6 +38,10 @@ namespace BlackSimPlugin //! Dtor. virtual ~CSimulatorXPlaneConfigWindow(); + private: + //! Checks whether xbus is present in the distributed directory. + bool xBusAvailable(); + private slots: void ps_storeSettings(); void ps_installXBus();