Save map style in settings

- Fixes #50
This commit is contained in:
Dan Paulat 2023-06-21 23:19:43 -05:00
parent effe78e1be
commit 6000abdeb3
7 changed files with 120 additions and 7 deletions

View file

@ -113,6 +113,7 @@ public:
void AsyncSetup(); void AsyncSetup();
void ConfigureMapLayout(); void ConfigureMapLayout();
void ConfigureMapStyles();
void ConnectAnimationSignals(); void ConnectAnimationSignals();
void ConnectMapSignals(); void ConnectMapSignals();
void ConnectOtherSignals(); void ConnectOtherSignals();
@ -275,6 +276,7 @@ MainWindow::MainWindow(QWidget* parent) :
} }
p->PopulateMapStyles(); p->PopulateMapStyles();
p->ConfigureMapStyles();
p->ConnectMapSignals(); p->ConnectMapSignals();
p->ConnectAnimationSignals(); p->ConnectAnimationSignals();
p->ConnectOtherSignals(); p->ConnectOtherSignals();
@ -597,6 +599,39 @@ void MainWindowImpl::ConfigureMapLayout()
SetActiveMap(maps_.at(0)); 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() void MainWindowImpl::ConnectMapSignals()
{ {
for (const auto& mapWidget : maps_) for (const auto& mapWidget : maps_)
@ -621,7 +656,13 @@ void MainWindowImpl::ConnectMapSignals()
connect(mapWidget, connect(mapWidget,
&map::MapWidget::MapStyleChanged, &map::MapWidget::MapStyleChanged,
this, this,
&MainWindowImpl::UpdateMapStyle); [&](const std::string& mapStyle)
{
if (mapWidget == activeMap_)
{
UpdateMapStyle(mapStyle);
}
});
connect( connect(
mapWidget, mapWidget,
@ -758,7 +799,21 @@ void MainWindowImpl::ConnectOtherSignals()
&QComboBox::currentTextChanged, &QComboBox::currentTextChanged,
mainWindow_, mainWindow_,
[&](const QString& text) [&](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_, connect(level2ProductsWidget_,
&ui::Level2ProductsWidget::RadarProductSelected, &ui::Level2ProductsWidget::RadarProductSelected,
mainWindow_, mainWindow_,
@ -925,6 +980,17 @@ void MainWindowImpl::UpdateMapStyle(const std::string& styleName)
if (index != -1) if (index != -1)
{ {
mainWindow_->ui->mapStyleComboBox->setCurrentIndex(index); 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;
}
}
} }
} }

View file

@ -95,6 +95,7 @@ void Shutdown()
bool dataChanged = false; bool dataChanged = false;
dataChanged |= general_settings().Shutdown(); dataChanged |= general_settings().Shutdown();
dataChanged |= map_settings().Shutdown();
if (dataChanged) if (dataChanged)
{ {

View file

@ -154,6 +154,7 @@ public:
QPointF lastPos_; QPointF lastPos_;
std::size_t currentStyleIndex_; std::size_t currentStyleIndex_;
const MapStyle* currentStyle_; const MapStyle* currentStyle_;
std::string initialStyleName_ {};
uint64_t frameDraws_; 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) void MapWidget::SetMapStyle(const std::string& styleName)
{ {
const auto& mapProviderInfo = GetMapProviderInfo(p->mapProvider_); const auto& mapProviderInfo = GetMapProviderInfo(p->mapProvider_);
@ -830,7 +836,14 @@ void MapWidget::initializeGL()
p->prevPitch_); p->prevPitch_);
// Update style // Update style
changeStyle(); if (p->initialStyleName_.empty())
{
changeStyle();
}
else
{
SetMapStyle(p->initialStyleName_);
}
connect(p->map_.get(), connect(p->map_.get(),
&QMapLibreGL::Map::mapChanged, &QMapLibreGL::Map::mapChanged,

View file

@ -111,6 +111,7 @@ public:
double zoom, double zoom,
double bearing, double bearing,
double pitch); double pitch);
void SetInitialMapStyle(const std::string& styleName);
void SetMapStyle(const std::string& styleName); void SetMapStyle(const std::string& styleName);
private: private:

View file

@ -23,10 +23,12 @@ static const auto logger_ = scwx::util::Logger::Create(logPrefix_);
static constexpr std::size_t kCount_ = 4u; static constexpr std::size_t kCount_ = 4u;
static const std::string kDefaultRadarSite_ = "KLSX"; static const std::string kDefaultRadarSite_ = "KLSX";
static const std::string kMapStyleName_ {"map_style"};
static const std::string kRadarSiteName_ {"radar_site"}; static const std::string kRadarSiteName_ {"radar_site"};
static const std::string kRadarProductGroupName_ {"radar_product_group"}; static const std::string kRadarProductGroupName_ {"radar_product_group"};
static const std::string kRadarProductName_ {"radar_product"}; static const std::string kRadarProductName_ {"radar_product"};
static const std::string kDefaultMapStyle_ {"?"};
static constexpr common::RadarProductGroup kDefaultRadarProductGroup_ = static constexpr common::RadarProductGroup kDefaultRadarProductGroup_ =
common::RadarProductGroup::Level3; common::RadarProductGroup::Level3;
static const std::string kDefaultRadarProductGroupString_ = "L3"; static const std::string kDefaultRadarProductGroupString_ = "L3";
@ -38,6 +40,7 @@ class MapSettingsImpl
public: public:
struct MapData struct MapData
{ {
SettingsVariable<std::string> mapStyle_ {kMapStyleName_};
SettingsVariable<std::string> radarSite_ {kRadarSiteName_}; SettingsVariable<std::string> radarSite_ {kRadarSiteName_};
SettingsVariable<std::string> radarProductGroup_ { SettingsVariable<std::string> radarProductGroup_ {
kRadarProductGroupName_}; kRadarProductGroupName_};
@ -48,6 +51,7 @@ public:
{ {
for (std::size_t i = 0; i < kCount_; i++) for (std::size_t i = 0; i < kCount_; i++)
{ {
map_[i].mapStyle_.SetDefault(kDefaultMapStyle_);
map_[i].radarSite_.SetDefault(kDefaultRadarSite_); map_[i].radarSite_.SetDefault(kDefaultRadarSite_);
map_[i].radarProductGroup_.SetDefault( map_[i].radarProductGroup_.SetDefault(
kDefaultRadarProductGroupString_); kDefaultRadarProductGroupString_);
@ -90,7 +94,8 @@ public:
}); });
variables_.insert(variables_.cend(), variables_.insert(variables_.cend(),
{&map_[i].radarSite_, {&map_[i].mapStyle_,
&map_[i].radarSite_,
&map_[i].radarProductGroup_, &map_[i].radarProductGroup_,
&map_[i].radarProduct_}); &map_[i].radarProduct_});
} }
@ -100,6 +105,7 @@ public:
void SetDefaults(std::size_t i) void SetDefaults(std::size_t i)
{ {
map_[i].mapStyle_.SetValueToDefault();
map_[i].radarSite_.SetValueToDefault(); map_[i].radarSite_.SetValueToDefault();
map_[i].radarProductGroup_.SetValueToDefault(); map_[i].radarProductGroup_.SetValueToDefault();
map_[i].radarProduct_.SetValueToDefault(); map_[i].radarProduct_.SetValueToDefault();
@ -127,6 +133,11 @@ std::size_t MapSettings::count() const
return kCount_; return kCount_;
} }
SettingsVariable<std::string>& MapSettings::map_style(std::size_t i) const
{
return p->map_[i].mapStyle_;
}
SettingsVariable<std::string>& MapSettings::radar_site(std::size_t i) const SettingsVariable<std::string>& MapSettings::radar_site(std::size_t i) const
{ {
return p->map_[i].radarSite_; return p->map_[i].radarSite_;
@ -143,6 +154,21 @@ SettingsVariable<std::string>& MapSettings::radar_product(std::size_t i) const
return p->map_[i].radarProduct_; 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 MapSettings::ReadJson(const boost::json::object& json)
{ {
bool validated = true; bool validated = true;
@ -161,6 +187,7 @@ bool MapSettings::ReadJson(const boost::json::object& json)
MapSettingsImpl::MapData& mapRecordSettings = p->map_[i]; MapSettingsImpl::MapData& mapRecordSettings = p->map_[i];
// Load JSON Elements // Load JSON Elements
validated &= mapRecordSettings.mapStyle_.ReadValue(mapRecord);
validated &= mapRecordSettings.radarSite_.ReadValue(mapRecord); validated &= mapRecordSettings.radarSite_.ReadValue(mapRecord);
validated &= validated &=
mapRecordSettings.radarProductGroup_.ReadValue(mapRecord); mapRecordSettings.radarProductGroup_.ReadValue(mapRecord);
@ -211,7 +238,8 @@ void tag_invoke(boost::json::value_from_tag,
boost::json::value& jv, boost::json::value& jv,
const MapSettingsImpl::MapData& data) const MapSettingsImpl::MapData& data)
{ {
jv = {{kRadarSiteName_, data.radarSite_.GetValue()}, jv = {{kMapStyleName_, data.mapStyle_.GetValue()},
{kRadarSiteName_, data.radarSite_.GetValue()},
{kRadarProductGroupName_, data.radarProductGroup_.GetValue()}, {kRadarProductGroupName_, data.radarProductGroup_.GetValue()},
{kRadarProductName_, data.radarProduct_.GetValue()}}; {kRadarProductName_, data.radarProduct_.GetValue()}};
} }
@ -224,7 +252,8 @@ bool operator==(const MapSettings& lhs, const MapSettings& rhs)
bool operator==(const MapSettingsImpl::MapData& lhs, bool operator==(const MapSettingsImpl::MapData& lhs,
const MapSettingsImpl::MapData& rhs) const MapSettingsImpl::MapData& rhs)
{ {
return (lhs.radarSite_ == rhs.radarSite_ && return (lhs.mapStyle_ == rhs.mapStyle_ && //
lhs.radarSite_ == rhs.radarSite_ &&
lhs.radarProductGroup_ == rhs.radarProductGroup_ && lhs.radarProductGroup_ == rhs.radarProductGroup_ &&
lhs.radarProduct_ == rhs.radarProduct_); lhs.radarProduct_ == rhs.radarProduct_);
} }

View file

@ -28,10 +28,13 @@ public:
MapSettings& operator=(MapSettings&&) noexcept; MapSettings& operator=(MapSettings&&) noexcept;
std::size_t count() const; std::size_t count() const;
SettingsVariable<std::string>& map_style(std::size_t i) const;
SettingsVariable<std::string>& radar_site(std::size_t i) const; SettingsVariable<std::string>& radar_site(std::size_t i) const;
SettingsVariable<std::string>& radar_product_group(std::size_t i) const; SettingsVariable<std::string>& radar_product_group(std::size_t i) const;
SettingsVariable<std::string>& radar_product(std::size_t i) const; SettingsVariable<std::string>& radar_product(std::size_t i) const;
bool Shutdown();
/** /**
* Reads the variables from the JSON object. * Reads the variables from the JSON object.
* *

@ -1 +1 @@
Subproject commit 98ee58919fc2d616519e514f70308658c5a737e5 Subproject commit 875afa5ead329536f802096ca1d2ef1010a7cc6b