From 8fc392681a6a0885be55492eead969d7cd3476f5 Mon Sep 17 00:00:00 2001 From: Dan Paulat Date: Mon, 16 Sep 2024 22:02:41 -0500 Subject: [PATCH] Initial impact based warning palette settings TODO: - Update settings to use line component data - Add interface to data --- .../scwx/qt/settings/palette_settings.cpp | 179 +++++++++++++----- .../scwx/qt/settings/palette_settings.hpp | 1 + 2 files changed, 134 insertions(+), 46 deletions(-) diff --git a/scwx-qt/source/scwx/qt/settings/palette_settings.cpp b/scwx-qt/source/scwx/qt/settings/palette_settings.cpp index 9d9c93fa..4c61a916 100644 --- a/scwx-qt/source/scwx/qt/settings/palette_settings.cpp +++ b/scwx-qt/source/scwx/qt/settings/palette_settings.cpp @@ -2,6 +2,7 @@ #include #include +#include #include #include #include @@ -76,66 +77,59 @@ static const awips::Phenomenon kDefaultPhenomenon_ {awips::Phenomenon::Marine}; class PaletteSettings::Impl { public: - explicit Impl() + struct AlertData { - palette_.reserve(kPaletteKeys_.size()); - - for (const auto& name : kPaletteKeys_) + AlertData(awips::Phenomenon phenomenon) : phenomenon_ {phenomenon} { - const std::string& defaultValue = kDefaultPalettes_.at(name); - - auto result = - palette_.emplace(name, SettingsVariable {name}); - - SettingsVariable& settingsVariable = result.first->second; - - settingsVariable.SetDefault(defaultValue); - - variables_.push_back(&settingsVariable); - }; - - activeAlertColor_.reserve(kAlertColors_.size()); - inactiveAlertColor_.reserve(kAlertColors_.size()); - - for (auto& alert : kAlertColors_) - { - std::string phenomenonCode = awips::GetPhenomenonCode(alert.first); - std::string activeName = fmt::format("{}-active", phenomenonCode); - std::string inactiveName = fmt::format("{}-inactive", phenomenonCode); - - auto activeResult = activeAlertColor_.emplace( - alert.first, SettingsVariable {activeName}); - auto inactiveResult = inactiveAlertColor_.emplace( - alert.first, SettingsVariable {inactiveName}); - - SettingsVariable& activeVariable = - activeResult.first->second; - SettingsVariable& inactiveVariable = - inactiveResult.first->second; - - activeVariable.SetDefault( - util::color::ToArgbString(alert.second.first)); - inactiveVariable.SetDefault( - util::color::ToArgbString(alert.second.second)); - - activeVariable.SetValidator(&ValidateColor); - inactiveVariable.SetValidator(&ValidateColor); - - variables_.push_back(&activeVariable); - variables_.push_back(&inactiveVariable); + auto& info = awips::ibw::GetImpactBasedWarningInfo(phenomenon); + for (auto& threatCategory : info.threatCategories_) + { + std::string threatCategoryName = + awips::ibw::GetThreatCategoryName(threatCategory); + boost::algorithm::to_lower(threatCategoryName); + threatCategoryMap_.emplace(threatCategory, threatCategoryName); + } } + + void RegisterVariables(SettingsCategory& settings); + + awips::Phenomenon phenomenon_; + + std::map> + threatCategoryMap_ {}; + + SettingsVariable observed_ {"observed"}; + SettingsVariable tornadoPossible_ {"tornado_possible"}; + SettingsVariable inactive_ {"inactive"}; + }; + + explicit Impl(PaletteSettings* self) : self_ {self} + { + InitializeColorTables(); + InitializeLegacyAlerts(); + InitializeAlerts(); } ~Impl() {} + void InitializeColorTables(); + void InitializeLegacyAlerts(); + void InitializeAlerts(); + static bool ValidateColor(const std::string& value); + PaletteSettings* self_; + std::unordered_map> palette_ {}; std::unordered_map> activeAlertColor_ {}; std::unordered_map> inactiveAlertColor_ {}; std::vector variables_ {}; + + std::unordered_map alertDataMap_ {}; + + std::vector alertSettings_ {}; }; bool PaletteSettings::Impl::ValidateColor(const std::string& value) @@ -145,7 +139,7 @@ bool PaletteSettings::Impl::ValidateColor(const std::string& value) } PaletteSettings::PaletteSettings() : - SettingsCategory("palette"), p(std::make_unique()) + SettingsCategory("palette"), p(std::make_unique(this)) { RegisterVariables(p->variables_); SetDefaults(); @@ -158,6 +152,99 @@ PaletteSettings::PaletteSettings(PaletteSettings&&) noexcept = default; PaletteSettings& PaletteSettings::operator=(PaletteSettings&&) noexcept = default; +void PaletteSettings::Impl::InitializeColorTables() +{ + palette_.reserve(kPaletteKeys_.size()); + + for (const auto& name : kPaletteKeys_) + { + const std::string& defaultValue = kDefaultPalettes_.at(name); + + auto result = + palette_.emplace(name, SettingsVariable {name}); + + SettingsVariable& settingsVariable = result.first->second; + + settingsVariable.SetDefault(defaultValue); + + variables_.push_back(&settingsVariable); + }; +} + +void PaletteSettings::Impl::InitializeLegacyAlerts() +{ + activeAlertColor_.reserve(kAlertColors_.size()); + inactiveAlertColor_.reserve(kAlertColors_.size()); + + for (auto& alert : kAlertColors_) + { + std::string phenomenonCode = awips::GetPhenomenonCode(alert.first); + std::string activeName = fmt::format("{}-active", phenomenonCode); + std::string inactiveName = fmt::format("{}-inactive", phenomenonCode); + + auto activeResult = activeAlertColor_.emplace( + alert.first, SettingsVariable {activeName}); + auto inactiveResult = inactiveAlertColor_.emplace( + alert.first, SettingsVariable {inactiveName}); + + SettingsVariable& activeVariable = + activeResult.first->second; + SettingsVariable& inactiveVariable = + inactiveResult.first->second; + + activeVariable.SetDefault(util::color::ToArgbString(alert.second.first)); + inactiveVariable.SetDefault( + util::color::ToArgbString(alert.second.second)); + + activeVariable.SetValidator(&ValidateColor); + inactiveVariable.SetValidator(&ValidateColor); + + variables_.push_back(&activeVariable); + variables_.push_back(&inactiveVariable); + } +} + +void PaletteSettings::Impl::InitializeAlerts() +{ + for (auto phenomenon : PaletteSettings::alert_phenomena()) + { + auto pair = alertDataMap_.emplace( + std::make_pair(phenomenon, AlertData {phenomenon})); + auto& alertData = pair.first->second; + + // Variable registration + auto& settings = alertSettings_.emplace_back( + SettingsCategory {awips::GetPhenomenonCode(phenomenon)}); + + alertData.RegisterVariables(settings); + } + + self_->RegisterSubcategoryArray("alerts", alertSettings_); +} + +void PaletteSettings::Impl::AlertData::RegisterVariables( + SettingsCategory& settings) +{ + auto& info = awips::ibw::GetImpactBasedWarningInfo(phenomenon_); + + for (auto& threatCategory : threatCategoryMap_) + { + settings.RegisterVariables({&threatCategory.second}); + } + + if (info.hasObservedTag_) + { + settings.RegisterVariables({&observed_}); + } + + if (info.hasTornadoPossibleTag_) + { + settings.RegisterVariables({&tornadoPossible_}); + } + + settings.RegisterVariables({&inactive_}); +} + SettingsVariable& PaletteSettings::palette(const std::string& name) const { diff --git a/scwx-qt/source/scwx/qt/settings/palette_settings.hpp b/scwx-qt/source/scwx/qt/settings/palette_settings.hpp index c0f7985a..bf21e119 100644 --- a/scwx-qt/source/scwx/qt/settings/palette_settings.hpp +++ b/scwx-qt/source/scwx/qt/settings/palette_settings.hpp @@ -2,6 +2,7 @@ #include #include +#include #include #include