From c53836e91aafe4a44e8dd5906a2fec7c1ae1ab87 Mon Sep 17 00:00:00 2001 From: AdenKoperczak Date: Thu, 11 Jul 2024 12:56:31 -0400 Subject: [PATCH] added **BASIC** unit handling to radius field. --- .../source/scwx/qt/manager/alert_manager.cpp | 13 ++++++- .../source/scwx/qt/settings/unit_settings.cpp | 20 +++++++++- .../source/scwx/qt/settings/unit_settings.hpp | 1 + scwx-qt/source/scwx/qt/types/unit_types.cpp | 38 +++++++++++++++++++ scwx-qt/source/scwx/qt/types/unit_types.hpp | 16 ++++++++ .../qt/ui/settings/unit_settings_widget.cpp | 11 ++++++ 6 files changed, 95 insertions(+), 4 deletions(-) diff --git a/scwx-qt/source/scwx/qt/manager/alert_manager.cpp b/scwx-qt/source/scwx/qt/manager/alert_manager.cpp index 8df6ffb7..8f86a196 100644 --- a/scwx-qt/source/scwx/qt/manager/alert_manager.cpp +++ b/scwx-qt/source/scwx/qt/manager/alert_manager.cpp @@ -8,6 +8,8 @@ #include #include #include +#include +#include #include #include @@ -138,12 +140,19 @@ 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(); - auto alertRadius = - units::length::meters(audioSettings.alert_radius().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); + + logger_->debug("alertRadius: {}", (double)alertRadius); auto message = textEventManager_->message_list(key).at(messageIndex); diff --git a/scwx-qt/source/scwx/qt/settings/unit_settings.cpp b/scwx-qt/source/scwx/qt/settings/unit_settings.cpp index e4cf4073..6114326a 100644 --- a/scwx-qt/source/scwx/qt/settings/unit_settings.cpp +++ b/scwx-qt/source/scwx/qt/settings/unit_settings.cpp @@ -26,16 +26,20 @@ public: types::GetOtherUnitsName(types::OtherUnits::Default); std::string defaultSpeedUnitsValue = types::GetSpeedUnitsName(types::SpeedUnits::Knots); + std::string defaultDistanceUnitsValue = + types::GetDistanceUnitsName(types::DistanceUnits::Kilometers); boost::to_lower(defaultAccumulationUnitsValue); boost::to_lower(defaultEchoTopsUnitsValue); boost::to_lower(defaultOtherUnitsValue); boost::to_lower(defaultSpeedUnitsValue); + boost::to_lower(defaultDistanceUnitsValue); accumulationUnits_.SetDefault(defaultAccumulationUnitsValue); echoTopsUnits_.SetDefault(defaultEchoTopsUnitsValue); otherUnits_.SetDefault(defaultOtherUnitsValue); speedUnits_.SetDefault(defaultSpeedUnitsValue); + distanceUnits_.SetDefault(defaultDistanceUnitsValue); accumulationUnits_.SetValidator( SCWX_SETTINGS_ENUM_VALIDATOR(types::AccumulationUnits, @@ -53,6 +57,10 @@ public: SCWX_SETTINGS_ENUM_VALIDATOR(types::SpeedUnits, types::SpeedUnitsIterator(), types::GetSpeedUnitsName)); + distanceUnits_.SetValidator( + SCWX_SETTINGS_ENUM_VALIDATOR(types::DistanceUnits, + types::DistanceUnitsIterator(), + types::GetDistanceUnitsName)); } ~Impl() {} @@ -61,6 +69,7 @@ public: SettingsVariable echoTopsUnits_ {"echo_tops_units"}; SettingsVariable otherUnits_ {"other_units"}; SettingsVariable speedUnits_ {"speed_units"}; + SettingsVariable distanceUnits_ {"speed_units"}; }; UnitSettings::UnitSettings() : @@ -69,7 +78,8 @@ UnitSettings::UnitSettings() : RegisterVariables({&p->accumulationUnits_, &p->echoTopsUnits_, &p->otherUnits_, - &p->speedUnits_}); + &p->speedUnits_, + &p->distanceUnits_}); SetDefaults(); } UnitSettings::~UnitSettings() = default; @@ -97,6 +107,11 @@ SettingsVariable& UnitSettings::speed_units() const return p->speedUnits_; } +SettingsVariable& UnitSettings::distance_units() const +{ + return p->distanceUnits_; +} + UnitSettings& UnitSettings::Instance() { static UnitSettings generalSettings_; @@ -108,7 +123,8 @@ bool operator==(const UnitSettings& lhs, const UnitSettings& rhs) return (lhs.p->accumulationUnits_ == rhs.p->accumulationUnits_ && lhs.p->echoTopsUnits_ == rhs.p->echoTopsUnits_ && lhs.p->otherUnits_ == rhs.p->otherUnits_ && - lhs.p->speedUnits_ == rhs.p->speedUnits_); + lhs.p->speedUnits_ == rhs.p->speedUnits_ && + lhs.p->distanceUnits_ == rhs.p->distanceUnits_); } } // namespace settings diff --git a/scwx-qt/source/scwx/qt/settings/unit_settings.hpp b/scwx-qt/source/scwx/qt/settings/unit_settings.hpp index c849cffb..15518492 100644 --- a/scwx-qt/source/scwx/qt/settings/unit_settings.hpp +++ b/scwx-qt/source/scwx/qt/settings/unit_settings.hpp @@ -29,6 +29,7 @@ public: SettingsVariable& echo_tops_units() const; SettingsVariable& other_units() const; SettingsVariable& speed_units() const; + SettingsVariable& distance_units() const; static UnitSettings& Instance(); diff --git a/scwx-qt/source/scwx/qt/types/unit_types.cpp b/scwx-qt/source/scwx/qt/types/unit_types.cpp index fbab05da..72fde4c2 100644 --- a/scwx-qt/source/scwx/qt/types/unit_types.cpp +++ b/scwx-qt/source/scwx/qt/types/unit_types.cpp @@ -89,12 +89,35 @@ static const std::unordered_map speedUnitsScale_ { {SpeedUnits::User, 1.0f}, {SpeedUnits::Unknown, 1.0f}}; +static const std::unordered_map + distanceUnitsAbbreviation_ {{DistanceUnits::Kilometers, "km"}, + {DistanceUnits::Miles, "mi"}, + {DistanceUnits::User, ""}, + {DistanceUnits::Unknown, ""}}; + +static const std::unordered_map distanceUnitsName_ { + {DistanceUnits::Kilometers, "Kilometers"}, + {DistanceUnits::Miles, "Miles"}, + {DistanceUnits::User, "User-defined"}, + {DistanceUnits::Unknown, "?"}}; + +static constexpr auto distanceUnitsBase_ = units::kilometers {1.0f}; +static const std::unordered_map distanceUnitsScale_ { + {DistanceUnits::Kilometers, + (distanceUnitsBase_ / units::kilometers {1.0f})}, + {DistanceUnits::Miles, + (distanceUnitsBase_ / units::miles {1.0f})}, + {DistanceUnits::User, 1.0f}, + {DistanceUnits::Unknown, 1.0f}}; + + SCWX_GET_ENUM(AccumulationUnits, GetAccumulationUnitsFromName, accumulationUnitsName_) SCWX_GET_ENUM(EchoTopsUnits, GetEchoTopsUnitsFromName, echoTopsUnitsName_) SCWX_GET_ENUM(OtherUnits, GetOtherUnitsFromName, otherUnitsName_) SCWX_GET_ENUM(SpeedUnits, GetSpeedUnitsFromName, speedUnitsName_) +SCWX_GET_ENUM(DistanceUnits, GetDistanceUnitsFromName, distanceUnitsName_) const std::string& GetAccumulationUnitsAbbreviation(AccumulationUnits units) { @@ -146,6 +169,21 @@ float GetSpeedUnitsScale(SpeedUnits units) return speedUnitsScale_.at(units); } +const std::string& GetDistanceUnitsAbbreviation(DistanceUnits units) +{ + return distanceUnitsAbbreviation_.at(units); +} + +const std::string& GetDistanceUnitsName(DistanceUnits units) +{ + return distanceUnitsName_.at(units); +} + +float GetDistanceUnitsScale(DistanceUnits units) +{ + return distanceUnitsScale_.at(units); +} + } // namespace types } // namespace qt } // namespace scwx diff --git a/scwx-qt/source/scwx/qt/types/unit_types.hpp b/scwx-qt/source/scwx/qt/types/unit_types.hpp index fd1a012b..d563b02e 100644 --- a/scwx-qt/source/scwx/qt/types/unit_types.hpp +++ b/scwx-qt/source/scwx/qt/types/unit_types.hpp @@ -56,6 +56,17 @@ typedef scwx::util:: Iterator SpeedUnitsIterator; +enum class DistanceUnits +{ + Kilometers, + Miles, + User, + Unknown +}; +typedef scwx::util:: + Iterator + DistanceUnitsIterator; + const std::string& GetAccumulationUnitsAbbreviation(AccumulationUnits units); const std::string& GetAccumulationUnitsName(AccumulationUnits units); AccumulationUnits GetAccumulationUnitsFromName(const std::string& name); @@ -74,6 +85,11 @@ const std::string& GetSpeedUnitsName(SpeedUnits units); SpeedUnits GetSpeedUnitsFromName(const std::string& name); 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); + } // namespace types } // namespace qt } // namespace scwx diff --git a/scwx-qt/source/scwx/qt/ui/settings/unit_settings_widget.cpp b/scwx-qt/source/scwx/qt/ui/settings/unit_settings_widget.cpp index 946d21ce..aff11583 100644 --- a/scwx-qt/source/scwx/qt/ui/settings/unit_settings_widget.cpp +++ b/scwx-qt/source/scwx/qt/ui/settings/unit_settings_widget.cpp @@ -102,6 +102,16 @@ public: types::GetSpeedUnitsName); AddRow(speedUnits_, "Speed", speedComboBox); + QComboBox* distanceComboBox = new QComboBox(self); + distanceComboBox->setSizePolicy(QSizePolicy::Expanding, + QSizePolicy::Preferred); + distanceUnits_.SetSettingsVariable(unitSettings.distance_units()); + SCWX_SETTINGS_COMBO_BOX(distanceUnits_, + distanceComboBox, + types::DistanceUnitsIterator(), + types::GetDistanceUnitsName); + AddRow(distanceUnits_, "Distance", distanceComboBox); + QComboBox* otherComboBox = new QComboBox(self); otherComboBox->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); @@ -127,6 +137,7 @@ public: settings::SettingsInterface echoTopsUnits_ {}; settings::SettingsInterface otherUnits_ {}; settings::SettingsInterface speedUnits_ {}; + settings::SettingsInterface distanceUnits_ {}; }; UnitSettingsWidget::UnitSettingsWidget(QWidget* parent) :