From fceea61e4c4cb8df1b05d9e4b3f6bf56fbf1e40c Mon Sep 17 00:00:00 2001 From: Klaus Basan Date: Wed, 9 Jul 2014 19:59:20 +0200 Subject: [PATCH] refs #289, simulator component GUI for time sync --- src/blackgui/settingssimulatorcomponent.cpp | 86 +++++++++++++++++--- src/blackgui/settingssimulatorcomponent.h | 10 ++- src/blackgui/settingssimulatorcomponent.ui | 88 +++++++++++++++++++-- 3 files changed, 164 insertions(+), 20 deletions(-) diff --git a/src/blackgui/settingssimulatorcomponent.cpp b/src/blackgui/settingssimulatorcomponent.cpp index ce2d419bc..da4059357 100644 --- a/src/blackgui/settingssimulatorcomponent.cpp +++ b/src/blackgui/settingssimulatorcomponent.cpp @@ -10,6 +10,7 @@ using namespace BlackMisc; using namespace BlackMisc::Settings; +using namespace BlackMisc::PhysicalQuantities; using namespace BlackSim; using namespace BlackSim::Settings; using namespace BlackCore; @@ -31,11 +32,12 @@ namespace BlackGui void CSettingsSimulatorComponent::runtimeHasBeenSet() { Q_ASSERT(this->getIContextSimulator()); + Q_ASSERT(this->getIContextSettings()); if (this->getIContextSimulator()) { QStringList plugins = this->getIContextSimulator()->getAvailableSimulatorPlugins().toStringList(true); CSimulatorInfo currentDriver = this->getIContextSimulator()->getSimulatorInfo(); - this->ui->cb_SimulatorDriver->addItems(plugins); + this->ui->cb_Plugins->addItems(plugins); this->setCurrentPlugin(currentDriver); // disable / enable driver specific GUI parts @@ -43,14 +45,38 @@ namespace BlackGui this->getIContextSimulator()->getAvailableSimulatorPlugins().supportsSimulator(CSimulatorInfo::FSX()); this->ui->comp_SettingsSimulatorFsx->setVisible(fsxDriver); - // only with set GUI values - bool connected = this->connect(this->ui->cb_SimulatorDriver, SIGNAL(currentIndexChanged(int)), this, SLOT(pluginHasChanged(int))); + // only with simulator context set GUI values + bool connected = this->connect(this->ui->cb_Plugins, SIGNAL(currentIndexChanged(int)), this, SLOT(ps_pluginHasChanged(int))); Q_ASSERT(connected); Q_UNUSED(connected); } + + if (this->getIContextSettings()) + { + connect(this->getIContextSettings(), &IContextSettings::changedSettings, this, &CSettingsSimulatorComponent::ps_settingsHaveChanged); + } + + connect(this->ui->cb_TimeSync, &QCheckBox::released, this, &CSettingsSimulatorComponent::ps_guiValueHasChanged); + connect(this->ui->le_TimeSyncOffset, &QLineEdit::returnPressed, this, &CSettingsSimulatorComponent::ps_guiValueHasChanged); } - void CSettingsSimulatorComponent::pluginHasChanged(int index) + void CSettingsSimulatorComponent::setCurrentPlugin(const CSimulatorInfo &plugin) + { + if (plugin.isUnspecified()) return; + const QString searchFor = plugin.getShortName(); + for (int i = 0; i < this->ui->cb_Plugins->count(); ++i) + { + const QString t = ui->cb_Plugins->itemText(i); + if (t.indexOf(searchFor, 0, Qt::CaseInsensitive) >= 0) + { + if (i == this->ui->cb_Plugins->currentIndex()) return; + this->ui->cb_Plugins->setCurrentIndex(i); + break; + } + } + } + + void CSettingsSimulatorComponent::ps_pluginHasChanged(int index) { Q_ASSERT(this->getIContextSimulator()); Q_ASSERT(this->getIContextSettings()); @@ -76,19 +102,53 @@ namespace BlackGui ); } - void CSettingsSimulatorComponent::setCurrentPlugin(const CSimulatorInfo &driver) + void CSettingsSimulatorComponent::ps_settingsHaveChanged(uint settingsType) { - if (driver.isUnspecified()) return; - const QString searchFor = driver.getShortName(); - for (int i = 0; i < this->ui->cb_SimulatorDriver->count(); ++i) + Q_ASSERT(this->getIContextSettings()); + IContextSettings::SettingsType type = static_cast(settingsType); + if (type != IContextSettings::SettingsSimulator || !this->getIContextSettings()) return; + CSettingsSimulator simSettings = this->getIContextSettings()->getSimulatorSettings(); + + this->setCurrentPlugin(simSettings.getSelectedPlugin()); + this->ui->le_TimeSyncOffset->setText(simSettings.getSyncTimeOffset().formattedHrsMin()); + this->ui->cb_TimeSync->setChecked(simSettings.isTimeSyncEnabled()); + } + + void CSettingsSimulatorComponent::ps_guiValueHasChanged() + { + Q_ASSERT(this->getIContextSettings()); + if (!this->getIContextSettings()) return; + + QObject *sender = QObject::sender(); + if (!sender) return; + + const QString ps = IContextSettings::PathSimulatorSettings(); + CStatusMessageList msgs; + if (sender == this->ui->cb_TimeSync) { - const QString t = ui->cb_SimulatorDriver->itemText(i); - if (t.indexOf(searchFor, 0, Qt::CaseInsensitive) >= 0) + bool timeSync = this->ui->cb_TimeSync->isChecked(); + msgs = this->getIContextSettings()->value(CSettingUtilities::appendPaths(ps, CSettingsSimulator::ValueSyncTime()), CSettingUtilities::CmdUpdate(), QVariant(timeSync)); + } + else if (sender == this->ui->le_TimeSyncOffset) + { + const QString os = this->ui->le_TimeSyncOffset->text(); + CTime ost(0, CTimeUnit::hrmin()); + if (!os.isEmpty()) { - if (i == this->ui->cb_SimulatorDriver->currentIndex()) return; - this->ui->cb_SimulatorDriver->setCurrentIndex(i); - break; + ost.parseFromString(os); } + if (ost.isNull()) + { + msgs.push_back(CStatusMessage::getValidationError("Invalid offset time")); + } + else + { + msgs = this->getIContextSettings()->value(CSettingUtilities::appendPaths(ps, CSettingsSimulator::ValueSyncTimeOffset()), CSettingUtilities::CmdUpdate(), ost.toQVariant()); + } + } + if (!msgs.isEmpty()) + { + this->getIContextApplication()->sendStatusMessages(msgs); } } diff --git a/src/blackgui/settingssimulatorcomponent.h b/src/blackgui/settingssimulatorcomponent.h index 982bcb836..5e544ce23 100644 --- a/src/blackgui/settingssimulatorcomponent.h +++ b/src/blackgui/settingssimulatorcomponent.h @@ -28,13 +28,19 @@ namespace BlackGui private slots: //! Driver changed - void pluginHasChanged(int index); + void ps_pluginHasChanged(int index); + + //! Settings have been changed + void ps_settingsHaveChanged(uint settingsType); + + //! A GUI value has been changed + void ps_guiValueHasChanged(); private: Ui::CSettingsSimulatorComponent *ui; //!< UI //! Smarter way to set current driver, avoids unnecessary signals and less formatting dependend - void setCurrentPlugin(const BlackSim::CSimulatorInfo &driver); + void setCurrentPlugin(const BlackSim::CSimulatorInfo &plugin); }; diff --git a/src/blackgui/settingssimulatorcomponent.ui b/src/blackgui/settingssimulatorcomponent.ui index 3e14671a3..af2c4a340 100644 --- a/src/blackgui/settingssimulatorcomponent.ui +++ b/src/blackgui/settingssimulatorcomponent.ui @@ -39,23 +39,101 @@ + + QFormLayout::AllNonFixedFieldsGrow + + + 10 + + + 6 + + + + + <html><head/><body><p><span style=" font-size:10pt; font-weight:600;">All simulators</span></p></body></html> + + + - + Driver - + - - + + - <html><head/><body><p><span style=" font-size:10pt; font-weight:600;">All simulators</span></p></body></html> + Time synchronization + + + + + 4 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + + + + 0 + 0 + + + + + 75 + 16777215 + + + + #99:99 + + + +00:00 + + + 6 + + + + + + + + 0 + 0 + + + + offset +/-hh:mm + + + + + +