mirror of
https://github.com/swift-project/pilotclient.git
synced 2026-04-06 01:45:38 +08:00
164 lines
6.9 KiB
C++
164 lines
6.9 KiB
C++
#include "settingssimulatorcomponent.h"
|
|
#include "ui_settingssimulatorcomponent.h"
|
|
|
|
#include "blackcore/context_settings.h"
|
|
#include "blacksim/simulatorinfolist.h"
|
|
#include "blacksim/setsimulator.h"
|
|
#include "blackmisc/settingutilities.h"
|
|
|
|
#include <QComboBox>
|
|
|
|
using namespace BlackMisc;
|
|
using namespace BlackMisc::Settings;
|
|
using namespace BlackMisc::PhysicalQuantities;
|
|
using namespace BlackSim;
|
|
using namespace BlackSim::Settings;
|
|
using namespace BlackCore;
|
|
|
|
namespace BlackGui
|
|
{
|
|
namespace Components
|
|
{
|
|
CSettingsSimulatorComponent::CSettingsSimulatorComponent(QWidget *parent) :
|
|
QFrame(parent), CRuntimeBasedComponent(nullptr, false),
|
|
ui(new Ui::CSettingsSimulatorComponent)
|
|
{
|
|
ui->setupUi(this);
|
|
}
|
|
|
|
CSettingsSimulatorComponent::~CSettingsSimulatorComponent()
|
|
{
|
|
delete ui;
|
|
}
|
|
|
|
void CSettingsSimulatorComponent::runtimeHasBeenSet()
|
|
{
|
|
Q_ASSERT(this->getIContextSimulator());
|
|
Q_ASSERT(this->getIContextSettings());
|
|
if (this->getIContextSimulator())
|
|
{
|
|
QStringList plugins = this->getIContextSimulator()->getAvailableSimulatorPlugins().toStringList(true);
|
|
CSimulatorInfo currentPlugin = this->getIContextSimulator()->getSimulatorInfo();
|
|
this->ui->cb_Plugins->addItems(plugins);
|
|
this->setCurrentPlugin(currentPlugin);
|
|
|
|
// disable / enable driver specific GUI parts
|
|
bool fsxDriver =
|
|
this->getIContextSimulator()->getAvailableSimulatorPlugins().supportsSimulator(CSimulatorInfo::FSX());
|
|
this->ui->comp_SettingsSimulatorFsx->setVisible(fsxDriver);
|
|
|
|
// time sync
|
|
bool timeSynced = this->getIContextSimulator()->isTimeSynchronized();
|
|
this->ui->cb_TimeSync->setChecked(timeSynced);
|
|
CTime timeOffset = this->getIContextSimulator()->getTimeSynchronizationOffset();
|
|
this->ui->le_TimeSyncOffset->setText(timeOffset.formattedHrsMin());
|
|
|
|
// 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::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());
|
|
if (!this->getIContextSimulator() || !this->getIContextSettings()) return;
|
|
|
|
CSimulatorInfoList simDrivers = this->getIContextSimulator()->getAvailableSimulatorPlugins();
|
|
if (simDrivers.isEmpty())
|
|
{
|
|
this->sendStatusMessage(CStatusMessage::getErrorMessage("No drivers available", CStatusMessage::TypeSimulator));
|
|
return;
|
|
}
|
|
if (simDrivers.size() <= index)
|
|
{
|
|
this->sendStatusMessage(CStatusMessage::getErrorMessage("Wrong driver index", CStatusMessage::TypeSimulator));
|
|
return;
|
|
}
|
|
|
|
// update
|
|
CSimulatorInfo currentDriver = simDrivers[index];
|
|
const QString path = CSettingUtilities::appendPaths(IContextSettings::PathSimulatorSettings(), CSettingsSimulator::ValueSelectedDriver());
|
|
this->sendStatusMessages(
|
|
this->getIContextSettings()->value(path, CSettingUtilities::CmdUpdate(), currentDriver.toCVariant())
|
|
);
|
|
}
|
|
|
|
void CSettingsSimulatorComponent::ps_settingsHaveChanged(uint settingsType)
|
|
{
|
|
Q_ASSERT(this->getIContextSettings());
|
|
IContextSettings::SettingsType type = static_cast<IContextSettings::SettingsType>(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)
|
|
{
|
|
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())
|
|
{
|
|
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);
|
|
}
|
|
}
|
|
}
|
|
} // namespace
|