From ec97231bca5b7fb598f8d4b3ab144875222dd4d7 Mon Sep 17 00:00:00 2001 From: Dan Paulat Date: Wed, 29 Nov 2023 06:05:35 -0600 Subject: [PATCH] Add audio settings --- scwx-qt/scwx-qt.cmake | 7 +- .../scwx/qt/manager/settings_manager.cpp | 4 + .../scwx/qt/settings/audio_settings.cpp | 131 ++++++++++++++++++ .../scwx/qt/settings/audio_settings.hpp | 45 ++++++ .../scwx/qt/settings/settings_definitions.hpp | 20 +++ test/data | 2 +- 6 files changed, 206 insertions(+), 3 deletions(-) create mode 100644 scwx-qt/source/scwx/qt/settings/audio_settings.cpp create mode 100644 scwx-qt/source/scwx/qt/settings/audio_settings.hpp create mode 100644 scwx-qt/source/scwx/qt/settings/settings_definitions.hpp diff --git a/scwx-qt/scwx-qt.cmake b/scwx-qt/scwx-qt.cmake index 116a5355..b9c14701 100644 --- a/scwx-qt/scwx-qt.cmake +++ b/scwx-qt/scwx-qt.cmake @@ -145,18 +145,21 @@ set(SRC_MODEL source/scwx/qt/model/alert_model.cpp source/scwx/qt/model/tree_model.cpp) set(HDR_REQUEST source/scwx/qt/request/nexrad_file_request.hpp) set(SRC_REQUEST source/scwx/qt/request/nexrad_file_request.cpp) -set(HDR_SETTINGS source/scwx/qt/settings/general_settings.hpp +set(HDR_SETTINGS source/scwx/qt/settings/audio_settings.hpp + source/scwx/qt/settings/general_settings.hpp source/scwx/qt/settings/map_settings.hpp source/scwx/qt/settings/palette_settings.hpp source/scwx/qt/settings/settings_category.hpp source/scwx/qt/settings/settings_container.hpp + source/scwx/qt/settings/settings_definitions.hpp source/scwx/qt/settings/settings_interface.hpp source/scwx/qt/settings/settings_interface_base.hpp source/scwx/qt/settings/settings_variable.hpp source/scwx/qt/settings/settings_variable_base.hpp source/scwx/qt/settings/text_settings.hpp source/scwx/qt/settings/ui_settings.hpp) -set(SRC_SETTINGS source/scwx/qt/settings/general_settings.cpp +set(SRC_SETTINGS source/scwx/qt/settings/audio_settings.cpp + source/scwx/qt/settings/general_settings.cpp source/scwx/qt/settings/map_settings.cpp source/scwx/qt/settings/palette_settings.cpp source/scwx/qt/settings/settings_category.cpp diff --git a/scwx-qt/source/scwx/qt/manager/settings_manager.cpp b/scwx-qt/source/scwx/qt/manager/settings_manager.cpp index a4c0f4a3..36ad057c 100644 --- a/scwx-qt/source/scwx/qt/manager/settings_manager.cpp +++ b/scwx-qt/source/scwx/qt/manager/settings_manager.cpp @@ -1,5 +1,6 @@ #include #include +#include #include #include #include @@ -128,6 +129,7 @@ boost::json::value SettingsManager::Impl::ConvertSettingsToJson() boost::json::object settingsJson; settings::GeneralSettings::Instance().WriteJson(settingsJson); + settings::AudioSettings::Instance().WriteJson(settingsJson); settings::MapSettings::Instance().WriteJson(settingsJson); settings::PaletteSettings::Instance().WriteJson(settingsJson); settings::TextSettings::Instance().WriteJson(settingsJson); @@ -141,6 +143,7 @@ void SettingsManager::Impl::GenerateDefaultSettings() logger_->info("Generating default settings"); settings::GeneralSettings::Instance().SetDefaults(); + settings::AudioSettings::Instance().SetDefaults(); settings::MapSettings::Instance().SetDefaults(); settings::PaletteSettings::Instance().SetDefaults(); settings::TextSettings::Instance().SetDefaults(); @@ -155,6 +158,7 @@ bool SettingsManager::Impl::LoadSettings( bool jsonDirty = false; jsonDirty |= !settings::GeneralSettings::Instance().ReadJson(settingsJson); + jsonDirty |= !settings::AudioSettings::Instance().ReadJson(settingsJson); jsonDirty |= !settings::MapSettings::Instance().ReadJson(settingsJson); jsonDirty |= !settings::PaletteSettings::Instance().ReadJson(settingsJson); jsonDirty |= !settings::TextSettings::Instance().ReadJson(settingsJson); diff --git a/scwx-qt/source/scwx/qt/settings/audio_settings.cpp b/scwx-qt/source/scwx/qt/settings/audio_settings.cpp new file mode 100644 index 00000000..869973ae --- /dev/null +++ b/scwx-qt/source/scwx/qt/settings/audio_settings.cpp @@ -0,0 +1,131 @@ +#include +#include +#include +#include +#include + +#include +#include + +namespace scwx +{ +namespace qt +{ +namespace settings +{ + +static const std::string logPrefix_ = "scwx::qt::settings::audio_settings"; + +static const bool kDefaultAlertEnabled_ {false}; +static const awips::Phenomenon kDefaultPhenomenon_ { + awips::Phenomenon::FlashFlood}; + +class AudioSettings::Impl +{ +public: + explicit Impl() + { + std::string defaultAlertLocationMethodValue = + types::GetLocationMethodName(types::LocationMethod::Fixed); + + boost::to_lower(defaultAlertLocationMethodValue); + + alertLocationMethod_.SetDefault(defaultAlertLocationMethodValue); + alertLatitude_.SetDefault(0.0); + alertLongitude_.SetDefault(0.0); + + alertLatitude_.SetMinimum(-90.0); + alertLatitude_.SetMaximum(90.0); + alertLongitude_.SetMinimum(-180.0); + alertLongitude_.SetMaximum(180.0); + + alertLocationMethod_.SetValidator( + SCWX_SETTINGS_ENUM_VALIDATOR(types::LocationMethod, + types::LocationMethodIterator(), + types::GetLocationMethodName)); + + for (auto& phenomenon : types::GetAlertAudioPhenomena()) + { + std::string phenomenonCode = awips::GetPhenomenonCode(phenomenon); + std::string name = fmt::format("{}_enabled", phenomenonCode); + + auto result = + alertEnabled_.emplace(phenomenon, SettingsVariable {name}); + + SettingsVariable& variable = result.first->second; + + variable.SetDefault(kDefaultAlertEnabled_); + + variables_.push_back(&variable); + } + } + + ~Impl() {} + + SettingsVariable alertLocationMethod_ {"alert_location_method"}; + SettingsVariable alertLatitude_ {"alert_latitude"}; + SettingsVariable alertLongitude_ {"alert_longitude"}; + + std::unordered_map> + alertEnabled_ {}; + std::vector variables_ {}; +}; + +AudioSettings::AudioSettings() : + SettingsCategory("audio"), p(std::make_unique()) +{ + RegisterVariables( + {&p->alertLocationMethod_, &p->alertLatitude_, &p->alertLongitude_}); + RegisterVariables(p->variables_); + SetDefaults(); + + p->variables_.clear(); +} +AudioSettings::~AudioSettings() = default; + +AudioSettings::AudioSettings(AudioSettings&&) noexcept = default; +AudioSettings& AudioSettings::operator=(AudioSettings&&) noexcept = default; + +SettingsVariable& AudioSettings::alert_location_method() const +{ + return p->alertLocationMethod_; +} + +SettingsVariable& AudioSettings::alert_latitude() const +{ + return p->alertLatitude_; +} + +SettingsVariable& AudioSettings::alert_longitude() const +{ + return p->alertLongitude_; +} + +SettingsVariable& +AudioSettings::alert_enabled(awips::Phenomenon phenomenon) const +{ + auto alert = p->alertEnabled_.find(phenomenon); + if (alert == p->alertEnabled_.cend()) + { + alert = p->alertEnabled_.find(kDefaultPhenomenon_); + } + return alert->second; +} + +AudioSettings& AudioSettings::Instance() +{ + static AudioSettings audioSettings_; + return audioSettings_; +} + +bool operator==(const AudioSettings& lhs, const AudioSettings& rhs) +{ + return (lhs.p->alertLocationMethod_ == rhs.p->alertLocationMethod_ && + lhs.p->alertLatitude_ == rhs.p->alertLatitude_ && + lhs.p->alertLongitude_ == rhs.p->alertLongitude_ && + lhs.p->alertEnabled_ == rhs.p->alertEnabled_); +} + +} // namespace settings +} // namespace qt +} // namespace scwx diff --git a/scwx-qt/source/scwx/qt/settings/audio_settings.hpp b/scwx-qt/source/scwx/qt/settings/audio_settings.hpp new file mode 100644 index 00000000..e9b111f1 --- /dev/null +++ b/scwx-qt/source/scwx/qt/settings/audio_settings.hpp @@ -0,0 +1,45 @@ +#pragma once + +#include +#include +#include + +#include +#include + +namespace scwx +{ +namespace qt +{ +namespace settings +{ + +class AudioSettings : public SettingsCategory +{ +public: + explicit AudioSettings(); + ~AudioSettings(); + + AudioSettings(const AudioSettings&) = delete; + AudioSettings& operator=(const AudioSettings&) = delete; + + AudioSettings(AudioSettings&&) noexcept; + AudioSettings& operator=(AudioSettings&&) noexcept; + + SettingsVariable& alert_location_method() const; + SettingsVariable& alert_latitude() const; + SettingsVariable& alert_longitude() const; + SettingsVariable& alert_enabled(awips::Phenomenon phenomenon) const; + + static AudioSettings& Instance(); + + friend bool operator==(const AudioSettings& lhs, const AudioSettings& rhs); + +private: + class Impl; + std::unique_ptr p; +}; + +} // namespace settings +} // namespace qt +} // namespace scwx diff --git a/scwx-qt/source/scwx/qt/settings/settings_definitions.hpp b/scwx-qt/source/scwx/qt/settings/settings_definitions.hpp new file mode 100644 index 00000000..b6f0d7fd --- /dev/null +++ b/scwx-qt/source/scwx/qt/settings/settings_definitions.hpp @@ -0,0 +1,20 @@ +#pragma once + +#define SCWX_SETTINGS_ENUM_VALIDATOR(Type, Iterator, ToName) \ + [](const std::string& value) \ + { \ + for (Type enumValue : Iterator) \ + { \ + /* If the value is equal to a lower case name */ \ + std::string enumName = ToName(enumValue); \ + boost::to_lower(enumName); \ + if (value == enumName) \ + { \ + /* Regard as a match, valid */ \ + return true; \ + } \ + } \ + \ + /* No match found, invalid */ \ + return false; \ + } diff --git a/test/data b/test/data index cd36a74a..85525670 160000 --- a/test/data +++ b/test/data @@ -1 +1 @@ -Subproject commit cd36a74a9c678d90d10ec397eae65b389a9640fc +Subproject commit 85525670368987258d41f2a7b0e92266dcec9048