diff --git a/scwx-qt/source/scwx/qt/settings/settings_category.cpp b/scwx-qt/source/scwx/qt/settings/settings_category.cpp index 75daf41d..e6c929f8 100644 --- a/scwx-qt/source/scwx/qt/settings/settings_category.cpp +++ b/scwx-qt/source/scwx/qt/settings/settings_category.cpp @@ -2,6 +2,8 @@ #include #include +#include + namespace scwx { namespace qt @@ -21,6 +23,8 @@ public: const std::string name_; + std::vector>> + subcategoryArrays_; std::vector variables_; }; @@ -41,6 +45,16 @@ std::string SettingsCategory::name() const void SettingsCategory::SetDefaults() { + // Set subcategory array defaults + for (auto& subcategoryArray : p->subcategoryArrays_) + { + for (auto& subcategory : subcategoryArray.second) + { + subcategory->SetDefaults(); + } + } + + // Set variable defaults for (auto& variable : p->variables_) { variable->SetValueToDefault(); @@ -57,6 +71,47 @@ bool SettingsCategory::ReadJson(const boost::json::object& json) { const boost::json::object& object = value->as_object(); + // Read subcategory arrays + for (auto& subcategoryArray : p->subcategoryArrays_) + { + const boost::json::value* arrayValue = + object.if_contains(subcategoryArray.first); + + if (arrayValue != nullptr && arrayValue->is_object()) + { + const boost::json::object& arrayObject = arrayValue->as_object(); + + for (auto& subcategory : subcategoryArray.second) + { + validated &= subcategory->ReadJson(arrayObject); + } + } + else + { + if (arrayValue == nullptr) + { + logger_->debug( + "Subcategory array key {} is not present, resetting to " + "defaults", + subcategoryArray.first); + } + else if (!arrayValue->is_object()) + { + logger_->warn( + "Invalid json for subcategory array key {}, resetting to " + "defaults", + p->name_); + } + + for (auto& subcategory : subcategoryArray.second) + { + subcategory->SetDefaults(); + } + validated = false; + } + } + + // Read variables for (auto& variable : p->variables_) { validated &= variable->ReadValue(object); @@ -66,8 +121,8 @@ bool SettingsCategory::ReadJson(const boost::json::object& json) { if (value == nullptr) { - logger_->warn("Key {} is not present, resetting to defaults", - p->name_); + logger_->debug("Key {} is not present, resetting to defaults", + p->name_); } else if (!value->is_object()) { @@ -86,6 +141,20 @@ void SettingsCategory::WriteJson(boost::json::object& json) const { boost::json::object object; + // Write subcategory arrays + for (auto& subcategoryArray : p->subcategoryArrays_) + { + boost::json::object arrayObject; + + for (auto& subcategory : subcategoryArray.second) + { + subcategory->WriteJson(arrayObject); + } + + object.insert_or_assign(subcategoryArray.first, arrayObject); + } + + // Write variables for (auto& variable : p->variables_) { variable->WriteValue(object); @@ -94,6 +163,18 @@ void SettingsCategory::WriteJson(boost::json::object& json) const json.insert_or_assign(p->name_, object); } +void SettingsCategory::RegisterSubcategoryArray( + const std::string& name, std::vector& subcategories) +{ + auto& newSubcategories = p->subcategoryArrays_.emplace_back( + name, std::vector {}); + + std::transform(subcategories.begin(), + subcategories.end(), + std::back_inserter(newSubcategories.second), + [](SettingsCategory& subcategory) { return &subcategory; }); +} + void SettingsCategory::RegisterVariables( std::initializer_list variables) { diff --git a/scwx-qt/source/scwx/qt/settings/settings_category.hpp b/scwx-qt/source/scwx/qt/settings/settings_category.hpp index cc07a7d7..d7c86abd 100644 --- a/scwx-qt/source/scwx/qt/settings/settings_category.hpp +++ b/scwx-qt/source/scwx/qt/settings/settings_category.hpp @@ -50,7 +50,8 @@ public: */ virtual void WriteJson(boost::json::object& json) const; -protected: + void RegisterSubcategoryArray(const std::string& name, + std::vector& subcategories); void RegisterVariables(std::initializer_list variables); void RegisterVariables(std::vector variables); diff --git a/scwx-qt/source/scwx/qt/settings/text_settings.cpp b/scwx-qt/source/scwx/qt/settings/text_settings.cpp index 6d4ceafa..980abf40 100644 --- a/scwx-qt/source/scwx/qt/settings/text_settings.cpp +++ b/scwx-qt/source/scwx/qt/settings/text_settings.cpp @@ -82,6 +82,7 @@ public: TextSettings* self_; std::unordered_map fontData_ {}; + std::vector fontSettings_ {}; SettingsVariable hoverTextWrap_ {"hover_text_wrap"}; SettingsVariable tooltipMethod_ {"tooltip_method"}; @@ -120,8 +121,15 @@ void TextSettings::Impl::InitializeFontVariables() font.fontPointSize_.SetMinimum(6.0); font.fontPointSize_.SetMaximum(72.0); - // TODO: Variable registration + // Variable registration + auto& settings = fontSettings_.emplace_back( + SettingsCategory {types::GetFontCategoryName(fontCategory)}); + + settings.RegisterVariables( + {&font.fontFamily_, &font.fontStyle_, &font.fontPointSize_}); } + + self_->RegisterSubcategoryArray("fonts", fontSettings_); } SettingsVariable& diff --git a/test/data b/test/data index 33caca18..1685e404 160000 --- a/test/data +++ b/test/data @@ -1 +1 @@ -Subproject commit 33caca188b1007c643db75afa560fdfe348c0ee5 +Subproject commit 1685e4048ef4a9f34bc11ecbb8db4905dd0a2e19