diff --git a/scwx-qt/source/scwx/qt/manager/alert_manager.cpp b/scwx-qt/source/scwx/qt/manager/alert_manager.cpp index 8f86a196..890a8e0e 100644 --- a/scwx-qt/source/scwx/qt/manager/alert_manager.cpp +++ b/scwx-qt/source/scwx/qt/manager/alert_manager.cpp @@ -8,8 +8,6 @@ #include #include #include -#include -#include #include #include @@ -140,17 +138,12 @@ void AlertManager::Impl::HandleAlert(const types::TextEventKey& key, } settings::AudioSettings& audioSettings = settings::AudioSettings::Instance(); - settings::UnitSettings& unitSettings = settings::UnitSettings::Instance(); types::LocationMethod locationMethod = types::GetLocationMethod( audioSettings.alert_location_method().GetValue()); common::Coordinate currentCoordinate = CurrentCoordinate(locationMethod); std::string alertCounty = audioSettings.alert_county().GetValue(); - - types::DistanceUnits radiusUnits = - types::GetDistanceUnitsFromName(unitSettings.distance_units().GetValue()); - double radiusScale = types::GetDistanceUnitsScale(radiusUnits); - auto alertRadius = units::length::kilometers( - audioSettings.alert_radius().GetValue() / radiusScale); + auto alertRadius = units::length::kilometers( + audioSettings.alert_radius().GetValue()); logger_->debug("alertRadius: {}", (double)alertRadius); diff --git a/scwx-qt/source/scwx/qt/settings/settings_interface.cpp b/scwx-qt/source/scwx/qt/settings/settings_interface.cpp index 2bf38e80..7a83cd70 100644 --- a/scwx-qt/source/scwx/qt/settings/settings_interface.cpp +++ b/scwx-qt/source/scwx/qt/settings/settings_interface.cpp @@ -40,6 +40,7 @@ public: void UpdateEditWidget(); void UpdateResetButton(); + void UpdateUnitLabel(); SettingsInterface* self_; @@ -49,9 +50,14 @@ public: std::unique_ptr context_ {std::make_unique()}; QWidget* editWidget_ {nullptr}; QAbstractButton* resetButton_ {nullptr}; + QLabel* unitLabel_ {nullptr}; std::function mapFromValue_ {nullptr}; std::function mapToValue_ {nullptr}; + + double unitScale_ {1}; + const std::string * unitAbbreiation_ {nullptr}; + bool unitEnabled_ {false}; }; template @@ -381,6 +387,11 @@ void SettingsInterface::SetEditWidget(QWidget* widget) p->context_.get(), [this](double d) { + if (p->unitEnabled_) + { + d = d / p->unitScale_; + } + const T value = p->variable_->GetValue(); const std::optional staged = p->variable_->GetStaged(); @@ -448,6 +459,11 @@ void SettingsInterface::SetResetButton(QAbstractButton* button) p->UpdateResetButton(); } } +template +void SettingsInterface::SetUnitLabel(QLabel* label) +{ + p->unitLabel_ = label; +} template void SettingsInterface::SetMapFromValueFunction( @@ -463,6 +479,17 @@ void SettingsInterface::SetMapToValueFunction( p->mapToValue_ = function; } +template +void SettingsInterface::SetUnit(const double& scale, + const std::string& abbreviation) +{ + p->unitScale_ = scale; + p->unitAbbreiation_ = &abbreviation; + p->unitEnabled_ = true; + p->UpdateEditWidget(); + p->UpdateUnitLabel(); +} + template template void SettingsInterface::Impl::SetWidgetText(U* widget, const T& currentValue) @@ -559,11 +586,27 @@ void SettingsInterface::Impl::UpdateEditWidget() { if constexpr (std::is_floating_point_v) { - doubleSpinBox->setValue(static_cast(currentValue)); + double doubleValue = static_cast(currentValue); + if (unitEnabled_) + { + doubleValue = doubleValue * unitScale_; + } + doubleSpinBox->setValue(doubleValue); } } } +template +void SettingsInterface::Impl::UpdateUnitLabel() +{ + if (unitLabel_ == nullptr || !unitEnabled_) + { + return; + } + + unitLabel_->setText(QString::fromStdString(*unitAbbreiation_)); +} + template void SettingsInterface::Impl::UpdateResetButton() { diff --git a/scwx-qt/source/scwx/qt/settings/settings_interface.hpp b/scwx-qt/source/scwx/qt/settings/settings_interface.hpp index f5f5bb4a..b049dcc1 100644 --- a/scwx-qt/source/scwx/qt/settings/settings_interface.hpp +++ b/scwx-qt/source/scwx/qt/settings/settings_interface.hpp @@ -7,6 +7,8 @@ #include #include +class QLabel; + namespace scwx { namespace qt @@ -91,6 +93,13 @@ public: */ void SetResetButton(QAbstractButton* button) override; + /** + * Sets the label for units from the settings dialog. + * + * @param label Unit label + */ + void SetUnitLabel(QLabel* label); + /** * If the edit widget displays a different value than what is stored in the * settings variable, a mapping function must be provided in order to convert @@ -109,6 +118,14 @@ public: */ void SetMapToValueFunction(std::function function); + /** + * Sets the unit to be used by this setting. + * + * @param scale The radio of the current unit to the base unit + * @param abbreviation The abreviation to be displayed + */ + void SetUnit(const double& scale, const std::string& abbreviation); + private: class Impl; std::unique_ptr p; diff --git a/scwx-qt/source/scwx/qt/types/unit_types.cpp b/scwx-qt/source/scwx/qt/types/unit_types.cpp index 72fde4c2..09f532b5 100644 --- a/scwx-qt/source/scwx/qt/types/unit_types.cpp +++ b/scwx-qt/source/scwx/qt/types/unit_types.cpp @@ -101,12 +101,12 @@ static const std::unordered_map distanceUnitsName_ { {DistanceUnits::User, "User-defined"}, {DistanceUnits::Unknown, "?"}}; -static constexpr auto distanceUnitsBase_ = units::kilometers {1.0f}; -static const std::unordered_map distanceUnitsScale_ { +static constexpr auto distanceUnitsBase_ = units::kilometers {1.0f}; +static const std::unordered_map distanceUnitsScale_ { {DistanceUnits::Kilometers, - (distanceUnitsBase_ / units::kilometers {1.0f})}, + (distanceUnitsBase_ / units::kilometers {1.0f})}, {DistanceUnits::Miles, - (distanceUnitsBase_ / units::miles {1.0f})}, + (distanceUnitsBase_ / units::miles {1.0f})}, {DistanceUnits::User, 1.0f}, {DistanceUnits::Unknown, 1.0f}}; @@ -179,7 +179,7 @@ const std::string& GetDistanceUnitsName(DistanceUnits units) return distanceUnitsName_.at(units); } -float GetDistanceUnitsScale(DistanceUnits units) +double GetDistanceUnitsScale(DistanceUnits units) { return distanceUnitsScale_.at(units); } diff --git a/scwx-qt/source/scwx/qt/types/unit_types.hpp b/scwx-qt/source/scwx/qt/types/unit_types.hpp index d563b02e..ca29623f 100644 --- a/scwx-qt/source/scwx/qt/types/unit_types.hpp +++ b/scwx-qt/source/scwx/qt/types/unit_types.hpp @@ -88,7 +88,7 @@ float GetSpeedUnitsScale(SpeedUnits units); const std::string& GetDistanceUnitsAbbreviation(DistanceUnits units); const std::string& GetDistanceUnitsName(DistanceUnits units); DistanceUnits GetDistanceUnitsFromName(const std::string& name); -float GetDistanceUnitsScale(DistanceUnits units); +double GetDistanceUnitsScale(DistanceUnits units); } // namespace types } // namespace qt diff --git a/scwx-qt/source/scwx/qt/ui/settings_dialog.cpp b/scwx-qt/source/scwx/qt/ui/settings_dialog.cpp index 7d120839..3336c6e2 100644 --- a/scwx-qt/source/scwx/qt/ui/settings_dialog.cpp +++ b/scwx-qt/source/scwx/qt/ui/settings_dialog.cpp @@ -14,12 +14,14 @@ #include #include #include +#include #include #include #include #include #include #include +#include #include #include #include @@ -999,6 +1001,23 @@ void SettingsDialogImpl::SetupAudioTab() alertAudioRadius_.SetEditWidget(self_->ui->alertAudioRadiusSpinBox); alertAudioRadius_.SetResetButton( self_->ui->resetAlertAudioRadiusButton); + alertAudioRadius_.SetUnitLabel(self_->ui->alertAudioRadiusUnitsLabel); + + auto alertAudioRadiusUpdateUnits = [this](const std::string& newValue) + { + types::DistanceUnits radiusUnits = + types::GetDistanceUnitsFromName(newValue); + double radiusScale = types::GetDistanceUnitsScale(radiusUnits); + std::string abbreviation = + types::GetDistanceUnitsAbbreviation(radiusUnits); + + alertAudioRadius_.SetUnit(radiusScale, abbreviation); + }; + settings::UnitSettings::Instance() + .distance_units() + .RegisterValueStagedCallback(alertAudioRadiusUpdateUnits); + alertAudioRadiusUpdateUnits( + settings::UnitSettings::Instance().distance_units().GetValue()); auto& alertAudioPhenomena = types::GetAlertAudioPhenomena(); auto alertAudioLayout = diff --git a/scwx-qt/source/scwx/qt/ui/settings_dialog.ui b/scwx-qt/source/scwx/qt/ui/settings_dialog.ui index 566b68ad..c46de4cd 100644 --- a/scwx-qt/source/scwx/qt/ui/settings_dialog.ui +++ b/scwx-qt/source/scwx/qt/ui/settings_dialog.ui @@ -122,7 +122,7 @@ - 0 + 3 @@ -135,9 +135,9 @@ 0 - -113 - 511 - 669 + 0 + 270 + 647 @@ -610,8 +610,8 @@ 0 0 - 98 - 28 + 80 + 18 @@ -883,7 +883,7 @@ - + Radius @@ -892,7 +892,7 @@ - 4 + 2 0.000000000000000 @@ -916,6 +916,13 @@ + + + + + + +