mirror of
https://github.com/swift-project/pilotclient.git
synced 2026-03-30 11:55:35 +08:00
Some weather UI improvements
* added label line to show if weather is on/off * myself guard (QTimer::singleShot) Based on Q&A here https://discordapp.com/channels/539048679160676382/539486309882789888/598913115211694111
This commit is contained in:
committed by
Mat Sutcliffe
parent
edbdcf3437
commit
ca23115394
@@ -23,6 +23,9 @@
|
|||||||
#include <QRegExpValidator>
|
#include <QRegExpValidator>
|
||||||
#include <QRegularExpression>
|
#include <QRegularExpression>
|
||||||
#include <QStringView>
|
#include <QStringView>
|
||||||
|
#include <QStringBuilder>
|
||||||
|
#include <QStringLiteral>
|
||||||
|
#include <QPointer>
|
||||||
|
|
||||||
using namespace BlackCore;
|
using namespace BlackCore;
|
||||||
using namespace BlackCore::Context;
|
using namespace BlackCore::Context;
|
||||||
@@ -54,11 +57,11 @@ namespace BlackGui
|
|||||||
ui->cb_weatherScenario->addItem(scenario.getName(), QVariant::fromValue(scenario));
|
ui->cb_weatherScenario->addItem(scenario.getName(), QVariant::fromValue(scenario));
|
||||||
}
|
}
|
||||||
|
|
||||||
const auto scenario = m_weatherScenarioSetting.get();
|
const CWeatherScenario scenario = m_weatherScenarioSetting.get();
|
||||||
ui->cb_weatherScenario->setCurrentIndex(scenario.getIndex());
|
ui->cb_weatherScenario->setCurrentIndex(scenario.getIndex());
|
||||||
ui->pb_ActivateWeather->setIcon(CIcons::metar());
|
ui->pb_ActivateWeather->setIcon(CIcons::metar());
|
||||||
|
|
||||||
setupConnections();
|
this->setupConnections();
|
||||||
ui->lbl_Status->setText({});
|
ui->lbl_Status->setText({});
|
||||||
|
|
||||||
// hotkeys
|
// hotkeys
|
||||||
@@ -66,11 +69,19 @@ namespace BlackGui
|
|||||||
m_hotkeyBindings.append(CGuiActionBindHandler::bindButton(ui->pb_ActivateWeather, swift + "Weather/Toggle weather", true));
|
m_hotkeyBindings.append(CGuiActionBindHandler::bindButton(ui->pb_ActivateWeather, swift + "Weather/Toggle weather", true));
|
||||||
m_hotkeyBindings.append(CGuiActionBindHandler::bindButton(ui->pb_ActivateWeather, swift + "Weather/Force CAVOK", true));
|
m_hotkeyBindings.append(CGuiActionBindHandler::bindButton(ui->pb_ActivateWeather, swift + "Weather/Force CAVOK", true));
|
||||||
|
|
||||||
// Set interval to 5 min
|
// Set interval to 5 mins
|
||||||
m_weatherUpdateTimer.setInterval(1000 * 60 * 5);
|
m_weatherUpdateTimer.setInterval(1000 * 60 * 5);
|
||||||
|
|
||||||
// Call this method deferred in order to have the component fully initialized, e.g. object name set by the parent
|
// Call this method deferred in order to have the component fully initialized, e.g. object name set by the parent
|
||||||
QTimer::singleShot(1000, this, &CWeatherComponent::updateWeatherInformation);
|
QPointer<CWeatherComponent> myself(this);
|
||||||
|
QTimer::singleShot(1000, this, [ = ]
|
||||||
|
{
|
||||||
|
if (myself)
|
||||||
|
{
|
||||||
|
myself->updateWeatherInformation();
|
||||||
|
myself->updateWeatherInfoLine();
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
CWeatherComponent::~CWeatherComponent()
|
CWeatherComponent::~CWeatherComponent()
|
||||||
@@ -117,6 +128,7 @@ namespace BlackGui
|
|||||||
|
|
||||||
void CWeatherComponent::toggleWeatherActivation()
|
void CWeatherComponent::toggleWeatherActivation()
|
||||||
{
|
{
|
||||||
|
if (!sGui || !sGui->getIContextSimulator()) { return; }
|
||||||
if (m_isWeatherActivated)
|
if (m_isWeatherActivated)
|
||||||
{
|
{
|
||||||
m_isWeatherActivated = false;
|
m_isWeatherActivated = false;
|
||||||
@@ -128,6 +140,7 @@ namespace BlackGui
|
|||||||
ui->pb_ActivateWeather->setText("Deactivate");
|
ui->pb_ActivateWeather->setText("Deactivate");
|
||||||
}
|
}
|
||||||
sGui->getIContextSimulator()->setWeatherActivated(m_isWeatherActivated);
|
sGui->getIContextSimulator()->setWeatherActivated(m_isWeatherActivated);
|
||||||
|
this->updateWeatherInfoLine();
|
||||||
}
|
}
|
||||||
|
|
||||||
void CWeatherComponent::showCoordinateDialog()
|
void CWeatherComponent::showCoordinateDialog()
|
||||||
@@ -139,31 +152,45 @@ namespace BlackGui
|
|||||||
{
|
{
|
||||||
if (index == -1) { return; }
|
if (index == -1) { return; }
|
||||||
m_lastOwnAircraftPosition = {};
|
m_lastOwnAircraftPosition = {};
|
||||||
CWeatherScenario scenario = m_weatherScenarios[index];
|
const CWeatherScenario scenario = m_weatherScenarios[index];
|
||||||
m_weatherScenarioSetting.set(scenario);
|
m_weatherScenarioSetting.set(scenario);
|
||||||
updateWeatherInformation();
|
this->updateWeatherInformation();
|
||||||
|
this->updateWeatherInfoLine();
|
||||||
}
|
}
|
||||||
|
|
||||||
void CWeatherComponent::setCavok()
|
void CWeatherComponent::setCavok()
|
||||||
{
|
{
|
||||||
|
QPointer<CWeatherComponent> myself(this);
|
||||||
for (int index = 0; index < m_weatherScenarios.size(); index++)
|
for (int index = 0; index < m_weatherScenarios.size(); index++)
|
||||||
{
|
{
|
||||||
if (m_weatherScenarios[index].getIndex() == CWeatherScenario::ClearSky)
|
if (m_weatherScenarios[index].getIndex() == CWeatherScenario::ClearSky)
|
||||||
{
|
{
|
||||||
// call queued
|
// call queued
|
||||||
QTimer::singleShot(0, this, [ = ] { this->setWeatherScenario(index); });
|
QTimer::singleShot(0, this, [ = ] { if (myself) { myself->setWeatherScenario(index); }});
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CWeatherComponent::updateWeatherInfoLine()
|
||||||
|
{
|
||||||
|
if (m_isWeatherActivated)
|
||||||
|
{
|
||||||
|
const CWeatherScenario scenario = m_weatherScenarioSetting.get();
|
||||||
|
ui->lbl_WeatherEngineInfo->setText(QStringLiteral("swift weather is on, '%1'").arg(scenario.getName()));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ui->lbl_WeatherEngineInfo->setText(QStringLiteral("swift weather is off"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void CWeatherComponent::updateWeatherInformation()
|
void CWeatherComponent::updateWeatherInformation()
|
||||||
{
|
{
|
||||||
setWeatherGrid({});
|
setWeatherGrid({});
|
||||||
ui->lbl_Status->setText({});
|
ui->lbl_Status->setText({});
|
||||||
const bool useOwnAcftPosition = ui->cb_UseOwnAcftPosition->isChecked();
|
const bool useOwnAcftPosition = ui->cb_UseOwnAcftPosition->isChecked();
|
||||||
BlackMisc::Geo::CCoordinateGeodetic position;
|
CCoordinateGeodetic position;
|
||||||
Q_ASSERT(ui->cb_weatherScenario->currentData().canConvert<CWeatherScenario>());
|
Q_ASSERT(ui->cb_weatherScenario->currentData().canConvert<CWeatherScenario>());
|
||||||
CWeatherScenario scenario = ui->cb_weatherScenario->currentData().value<CWeatherScenario>();
|
CWeatherScenario scenario = ui->cb_weatherScenario->currentData().value<CWeatherScenario>();
|
||||||
|
|
||||||
@@ -208,11 +235,11 @@ namespace BlackGui
|
|||||||
void CWeatherComponent::setupConnections()
|
void CWeatherComponent::setupConnections()
|
||||||
{
|
{
|
||||||
// UI connections
|
// UI connections
|
||||||
connect(ui->cb_weatherScenario, qOverload<int>(&QComboBox::currentIndexChanged), this, &CWeatherComponent::setWeatherScenario);
|
connect(ui->cb_weatherScenario, qOverload<int>(&QComboBox::currentIndexChanged), this, &CWeatherComponent::setWeatherScenario);
|
||||||
connect(m_coordinateDialog.data(), &CCoordinateDialog::changedCoordinate, this, &CWeatherComponent::updateWeatherInformation);
|
connect(m_coordinateDialog.data(), &CCoordinateDialog::changedCoordinate, this, &CWeatherComponent::updateWeatherInformation);
|
||||||
connect(ui->cb_UseOwnAcftPosition, &QCheckBox::toggled, this, &CWeatherComponent::toggleUseOwnAircraftPosition);
|
connect(ui->cb_UseOwnAcftPosition, &QCheckBox::toggled, this, &CWeatherComponent::toggleUseOwnAircraftPosition);
|
||||||
connect(&m_weatherUpdateTimer, &QTimer::timeout, this, &CWeatherComponent::updateWeatherInformation);
|
connect(&m_weatherUpdateTimer, &QTimer::timeout, this, &CWeatherComponent::updateWeatherInformation);
|
||||||
connect(ui->pb_ActivateWeather, &QPushButton::clicked, this, &CWeatherComponent::toggleWeatherActivation);
|
connect(ui->pb_ActivateWeather, &QPushButton::clicked, this, &CWeatherComponent::toggleWeatherActivation);
|
||||||
|
|
||||||
// Context connections
|
// Context connections
|
||||||
Q_ASSERT(sGui->getIContextSimulator());
|
Q_ASSERT(sGui->getIContextSimulator());
|
||||||
@@ -221,23 +248,29 @@ namespace BlackGui
|
|||||||
|
|
||||||
void CWeatherComponent::setWeatherGrid(const CWeatherGrid &weatherGrid)
|
void CWeatherComponent::setWeatherGrid(const CWeatherGrid &weatherGrid)
|
||||||
{
|
{
|
||||||
CGridPoint gridPoint = weatherGrid.frontOrDefault();
|
const CGridPoint gridPoint = weatherGrid.frontOrDefault();
|
||||||
ui->tvp_TemperatureLayers->updateContainer(gridPoint.getTemperatureLayers());
|
ui->tvp_TemperatureLayers->updateContainer(gridPoint.getTemperatureLayers());
|
||||||
ui->tvp_CloudLayers->updateContainer(gridPoint.getCloudLayers());
|
ui->tvp_CloudLayers->updateContainer(gridPoint.getCloudLayers());
|
||||||
ui->tvp_WindLayers->updateContainer(gridPoint.getWindLayers());
|
ui->tvp_WindLayers->updateContainer(gridPoint.getWindLayers());
|
||||||
CCoordinateGeodetic position = gridPoint.getPosition();
|
const CCoordinateGeodetic position = gridPoint.getPosition();
|
||||||
double pressureAtMsl = gridPoint.getPressureAtMsl().value(CPressureUnit::hPa());
|
const double pressureAtMsl = gridPoint.getPressureAtMsl().value(CPressureUnit::hPa());
|
||||||
QString status = QString("Weather Position: %1 %2").arg(position.latitude().toWgs84(), position.longitude().toWgs84());
|
const QString status = QStringLiteral("Weather Position: %1 %2\nPressure (MSL): %3 hPa").arg(position.latitude().toWgs84(), position.longitude().toWgs84()).arg(pressureAtMsl);
|
||||||
status += QString("\nPressure (MSL): %1 hPa").arg(pressureAtMsl);
|
|
||||||
ui->lbl_Status->setText(status);
|
ui->lbl_Status->setText(status);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CWeatherComponent::requestWeatherGrid(const CCoordinateGeodetic &position)
|
void CWeatherComponent::requestWeatherGrid(const CCoordinateGeodetic &position)
|
||||||
{
|
{
|
||||||
|
if (!sGui || sGui->isShuttingDown() || !sGui->getIContextSimulator()) { return; }
|
||||||
ui->lbl_Status->setText(QStringLiteral("Loading around %1 %2").arg(position.latitude().toWgs84(), position.longitude().toWgs84()));
|
ui->lbl_Status->setText(QStringLiteral("Loading around %1 %2").arg(position.latitude().toWgs84(), position.longitude().toWgs84()));
|
||||||
CWeatherGrid weatherGrid { { {}, position } };
|
const CWeatherGrid weatherGrid { { {}, position } };
|
||||||
auto ident = identifier();
|
const auto ident = identifier();
|
||||||
sGui->getIContextSimulator()->requestWeatherGrid(weatherGrid, ident);
|
sGui->getIContextSimulator()->requestWeatherGrid(weatherGrid, ident);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CWeatherComponent::onScenarioChanged()
|
||||||
|
{
|
||||||
|
this->updateWeatherInfoLine();
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|||||||
@@ -65,6 +65,7 @@ namespace BlackGui
|
|||||||
void setWeatherScenario(int index);
|
void setWeatherScenario(int index);
|
||||||
void setCavok();
|
void setCavok();
|
||||||
|
|
||||||
|
void updateWeatherInfoLine();
|
||||||
void updateWeatherInformation();
|
void updateWeatherInformation();
|
||||||
void weatherGridReceived(const BlackMisc::Weather::CWeatherGrid &weatherGrid, const BlackMisc::CIdentifier &identifier);
|
void weatherGridReceived(const BlackMisc::Weather::CWeatherGrid &weatherGrid, const BlackMisc::CIdentifier &identifier);
|
||||||
|
|
||||||
@@ -73,12 +74,14 @@ namespace BlackGui
|
|||||||
void setWeatherGrid(const BlackMisc::Weather::CWeatherGrid &weatherGrid);
|
void setWeatherGrid(const BlackMisc::Weather::CWeatherGrid &weatherGrid);
|
||||||
void requestWeatherGrid(const BlackMisc::Geo::CCoordinateGeodetic &position);
|
void requestWeatherGrid(const BlackMisc::Geo::CCoordinateGeodetic &position);
|
||||||
|
|
||||||
|
void onScenarioChanged();
|
||||||
|
|
||||||
QScopedPointer<Ui::CWeatherComponent> ui;
|
QScopedPointer<Ui::CWeatherComponent> ui;
|
||||||
QScopedPointer<CCoordinateDialog> m_coordinateDialog { new CCoordinateDialog(this) };
|
QScopedPointer<CCoordinateDialog> m_coordinateDialog { new CCoordinateDialog(this) };
|
||||||
QVector<BlackMisc::Weather::CWeatherScenario> m_weatherScenarios;
|
QVector<BlackMisc::Weather::CWeatherScenario> m_weatherScenarios;
|
||||||
QTimer m_weatherUpdateTimer;
|
QTimer m_weatherUpdateTimer;
|
||||||
BlackMisc::Geo::CCoordinateGeodetic m_lastOwnAircraftPosition;
|
BlackMisc::Geo::CCoordinateGeodetic m_lastOwnAircraftPosition;
|
||||||
BlackMisc::CSetting<BlackMisc::Simulation::Settings::TSelectedWeatherScenario> m_weatherScenarioSetting { this };
|
BlackMisc::CSetting<BlackMisc::Simulation::Settings::TSelectedWeatherScenario> m_weatherScenarioSetting { this, &CWeatherComponent::onScenarioChanged };
|
||||||
BlackCore::CActionBindings m_hotkeyBindings; //!< allow binding of hotkey
|
BlackCore::CActionBindings m_hotkeyBindings; //!< allow binding of hotkey
|
||||||
bool m_isWeatherActivated = false;
|
bool m_isWeatherActivated = false;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -48,6 +48,13 @@
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
<item row="1" column="0" colspan="3">
|
||||||
|
<widget class="QLabel" name="lbl_WeatherEngineInfo">
|
||||||
|
<property name="text">
|
||||||
|
<string>info goes here</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
|||||||
Reference in New Issue
Block a user