mirror of
https://github.com/ciphervance/supercell-wx.git
synced 2025-10-30 19:50:05 +00:00
Adding map settings
This commit is contained in:
parent
0ab89060e9
commit
bcf2d7bffc
7 changed files with 330 additions and 30 deletions
|
|
@ -20,7 +20,12 @@ namespace SettingsManager
|
|||
static const std::string logPrefix_ = "scwx::qt::manager::settings_manager";
|
||||
static const auto logger_ = scwx::util::Logger::Create(logPrefix_);
|
||||
|
||||
static const std::string kGeneralKey = "general";
|
||||
static const std::string kMapKey = "maps";
|
||||
static const std::string kPaletteKey = "palette";
|
||||
|
||||
static std::shared_ptr<settings::GeneralSettings> generalSettings_ = nullptr;
|
||||
static std::shared_ptr<settings::MapSettings> mapSettings_ = nullptr;
|
||||
static std::shared_ptr<settings::PaletteSettings> paletteSettings_ = nullptr;
|
||||
|
||||
static boost::json::value ConvertSettingsToJson();
|
||||
|
|
@ -79,6 +84,11 @@ std::shared_ptr<settings::GeneralSettings> general_settings()
|
|||
return generalSettings_;
|
||||
}
|
||||
|
||||
std::shared_ptr<settings::MapSettings> map_settings()
|
||||
{
|
||||
return mapSettings_;
|
||||
}
|
||||
|
||||
std::shared_ptr<settings::PaletteSettings> palette_settings()
|
||||
{
|
||||
return paletteSettings_;
|
||||
|
|
@ -88,8 +98,9 @@ static boost::json::value ConvertSettingsToJson()
|
|||
{
|
||||
boost::json::object settingsJson;
|
||||
|
||||
settingsJson["general"] = generalSettings_->ToJson();
|
||||
settingsJson["palette"] = paletteSettings_->ToJson();
|
||||
settingsJson[kGeneralKey] = generalSettings_->ToJson();
|
||||
settingsJson[kMapKey] = mapSettings_->ToJson();
|
||||
settingsJson[kPaletteKey] = paletteSettings_->ToJson();
|
||||
|
||||
return settingsJson;
|
||||
}
|
||||
|
|
@ -99,6 +110,7 @@ static void GenerateDefaultSettings()
|
|||
logger_->info("Generating default settings");
|
||||
|
||||
generalSettings_ = settings::GeneralSettings::Create();
|
||||
mapSettings_ = settings::MapSettings::Create();
|
||||
paletteSettings_ = settings::PaletteSettings::Create();
|
||||
}
|
||||
|
||||
|
|
@ -109,9 +121,11 @@ static bool LoadSettings(const boost::json::object& settingsJson)
|
|||
bool jsonDirty = false;
|
||||
|
||||
generalSettings_ = settings::GeneralSettings::Load(
|
||||
settingsJson.if_contains("general"), jsonDirty);
|
||||
settingsJson.if_contains(kGeneralKey), jsonDirty);
|
||||
mapSettings_ =
|
||||
settings::MapSettings::Load(settingsJson.if_contains(kMapKey), jsonDirty);
|
||||
paletteSettings_ = settings::PaletteSettings::Load(
|
||||
settingsJson.if_contains("palette"), jsonDirty);
|
||||
settingsJson.if_contains(kPaletteKey), jsonDirty);
|
||||
|
||||
return jsonDirty;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
#pragma once
|
||||
|
||||
#include <scwx/qt/settings/general_settings.hpp>
|
||||
#include <scwx/qt/settings/map_settings.hpp>
|
||||
#include <scwx/qt/settings/palette_settings.hpp>
|
||||
|
||||
namespace scwx
|
||||
|
|
@ -16,6 +17,7 @@ void Initialize();
|
|||
void ReadSettings(const std::string& settingsPath);
|
||||
|
||||
std::shared_ptr<settings::GeneralSettings> general_settings();
|
||||
std::shared_ptr<settings::MapSettings> map_settings();
|
||||
std::shared_ptr<settings::PaletteSettings> palette_settings();
|
||||
|
||||
} // namespace SettingsManager
|
||||
|
|
|
|||
222
scwx-qt/source/scwx/qt/settings/map_settings.cpp
Normal file
222
scwx-qt/source/scwx/qt/settings/map_settings.cpp
Normal file
|
|
@ -0,0 +1,222 @@
|
|||
#include <scwx/qt/settings/map_settings.hpp>
|
||||
#include <scwx/qt/config/radar_site.hpp>
|
||||
#include <scwx/qt/util/json.hpp>
|
||||
#include <scwx/common/products.hpp>
|
||||
#include <scwx/util/logger.hpp>
|
||||
|
||||
#include <array>
|
||||
#include <execution>
|
||||
|
||||
namespace scwx
|
||||
{
|
||||
namespace qt
|
||||
{
|
||||
namespace settings
|
||||
{
|
||||
|
||||
static const std::string logPrefix_ = "scwx::qt::settings::map_settings";
|
||||
static const auto logger_ = scwx::util::Logger::Create(logPrefix_);
|
||||
|
||||
static constexpr size_t kCount_ = 4u;
|
||||
static const std::string kDefaultRadarSite_ = "KLSX";
|
||||
static const std::string kDefaultRadarProductGroup_ = "L3";
|
||||
|
||||
static const std::array<std::string, kCount_> kDefaultRadarProduct_ {
|
||||
"N0B", "N0G", "N0C", "N0X"};
|
||||
|
||||
class MapSettingsImpl
|
||||
{
|
||||
public:
|
||||
struct MapData
|
||||
{
|
||||
std::string radarSite_;
|
||||
std::string radarProductGroup_;
|
||||
std::string radarProduct_;
|
||||
};
|
||||
|
||||
explicit MapSettingsImpl() { SetDefaults(); }
|
||||
|
||||
~MapSettingsImpl() {}
|
||||
|
||||
void SetDefaults(size_t i)
|
||||
{
|
||||
map_[i].radarSite_ = kDefaultRadarSite_;
|
||||
map_[i].radarProductGroup_ = kDefaultRadarProductGroup_;
|
||||
map_[i].radarProduct_ = kDefaultRadarProduct_[i];
|
||||
}
|
||||
|
||||
void SetDefaults()
|
||||
{
|
||||
for (size_t i = 0; i < kCount_; i++)
|
||||
{
|
||||
SetDefaults(i);
|
||||
}
|
||||
}
|
||||
|
||||
std::array<MapData, kCount_> map_;
|
||||
};
|
||||
|
||||
MapSettings::MapSettings() : p(std::make_unique<MapSettingsImpl>()) {}
|
||||
MapSettings::~MapSettings() = default;
|
||||
|
||||
MapSettings::MapSettings(MapSettings&&) noexcept = default;
|
||||
MapSettings& MapSettings::operator=(MapSettings&&) noexcept = default;
|
||||
|
||||
size_t MapSettings::count() const
|
||||
{
|
||||
return kCount_;
|
||||
}
|
||||
|
||||
std::string MapSettings::radar_site(size_t i) const
|
||||
{
|
||||
return p->map_[i].radarSite_;
|
||||
}
|
||||
|
||||
std::string MapSettings::radar_product_group(size_t i) const
|
||||
{
|
||||
return p->map_[i].radarProductGroup_;
|
||||
}
|
||||
|
||||
std::string MapSettings::radar_product(size_t i) const
|
||||
{
|
||||
return p->map_[i].radarProduct_;
|
||||
}
|
||||
|
||||
boost::json::value MapSettings::ToJson() const
|
||||
{
|
||||
boost::json::value json;
|
||||
|
||||
json = boost::json::value_from(p->map_);
|
||||
|
||||
return json;
|
||||
}
|
||||
|
||||
std::shared_ptr<MapSettings> MapSettings::Create()
|
||||
{
|
||||
std::shared_ptr<MapSettings> generalSettings =
|
||||
std::make_shared<MapSettings>();
|
||||
|
||||
generalSettings->p->SetDefaults();
|
||||
|
||||
return generalSettings;
|
||||
}
|
||||
|
||||
std::shared_ptr<MapSettings> MapSettings::Load(const boost::json::value* json,
|
||||
bool& jsonDirty)
|
||||
{
|
||||
std::shared_ptr<MapSettings> mapSettings = std::make_shared<MapSettings>();
|
||||
|
||||
if (json != nullptr && json->is_array())
|
||||
{
|
||||
const boost::json::array& mapArray = json->as_array();
|
||||
|
||||
for (size_t i = 0; i < kCount_; ++i)
|
||||
{
|
||||
if (i < mapArray.size() && mapArray.at(i).is_object())
|
||||
{
|
||||
const boost::json::object& mapRecord = mapArray.at(i).as_object();
|
||||
MapSettingsImpl::MapData& mapRecordSettings =
|
||||
mapSettings->p->map_[i];
|
||||
|
||||
// Load JSON Elements
|
||||
jsonDirty |=
|
||||
!util::json::FromJsonString(mapRecord,
|
||||
"radar_site",
|
||||
mapRecordSettings.radarSite_,
|
||||
kDefaultRadarSite_);
|
||||
jsonDirty |=
|
||||
!util::json::FromJsonString(mapRecord,
|
||||
"radar_product_group",
|
||||
mapRecordSettings.radarProductGroup_,
|
||||
kDefaultRadarSite_);
|
||||
jsonDirty |=
|
||||
!util::json::FromJsonString(mapRecord,
|
||||
"radar_product",
|
||||
mapRecordSettings.radarProduct_,
|
||||
kDefaultRadarSite_);
|
||||
|
||||
// Validate Radar Site
|
||||
if (config::RadarSite::Get(mapRecordSettings.radarSite_) == nullptr)
|
||||
{
|
||||
mapRecordSettings.radarSite_ = kDefaultRadarSite_;
|
||||
jsonDirty = true;
|
||||
}
|
||||
|
||||
// Validate Radar Product Group
|
||||
common::RadarProductGroup radarProductGroup =
|
||||
common::GetRadarProductGroup(
|
||||
mapRecordSettings.radarProductGroup_);
|
||||
if (radarProductGroup == common::RadarProductGroup::Unknown)
|
||||
{
|
||||
mapRecordSettings.radarProductGroup_ =
|
||||
kDefaultRadarProductGroup_;
|
||||
radarProductGroup =
|
||||
common::GetRadarProductGroup(kDefaultRadarProductGroup_);
|
||||
jsonDirty = true;
|
||||
}
|
||||
|
||||
// Validate Radar Product
|
||||
if (radarProductGroup == common::RadarProductGroup::Level2 &&
|
||||
common::GetLevel2Product(mapRecordSettings.radarProduct_) ==
|
||||
common::Level2Product::Unknown)
|
||||
{
|
||||
mapRecordSettings.radarProductGroup_ =
|
||||
kDefaultRadarProductGroup_;
|
||||
mapRecordSettings.radarProduct_ = kDefaultRadarProduct_[i];
|
||||
jsonDirty = true;
|
||||
}
|
||||
|
||||
// TODO: Validate level 3 product
|
||||
}
|
||||
else
|
||||
{
|
||||
logger_->warn(
|
||||
"Too few array entries, resetting record {} to defaults", i + 1);
|
||||
jsonDirty = true;
|
||||
mapSettings->p->SetDefaults(i);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (json == nullptr)
|
||||
{
|
||||
logger_->warn("Key is not present, resetting to defaults");
|
||||
}
|
||||
else if (!json->is_array())
|
||||
{
|
||||
logger_->warn("Invalid json, resetting to defaults");
|
||||
}
|
||||
|
||||
mapSettings->p->SetDefaults();
|
||||
jsonDirty = true;
|
||||
}
|
||||
|
||||
return mapSettings;
|
||||
}
|
||||
|
||||
void tag_invoke(boost::json::value_from_tag,
|
||||
boost::json::value& jv,
|
||||
const MapSettingsImpl::MapData& data)
|
||||
{
|
||||
jv = {{"radar_site", data.radarSite_},
|
||||
{"radar_product_group", data.radarProductGroup_},
|
||||
{"radar_product", data.radarProduct_}};
|
||||
}
|
||||
|
||||
bool operator==(const MapSettings& lhs, const MapSettings& rhs)
|
||||
{
|
||||
return (lhs.p->map_ == rhs.p->map_);
|
||||
}
|
||||
|
||||
bool operator==(const MapSettingsImpl::MapData& lhs,
|
||||
const MapSettingsImpl::MapData& rhs)
|
||||
{
|
||||
return (lhs.radarSite_ == rhs.radarSite_ &&
|
||||
lhs.radarProductGroup_ == rhs.radarProductGroup_ &&
|
||||
lhs.radarProduct_ == rhs.radarProduct_);
|
||||
}
|
||||
|
||||
} // namespace settings
|
||||
} // namespace qt
|
||||
} // namespace scwx
|
||||
48
scwx-qt/source/scwx/qt/settings/map_settings.hpp
Normal file
48
scwx-qt/source/scwx/qt/settings/map_settings.hpp
Normal file
|
|
@ -0,0 +1,48 @@
|
|||
#pragma once
|
||||
|
||||
#include <memory>
|
||||
#include <string>
|
||||
|
||||
#include <boost/json.hpp>
|
||||
|
||||
namespace scwx
|
||||
{
|
||||
namespace qt
|
||||
{
|
||||
namespace settings
|
||||
{
|
||||
|
||||
class MapSettingsImpl;
|
||||
|
||||
class MapSettings
|
||||
{
|
||||
public:
|
||||
explicit MapSettings();
|
||||
~MapSettings();
|
||||
|
||||
MapSettings(const MapSettings&) = delete;
|
||||
MapSettings& operator=(const MapSettings&) = delete;
|
||||
|
||||
MapSettings(MapSettings&&) noexcept;
|
||||
MapSettings& operator=(MapSettings&&) noexcept;
|
||||
|
||||
size_t count() const;
|
||||
std::string radar_site(size_t i) const;
|
||||
std::string radar_product_group(size_t i) const;
|
||||
std::string radar_product(size_t i) const;
|
||||
|
||||
boost::json::value ToJson() const;
|
||||
|
||||
static std::shared_ptr<MapSettings> Create();
|
||||
static std::shared_ptr<MapSettings> Load(const boost::json::value* json,
|
||||
bool& jsonDirty);
|
||||
|
||||
friend bool operator==(const MapSettings& lhs, const MapSettings& rhs);
|
||||
|
||||
private:
|
||||
std::unique_ptr<MapSettingsImpl> p;
|
||||
};
|
||||
|
||||
} // namespace settings
|
||||
} // namespace qt
|
||||
} // namespace scwx
|
||||
Loading…
Add table
Add a link
Reference in a new issue