Files
pilotclient/src/plugins/simulator/xplaneconfig/simulatorxplaneconfigwindow.cpp
2016-06-08 21:30:56 +02:00

120 lines
4.2 KiB
C++

/* Copyright (C) 2015
* 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 and at http://www.swift-project.org/license.html. 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 "simulatorxplaneconfigwindow.h"
#include "blackcore/application.h"
#include "blackmisc/directoryutils.h"
#include "blackmisc/dbusserver.h"
#include "blackmisc/fileutils.h"
#include "blackmisc/simulation/xplane/xplaneutil.h"
#include "ui_simulatorxplaneconfigwindow.h"
#include <QComboBox>
#include <QDialogButtonBox>
#include <QDir>
#include <QFileDialog>
#include <QFlags>
#include <QMessageBox>
#include <QPushButton>
#include <QString>
#include <QStringBuilder>
class QWidget;
using namespace BlackGui;
using namespace BlackMisc;
namespace
{
QString xBusOriginDir()
{
return CDirectoryUtils::applicationDirectoryPath() % QStringLiteral("/../xbus");
}
}
namespace BlackSimPlugin
{
namespace XPlane
{
CSimulatorXPlaneConfigWindow::CSimulatorXPlaneConfigWindow(QWidget *parent) :
CPluginConfigWindow(parent),
ui(new Ui::CSimulatorXPlaneConfigWindow)
{
ui->setupUi(this);
ui->cp_XBusServer->addItem(BlackMisc::CDBusServer::sessionBusAddress());
ui->cp_XBusServer->addItem(BlackMisc::CDBusServer::systemBusAddress());
connect(ui->bb_OkCancel, &QDialogButtonBox::accepted, this, &CSimulatorXPlaneConfigWindow::ps_storeSettings);
connect(ui->bb_OkCancel, &QDialogButtonBox::accepted, this, &CSimulatorXPlaneConfigWindow::close);
connect(ui->bb_OkCancel, &QDialogButtonBox::rejected, this, &CSimulatorXPlaneConfigWindow::close);
ui->cp_XBusServer->setCurrentText(m_xbusServerSetting.getThreadLocal());
if (xBusAvailable())
connect(ui->pb_InstallXBus, &QPushButton::clicked, this, &CSimulatorXPlaneConfigWindow::ps_installXBus);
else
ui->pb_InstallXBus->setEnabled(false);
}
CSimulatorXPlaneConfigWindow::~CSimulatorXPlaneConfigWindow()
{
}
bool CSimulatorXPlaneConfigWindow::xBusAvailable()
{
return QDir(xBusOriginDir()).exists();
}
void CSimulatorXPlaneConfigWindow::ps_storeSettings()
{
if (ui->cp_XBusServer->currentText() != m_xbusServerSetting.getThreadLocal())
{
m_xbusServerSetting.set(ui->cp_XBusServer->currentText());
}
}
void CSimulatorXPlaneConfigWindow::ps_installXBus()
{
QString xPlaneLocation = BlackMisc::Simulation::XPlane::CXPlaneUtil::xplane10Dir();
if (xPlaneLocation.isEmpty())
xPlaneLocation = BlackMisc::Simulation::XPlane::CXPlaneUtil::xplane9Dir();
QString path = QFileDialog::getExistingDirectory(parentWidget(),
tr("Choose your X-Plane install directory"),
xPlaneLocation,
QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks | QFileDialog::DontUseNativeDialog);
if (path.isEmpty()) // canceled
return;
path.append("/Resources/plugins");
if (!QDir(path).exists())
{
QMessageBox::warning(this, tr("Invalid X-Plane directory"), tr("%1 is not a valid X-Plane installation.").arg(path));
return;
}
path.append("/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."));
}
}
}
}