From 6000abdeb32f00b1bde2c6bb5fb49da632371e35 Mon Sep 17 00:00:00 2001 From: Dan Paulat Date: Wed, 21 Jun 2023 23:19:43 -0500 Subject: [PATCH] Save map style in settings - Fixes #50 --- scwx-qt/source/scwx/qt/main/main_window.cpp | 70 ++++++++++++++++++- .../scwx/qt/manager/settings_manager.cpp | 1 + scwx-qt/source/scwx/qt/map/map_widget.cpp | 15 +++- scwx-qt/source/scwx/qt/map/map_widget.hpp | 1 + .../source/scwx/qt/settings/map_settings.cpp | 35 +++++++++- .../source/scwx/qt/settings/map_settings.hpp | 3 + test/data | 2 +- 7 files changed, 120 insertions(+), 7 deletions(-) diff --git a/scwx-qt/source/scwx/qt/main/main_window.cpp b/scwx-qt/source/scwx/qt/main/main_window.cpp index 59a59c57..f3d8a4f4 100644 --- a/scwx-qt/source/scwx/qt/main/main_window.cpp +++ b/scwx-qt/source/scwx/qt/main/main_window.cpp @@ -113,6 +113,7 @@ public: void AsyncSetup(); void ConfigureMapLayout(); + void ConfigureMapStyles(); void ConnectAnimationSignals(); void ConnectMapSignals(); void ConnectOtherSignals(); @@ -275,6 +276,7 @@ MainWindow::MainWindow(QWidget* parent) : } p->PopulateMapStyles(); + p->ConfigureMapStyles(); p->ConnectMapSignals(); p->ConnectAnimationSignals(); p->ConnectOtherSignals(); @@ -597,6 +599,39 @@ void MainWindowImpl::ConfigureMapLayout() SetActiveMap(maps_.at(0)); } +void MainWindowImpl::ConfigureMapStyles() +{ + const auto& mapProviderInfo = map::GetMapProviderInfo(mapProvider_); + auto& mapSettings = manager::SettingsManager::map_settings(); + + for (std::size_t i = 0; i < maps_.size(); i++) + { + std::string styleName = mapSettings.map_style(i).GetValue(); + + if (std::find_if(mapProviderInfo.mapStyles_.cbegin(), + mapProviderInfo.mapStyles_.cend(), + [&](const auto& mapStyle) { + return mapStyle.name_ == styleName; + }) != mapProviderInfo.mapStyles_.cend()) + { + // Initialize map style from settings + maps_.at(i)->SetInitialMapStyle(styleName); + + // Update the active map's style + if (maps_[i] == activeMap_) + { + UpdateMapStyle(styleName); + } + } + else if (!mapProviderInfo.mapStyles_.empty()) + { + // Stage first valid map style from map provider + mapSettings.map_style(i).StageValue( + mapProviderInfo.mapStyles_.at(0).name_); + } + } +} + void MainWindowImpl::ConnectMapSignals() { for (const auto& mapWidget : maps_) @@ -621,7 +656,13 @@ void MainWindowImpl::ConnectMapSignals() connect(mapWidget, &map::MapWidget::MapStyleChanged, this, - &MainWindowImpl::UpdateMapStyle); + [&](const std::string& mapStyle) + { + if (mapWidget == activeMap_) + { + UpdateMapStyle(mapStyle); + } + }); connect( mapWidget, @@ -758,7 +799,21 @@ void MainWindowImpl::ConnectOtherSignals() &QComboBox::currentTextChanged, mainWindow_, [&](const QString& text) - { activeMap_->SetMapStyle(text.toStdString()); }); + { + activeMap_->SetMapStyle(text.toStdString()); + + // Update settings for active map + for (std::size_t i = 0; i < maps_.size(); ++i) + { + if (maps_[i] == activeMap_) + { + auto& mapSettings = + manager::SettingsManager::map_settings(); + mapSettings.map_style(i).StageValue(text.toStdString()); + break; + } + } + }); connect(level2ProductsWidget_, &ui::Level2ProductsWidget::RadarProductSelected, mainWindow_, @@ -925,6 +980,17 @@ void MainWindowImpl::UpdateMapStyle(const std::string& styleName) if (index != -1) { mainWindow_->ui->mapStyleComboBox->setCurrentIndex(index); + + // Update settings for active map + for (std::size_t i = 0; i < maps_.size(); ++i) + { + if (maps_[i] == activeMap_) + { + auto& mapSettings = manager::SettingsManager::map_settings(); + mapSettings.map_style(i).StageValue(styleName); + break; + } + } } } diff --git a/scwx-qt/source/scwx/qt/manager/settings_manager.cpp b/scwx-qt/source/scwx/qt/manager/settings_manager.cpp index 1ff772f0..2572ed2a 100644 --- a/scwx-qt/source/scwx/qt/manager/settings_manager.cpp +++ b/scwx-qt/source/scwx/qt/manager/settings_manager.cpp @@ -95,6 +95,7 @@ void Shutdown() bool dataChanged = false; dataChanged |= general_settings().Shutdown(); + dataChanged |= map_settings().Shutdown(); if (dataChanged) { diff --git a/scwx-qt/source/scwx/qt/map/map_widget.cpp b/scwx-qt/source/scwx/qt/map/map_widget.cpp index 187317dc..c41c90bd 100644 --- a/scwx-qt/source/scwx/qt/map/map_widget.cpp +++ b/scwx-qt/source/scwx/qt/map/map_widget.cpp @@ -154,6 +154,7 @@ public: QPointF lastPos_; std::size_t currentStyleIndex_; const MapStyle* currentStyle_; + std::string initialStyleName_ {}; uint64_t frameDraws_; @@ -585,6 +586,11 @@ void MapWidget::SetMapParameters( } } +void MapWidget::SetInitialMapStyle(const std::string& styleName) +{ + p->initialStyleName_ = styleName; +} + void MapWidget::SetMapStyle(const std::string& styleName) { const auto& mapProviderInfo = GetMapProviderInfo(p->mapProvider_); @@ -830,7 +836,14 @@ void MapWidget::initializeGL() p->prevPitch_); // Update style - changeStyle(); + if (p->initialStyleName_.empty()) + { + changeStyle(); + } + else + { + SetMapStyle(p->initialStyleName_); + } connect(p->map_.get(), &QMapLibreGL::Map::mapChanged, diff --git a/scwx-qt/source/scwx/qt/map/map_widget.hpp b/scwx-qt/source/scwx/qt/map/map_widget.hpp index b2e4633c..e1c75a79 100644 --- a/scwx-qt/source/scwx/qt/map/map_widget.hpp +++ b/scwx-qt/source/scwx/qt/map/map_widget.hpp @@ -111,6 +111,7 @@ public: double zoom, double bearing, double pitch); + void SetInitialMapStyle(const std::string& styleName); void SetMapStyle(const std::string& styleName); private: diff --git a/scwx-qt/source/scwx/qt/settings/map_settings.cpp b/scwx-qt/source/scwx/qt/settings/map_settings.cpp index 3476caca..8edd1c31 100644 --- a/scwx-qt/source/scwx/qt/settings/map_settings.cpp +++ b/scwx-qt/source/scwx/qt/settings/map_settings.cpp @@ -23,10 +23,12 @@ static const auto logger_ = scwx::util::Logger::Create(logPrefix_); static constexpr std::size_t kCount_ = 4u; static const std::string kDefaultRadarSite_ = "KLSX"; +static const std::string kMapStyleName_ {"map_style"}; static const std::string kRadarSiteName_ {"radar_site"}; static const std::string kRadarProductGroupName_ {"radar_product_group"}; static const std::string kRadarProductName_ {"radar_product"}; +static const std::string kDefaultMapStyle_ {"?"}; static constexpr common::RadarProductGroup kDefaultRadarProductGroup_ = common::RadarProductGroup::Level3; static const std::string kDefaultRadarProductGroupString_ = "L3"; @@ -38,6 +40,7 @@ class MapSettingsImpl public: struct MapData { + SettingsVariable mapStyle_ {kMapStyleName_}; SettingsVariable radarSite_ {kRadarSiteName_}; SettingsVariable radarProductGroup_ { kRadarProductGroupName_}; @@ -48,6 +51,7 @@ public: { for (std::size_t i = 0; i < kCount_; i++) { + map_[i].mapStyle_.SetDefault(kDefaultMapStyle_); map_[i].radarSite_.SetDefault(kDefaultRadarSite_); map_[i].radarProductGroup_.SetDefault( kDefaultRadarProductGroupString_); @@ -90,7 +94,8 @@ public: }); variables_.insert(variables_.cend(), - {&map_[i].radarSite_, + {&map_[i].mapStyle_, + &map_[i].radarSite_, &map_[i].radarProductGroup_, &map_[i].radarProduct_}); } @@ -100,6 +105,7 @@ public: void SetDefaults(std::size_t i) { + map_[i].mapStyle_.SetValueToDefault(); map_[i].radarSite_.SetValueToDefault(); map_[i].radarProductGroup_.SetValueToDefault(); map_[i].radarProduct_.SetValueToDefault(); @@ -127,6 +133,11 @@ std::size_t MapSettings::count() const return kCount_; } +SettingsVariable& MapSettings::map_style(std::size_t i) const +{ + return p->map_[i].mapStyle_; +} + SettingsVariable& MapSettings::radar_site(std::size_t i) const { return p->map_[i].radarSite_; @@ -143,6 +154,21 @@ SettingsVariable& MapSettings::radar_product(std::size_t i) const return p->map_[i].radarProduct_; } +bool MapSettings::Shutdown() +{ + bool dataChanged = false; + + // Commit settings that are managed separate from the settings dialog + for (std::size_t i = 0; i < kCount_; ++i) + { + MapSettingsImpl::MapData& mapRecordSettings = p->map_[i]; + + dataChanged |= mapRecordSettings.mapStyle_.Commit(); + } + + return dataChanged; +} + bool MapSettings::ReadJson(const boost::json::object& json) { bool validated = true; @@ -161,6 +187,7 @@ bool MapSettings::ReadJson(const boost::json::object& json) MapSettingsImpl::MapData& mapRecordSettings = p->map_[i]; // Load JSON Elements + validated &= mapRecordSettings.mapStyle_.ReadValue(mapRecord); validated &= mapRecordSettings.radarSite_.ReadValue(mapRecord); validated &= mapRecordSettings.radarProductGroup_.ReadValue(mapRecord); @@ -211,7 +238,8 @@ void tag_invoke(boost::json::value_from_tag, boost::json::value& jv, const MapSettingsImpl::MapData& data) { - jv = {{kRadarSiteName_, data.radarSite_.GetValue()}, + jv = {{kMapStyleName_, data.mapStyle_.GetValue()}, + {kRadarSiteName_, data.radarSite_.GetValue()}, {kRadarProductGroupName_, data.radarProductGroup_.GetValue()}, {kRadarProductName_, data.radarProduct_.GetValue()}}; } @@ -224,7 +252,8 @@ bool operator==(const MapSettings& lhs, const MapSettings& rhs) bool operator==(const MapSettingsImpl::MapData& lhs, const MapSettingsImpl::MapData& rhs) { - return (lhs.radarSite_ == rhs.radarSite_ && + return (lhs.mapStyle_ == rhs.mapStyle_ && // + lhs.radarSite_ == rhs.radarSite_ && lhs.radarProductGroup_ == rhs.radarProductGroup_ && lhs.radarProduct_ == rhs.radarProduct_); } diff --git a/scwx-qt/source/scwx/qt/settings/map_settings.hpp b/scwx-qt/source/scwx/qt/settings/map_settings.hpp index 1921c530..fd0c74dd 100644 --- a/scwx-qt/source/scwx/qt/settings/map_settings.hpp +++ b/scwx-qt/source/scwx/qt/settings/map_settings.hpp @@ -28,10 +28,13 @@ public: MapSettings& operator=(MapSettings&&) noexcept; std::size_t count() const; + SettingsVariable& map_style(std::size_t i) const; SettingsVariable& radar_site(std::size_t i) const; SettingsVariable& radar_product_group(std::size_t i) const; SettingsVariable& radar_product(std::size_t i) const; + bool Shutdown(); + /** * Reads the variables from the JSON object. * diff --git a/test/data b/test/data index 98ee5891..875afa5e 160000 --- a/test/data +++ b/test/data @@ -1 +1 @@ -Subproject commit 98ee58919fc2d616519e514f70308658c5a737e5 +Subproject commit 875afa5ead329536f802096ca1d2ef1010a7cc6b