Register font subcategories with text settings

This commit is contained in:
Dan Paulat 2023-09-26 23:23:38 -05:00
parent ad1646d725
commit d82fb666f9
4 changed files with 95 additions and 5 deletions

View file

@ -2,6 +2,8 @@
#include <scwx/qt/util/json.hpp>
#include <scwx/util/logger.hpp>
#include <algorithm>
namespace scwx
{
namespace qt
@ -21,6 +23,8 @@ public:
const std::string name_;
std::vector<std::pair<std::string, std::vector<SettingsCategory*>>>
subcategoryArrays_;
std::vector<SettingsVariableBase*> 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<SettingsCategory>& subcategories)
{
auto& newSubcategories = p->subcategoryArrays_.emplace_back(
name, std::vector<SettingsCategory*> {});
std::transform(subcategories.begin(),
subcategories.end(),
std::back_inserter(newSubcategories.second),
[](SettingsCategory& subcategory) { return &subcategory; });
}
void SettingsCategory::RegisterVariables(
std::initializer_list<SettingsVariableBase*> variables)
{

View file

@ -50,7 +50,8 @@ public:
*/
virtual void WriteJson(boost::json::object& json) const;
protected:
void RegisterSubcategoryArray(const std::string& name,
std::vector<SettingsCategory>& subcategories);
void
RegisterVariables(std::initializer_list<SettingsVariableBase*> variables);
void RegisterVariables(std::vector<SettingsVariableBase*> variables);

View file

@ -82,6 +82,7 @@ public:
TextSettings* self_;
std::unordered_map<types::FontCategory, FontData> fontData_ {};
std::vector<SettingsCategory> fontSettings_ {};
SettingsVariable<std::int64_t> hoverTextWrap_ {"hover_text_wrap"};
SettingsVariable<std::string> 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<std::string>&