From 2314a9b6c48eab47cc776d08ef7d155f9bea423d Mon Sep 17 00:00:00 2001 From: hop311 Date: Sun, 4 Aug 2024 22:22:57 +0100 Subject: Load font colour codes --- src/openvic-simulation/dataloader/NodeTools.hpp | 2 +- src/openvic-simulation/interface/GFXSprite.cpp | 4 ++-- src/openvic-simulation/interface/GFXSprite.hpp | 7 +++++-- src/openvic-simulation/interface/UI.cpp | 24 ++++++++++++++++++++---- src/openvic-simulation/interface/UI.hpp | 2 +- 5 files changed, 29 insertions(+), 10 deletions(-) (limited to 'src/openvic-simulation') diff --git a/src/openvic-simulation/dataloader/NodeTools.hpp b/src/openvic-simulation/dataloader/NodeTools.hpp index 945e5e8..79fb0ea 100644 --- a/src/openvic-simulation/dataloader/NodeTools.hpp +++ b/src/openvic-simulation/dataloader/NodeTools.hpp @@ -540,7 +540,7 @@ namespace OpenVic { template Callback auto map_callback( - tsl::ordered_map& map, Key const* key, bool warn = false + tsl::ordered_map& map, Key key, bool warn = false ) { return [&map, key, warn](Value value) -> bool { if (map.emplace(key, std::move(value)).second) { diff --git a/src/openvic-simulation/interface/GFXSprite.cpp b/src/openvic-simulation/interface/GFXSprite.cpp index 992a1ff..8acb8d4 100644 --- a/src/openvic-simulation/interface/GFXSprite.cpp +++ b/src/openvic-simulation/interface/GFXSprite.cpp @@ -6,9 +6,9 @@ using namespace OpenVic::NodeTools; Font::Font( std::string_view new_identifier, colour_argb_t new_colour, std::string_view new_fontname, std::string_view new_charset, - uint32_t new_height + uint32_t new_height, colour_codes_t&& new_colour_codes ) : HasIdentifierAndAlphaColour { new_identifier, new_colour, false }, fontname { new_fontname }, charset { new_charset }, - height { new_height } {} + height { new_height }, colour_codes { std::move(new_colour_codes) } {} node_callback_t Sprite::expect_sprites(length_callback_t length_callback, callback_t&&> callback) { return expect_dictionary_keys_and_length( diff --git a/src/openvic-simulation/interface/GFXSprite.hpp b/src/openvic-simulation/interface/GFXSprite.hpp index 49691c1..cee8c42 100644 --- a/src/openvic-simulation/interface/GFXSprite.hpp +++ b/src/openvic-simulation/interface/GFXSprite.hpp @@ -11,16 +11,19 @@ namespace OpenVic::GFX { struct Font : HasIdentifierAndAlphaColour { friend class OpenVic::UIManager; + using colour_codes_t = ordered_map; + private: std::string PROPERTY(fontname); std::string PROPERTY(charset); uint32_t PROPERTY(height); + colour_codes_t PROPERTY(colour_codes); - // TODO - colorcodes, effect + // TODO - effect Font( std::string_view new_identifier, colour_argb_t new_colour, std::string_view new_fontname, - std::string_view new_charset, uint32_t new_height + std::string_view new_charset, uint32_t new_height, colour_codes_t&& new_colour_codes ); public: diff --git a/src/openvic-simulation/interface/UI.cpp b/src/openvic-simulation/interface/UI.cpp index ea871de..db7e78a 100644 --- a/src/openvic-simulation/interface/UI.cpp +++ b/src/openvic-simulation/interface/UI.cpp @@ -8,7 +8,8 @@ using namespace OpenVic::GFX; using namespace OpenVic::GUI; bool UIManager::add_font( - std::string_view identifier, colour_argb_t colour, std::string_view fontname, std::string_view charset, uint32_t height + std::string_view identifier, colour_argb_t colour, std::string_view fontname, std::string_view charset, uint32_t height, + Font::colour_codes_t&& colour_codes ) { if (identifier.empty()) { Logger::error("Invalid font identifier - empty!"); @@ -22,23 +23,38 @@ bool UIManager::add_font( Logger::error("Invalid fontname for font ", identifier, " - empty!"); return false; } - return fonts.add_item({ identifier, colour, fontname, charset, height }, duplicate_warning_callback); + return fonts.add_item( + { identifier, colour, fontname, charset, height, std::move(colour_codes) }, + duplicate_warning_callback + ); } bool UIManager::_load_font(ast::NodeCPtr node) { std::string_view identifier, fontname, charset; colour_argb_t colour = colour_argb_t::null(); uint32_t height = 0; + Font::colour_codes_t colour_codes; + bool ret = expect_dictionary_keys( "name", ONE_EXACTLY, expect_string(assign_variable_callback(identifier)), "fontname", ONE_EXACTLY, expect_string(assign_variable_callback(fontname)), "color", ONE_EXACTLY, expect_colour_hex(assign_variable_callback(colour)), "charset", ZERO_OR_ONE, expect_string(assign_variable_callback(charset)), "height", ZERO_OR_ONE, expect_uint(assign_variable_callback(height)), - "colorcodes", ZERO_OR_ONE, success_callback, + "colorcodes", ZERO_OR_ONE, expect_dictionary( + [&colour_codes](std::string_view key, ast::NodeCPtr value) -> bool { + if (key.size() != 1) { + Logger::error("Invalid colour code key: \"", key, "\" (expected single character)"); + return false; + } + return expect_colour(map_callback(colour_codes, key.front()))(value); + } + ), "effect", ZERO_OR_ONE, success_callback )(node); - ret &= add_font(identifier, colour, fontname, charset, height); + + ret &= add_font(identifier, colour, fontname, charset, height, std::move(colour_codes)); + return ret; } diff --git a/src/openvic-simulation/interface/UI.hpp b/src/openvic-simulation/interface/UI.hpp index 9aec96c..32dba9c 100644 --- a/src/openvic-simulation/interface/UI.hpp +++ b/src/openvic-simulation/interface/UI.hpp @@ -18,7 +18,7 @@ namespace OpenVic { public: bool add_font( std::string_view identifier, colour_argb_t colour, std::string_view fontname, std::string_view charset, - uint32_t height + uint32_t height, GFX::Font::colour_codes_t&& colour_codes ); void lock_gfx_registries(); -- cgit v1.2.3-56-ga3b1