diff --git a/src/blackgui/components/settingssimulatorcomponent.cpp b/src/blackgui/components/settingssimulatorcomponent.cpp index 8ba9acb0e..72d0aaaa4 100644 --- a/src/blackgui/components/settingssimulatorcomponent.cpp +++ b/src/blackgui/components/settingssimulatorcomponent.cpp @@ -4,6 +4,7 @@ #include "blackcore/context_simulator.h" #include "blackcore/context_network.h" #include "blackgui/pluginconfig.h" +#include "blackgui/pluginconfigwindow.h" #include "blackgui/plugindetailswindow.h" #include "blackmisc/simulation/simulatorplugininfolist.h" #include "blackmisc/simulation/simulatedaircraftlist.h" @@ -279,8 +280,8 @@ namespace BlackGui QString configId = m_plugins->getPluginConfigId(selected->getIdentifier()); IPluginConfig *config = m_plugins->getPluginById(configId); - QWidget *window = config->createConfigWindow(); -// window->setParent(qApp->activeWindow()); + CPluginConfigWindow *window = config->createConfigWindow(); + window->setParent(qApp->activeWindow()); window->setWindowFlags(Qt::Dialog); window->setAttribute(Qt::WA_DeleteOnClose); window->show(); diff --git a/src/blackgui/pluginconfig.h b/src/blackgui/pluginconfig.h index bc51c3c59..56809e491 100644 --- a/src/blackgui/pluginconfig.h +++ b/src/blackgui/pluginconfig.h @@ -5,14 +5,12 @@ * 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. - * - * Class based on qLed: Copyright (C) 2010 by P. Sereno, http://www.sereno-online.com */ //! \file #ifndef BLACKGUI_PLUGINCONFIG_H -#define BCLAKGUI_PLUGINCONFIG_H +#define BLACKGUI_PLUGINCONFIG_H #include "blackgui/blackguiexport.h" #include @@ -20,13 +18,24 @@ namespace BlackGui { + class CPluginConfigWindow; + + /** + * The interface for the plugin config. + * The plugin config plugin is always called from the GUI process in order + * to make it possible to create a config window. + * + * \sa BlackCore::ISimulator. + */ class BLACKGUI_EXPORT IPluginConfig { public: + //! Dtor. virtual ~IPluginConfig() = default; - virtual QWidget *createConfigWindow() = 0; + //! Creates a new config window and returns its pointer. + virtual CPluginConfigWindow *createConfigWindow() = 0; }; } diff --git a/src/blackgui/pluginconfigwindow.cpp b/src/blackgui/pluginconfigwindow.cpp new file mode 100644 index 000000000..7acd8ec27 --- /dev/null +++ b/src/blackgui/pluginconfigwindow.cpp @@ -0,0 +1,10 @@ +#include "pluginconfigwindow.h" + +namespace BlackGui { + + CPluginConfigWindow::CPluginConfigWindow() : QWidget(nullptr) + { + + } + +} diff --git a/src/blackgui/pluginconfigwindow.h b/src/blackgui/pluginconfigwindow.h new file mode 100644 index 000000000..a43f23592 --- /dev/null +++ b/src/blackgui/pluginconfigwindow.h @@ -0,0 +1,30 @@ +/* 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. + */ + +//! \file + +#ifndef BLACKGUI_PLUGINCONFIGWINDOW_H +#define BLACKGUI_PLUGINCONFIGWINDOW_H + +#include "blackgui/blackguiexport.h" +#include + +namespace BlackGui +{ + class BLACKGUI_EXPORT CPluginConfigWindow : public QWidget + { + Q_OBJECT + public: + //! No parent + explicit CPluginConfigWindow(); + + }; +} + +#endif // CPLUGINCONFIGWINDOW_H diff --git a/src/blackgui/qss/stdwidget.qss b/src/blackgui/qss/stdwidget.qss index 1134ecf1c..a77811a28 100644 --- a/src/blackgui/qss/stdwidget.qss +++ b/src/blackgui/qss/stdwidget.qss @@ -111,9 +111,9 @@ BlackGui--Editors--CValidationIndicator { background-image: url(:/textures/icons/textures/texture-inner.jpg); } -BlackGui--CPluginDetailsWindow { - background-image: url(:/textures/icons/textures/texture-inner.jpg); - background-color: darkslategray; +BlackGui--CPluginDetailsWindow, +BlackGui--CPluginConfigWindow { + background: black; } /** default for buttons **/ diff --git a/src/plugins/simulator/xplane/simulator_xplane.cpp b/src/plugins/simulator/xplane/simulator_xplane.cpp index 12b442da9..e2fcd6cea 100644 --- a/src/plugins/simulator/xplane/simulator_xplane.cpp +++ b/src/plugins/simulator/xplane/simulator_xplane.cpp @@ -11,6 +11,7 @@ #include "xbus_service_proxy.h" #include "xbus_traffic_proxy.h" #include "xbus_weather_proxy.h" +#include "blackcore/dbus_server.h" #include "blackmisc/logmessage.h" #include "blackmisc/blackmiscfreefunctions.h" #include "blackmisc/simulation/modelmappingsprovider.h" @@ -351,6 +352,22 @@ namespace BlackSimPlugin return CPixmap(); } + QDBusConnection CSimulatorXPlane::connectionFromString(const QString &str) + { + if (str == BlackCore::CDBusServer::sessionDBusServer()) + { + return QDBusConnection::sessionBus(); + } + else if (str == BlackCore::CDBusServer::systemDBusServer()) + { + return QDBusConnection::systemBus(); + } + else + { + Q_UNREACHABLE(); + } + } + bool CSimulatorXPlane::isPhysicallyRenderedAircraft(const CCallsign &callsign) const { //! \todo XP implement isRenderedAircraft correctly. This work around, but not really telling me if callsign is really(!) visible in SIM @@ -510,7 +527,7 @@ namespace BlackSimPlugin } else { - m_conn = QDBusConnection::sessionBus(); // TODO make this configurable + m_conn = CSimulatorXPlane::connectionFromString(m_xbusServerSetting.get()); m_watcher = new QDBusServiceWatcher(xbusServiceName(), m_conn, QDBusServiceWatcher::WatchForRegistration, this); connect(m_watcher, &QDBusServiceWatcher::serviceRegistered, this, &CSimulatorXPlaneListener::ps_serviceRegistered); } @@ -527,7 +544,7 @@ namespace BlackSimPlugin bool CSimulatorXPlaneListener::isXBusRunning() const { - QDBusConnection conn = QDBusConnection::sessionBus(); // TODO make this configurable + QDBusConnection conn = CSimulatorXPlane::connectionFromString(m_xbusServerSetting.get()); CXBusServiceProxy *service = new CXBusServiceProxy(conn); CXBusTrafficProxy *traffic = new CXBusTrafficProxy(conn); @@ -547,5 +564,15 @@ namespace BlackSimPlugin } } + void CSimulatorXPlaneListener::ps_xbusServerSettingChanged() + { + // user changed settings, restart the listener + if (m_watcher) { + CLogMessage(this).debug() << "XP: Restarting listener"; + stop(); + start(); + } + } + } // namespace } // namespace diff --git a/src/plugins/simulator/xplane/simulator_xplane.h b/src/plugins/simulator/xplane/simulator_xplane.h index e7adfd8c3..73df4cb74 100644 --- a/src/plugins/simulator/xplane/simulator_xplane.h +++ b/src/plugins/simulator/xplane/simulator_xplane.h @@ -17,6 +17,7 @@ #include "blackmisc/simulation/ownaircraftprovider.h" #include "blackmisc/simulation/aircraftmodellist.h" #include "blackmisc/pixmap.h" +#include "plugins/simulator/xplane_config/simulatorxplaneconfig.h" #include class QDBusServiceWatcher; @@ -99,6 +100,9 @@ namespace BlackSimPlugin //! \copydoc ISimulator::iconForModel virtual BlackMisc::CPixmap iconForModel(const QString &modelString) const override; + //! Creates an appropriate dbus connection from the string describing it + static QDBusConnection connectionFromString(const QString &str); + protected slots: //! \copydoc CSimulatorCommon::ps_remoteProviderAddAircraftSituation virtual void ps_remoteProviderAddAircraftSituation(const BlackMisc::Aviation::CAircraftSituation &situation) override; @@ -205,10 +209,13 @@ namespace BlackSimPlugin private slots: void ps_serviceRegistered(const QString &serviceName); + void ps_xbusServerSettingChanged(); private: QDBusConnection m_conn { "default" }; QDBusServiceWatcher *m_watcher { nullptr }; + BlackCore::CSetting m_xbusServerSetting { this, &CSimulatorXPlaneListener::ps_xbusServerSettingChanged }; + }; //! Factory for creating CSimulatorXPlane instance diff --git a/src/plugins/simulator/xplane_config/simulatorxplaneconfig.cpp b/src/plugins/simulator/xplane_config/simulatorxplaneconfig.cpp index d7dc642b1..7dc13be38 100644 --- a/src/plugins/simulator/xplane_config/simulatorxplaneconfig.cpp +++ b/src/plugins/simulator/xplane_config/simulatorxplaneconfig.cpp @@ -11,11 +11,10 @@ namespace BlackSimPlugin } - QWidget *CSimulatorXPlaneConfig::createConfigWindow() + BlackGui::CPluginConfigWindow *CSimulatorXPlaneConfig::createConfigWindow() { CSimulatorXPlaneConfigWindow* w = new CSimulatorXPlaneConfigWindow(); return w; } - } } diff --git a/src/plugins/simulator/xplane_config/simulatorxplaneconfig.h b/src/plugins/simulator/xplane_config/simulatorxplaneconfig.h index f56769191..63f2105f7 100644 --- a/src/plugins/simulator/xplane_config/simulatorxplaneconfig.h +++ b/src/plugins/simulator/xplane_config/simulatorxplaneconfig.h @@ -13,12 +13,21 @@ #define BLACKSIMPLUGIN_SIMULATOR_XPLANE_CONFIG_H #include "blackgui/pluginconfig.h" - +#include "blackcore/settingscache.h" namespace BlackSimPlugin { namespace XPlane { + struct XBusServer : public BlackCore::CSettingTrait + { + //! \copydoc BlackCore::CSetting::key + static const char *key() { return "xbus/server"; } + + //! \copydoc BlackCore::CSetting::defaultValue + static QString defaultValue() { return QStringLiteral("session"); } + }; + /** * Config plugin for the X-Plane plugin. */ @@ -33,7 +42,7 @@ namespace BlackSimPlugin CSimulatorXPlaneConfig(QObject *parent = nullptr); //! \copydoc BlackGui::IPluginConfig::createConfigWindow() - QWidget *createConfigWindow() override; + BlackGui::CPluginConfigWindow *createConfigWindow() override; }; } diff --git a/src/plugins/simulator/xplane_config/simulatorxplaneconfigwindow.cpp b/src/plugins/simulator/xplane_config/simulatorxplaneconfigwindow.cpp index 7c1737415..732e56c2e 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" +using namespace BlackGui; namespace BlackSimPlugin { @@ -9,7 +10,6 @@ namespace BlackSimPlugin { CSimulatorXPlaneConfigWindow::CSimulatorXPlaneConfigWindow() : - QWidget(nullptr), ui(new Ui::CSimulatorXPlaneConfigWindow) { ui->setupUi(this); @@ -17,7 +17,11 @@ namespace BlackSimPlugin ui->cp_XBusServer->addItem(BlackCore::CDBusServer::sessionDBusServer()); ui->cp_XBusServer->addItem(BlackCore::CDBusServer::systemDBusServer()); + 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.get()); } CSimulatorXPlaneConfigWindow::~CSimulatorXPlaneConfigWindow() @@ -25,5 +29,13 @@ namespace BlackSimPlugin } + void CSimulatorXPlaneConfigWindow::ps_storeSettings() + { + if (ui->cp_XBusServer->currentText() != m_xbusServerSetting.get()) + { + m_xbusServerSetting.set(ui->cp_XBusServer->currentText()); + } + } + } } diff --git a/src/plugins/simulator/xplane_config/simulatorxplaneconfigwindow.h b/src/plugins/simulator/xplane_config/simulatorxplaneconfigwindow.h index bb2f6fa7f..32ba6db43 100644 --- a/src/plugins/simulator/xplane_config/simulatorxplaneconfigwindow.h +++ b/src/plugins/simulator/xplane_config/simulatorxplaneconfigwindow.h @@ -12,6 +12,8 @@ #ifndef BLACKSIMPLUGIN_SIMULATOR_XPLANE_CONFIG_WINDOW_H #define BLACKSIMPLUGIN_SIMULATOR_XPLANE_CONFIG_WINDOW_H +#include "simulatorxplaneconfig.h" +#include "blackgui/pluginconfigwindow.h" #include #include @@ -26,7 +28,7 @@ namespace BlackSimPlugin /** * A window that shows all the X-Plane plugin options. */ - class CSimulatorXPlaneConfigWindow : public QWidget + class CSimulatorXPlaneConfigWindow : public BlackGui::CPluginConfigWindow { Q_OBJECT @@ -37,9 +39,14 @@ namespace BlackSimPlugin //! Dtor. virtual ~CSimulatorXPlaneConfigWindow(); + private slots: + void ps_storeSettings(); + private: QScopedPointer ui; + BlackCore::CSetting m_xbusServerSetting { this }; + }; } }