diff options
author | crupest <crupest@outlook.com> | 2022-01-27 23:28:18 +0800 |
---|---|---|
committer | crupest <crupest@outlook.com> | 2022-01-27 23:28:18 +0800 |
commit | af43f72adcb6738eebaad505389084c17411a694 (patch) | |
tree | e5d729bd8b096b0a66fb70f75e39adc910bd5b32 /include | |
parent | 103bcb137273729a0f23ff3771e26150a64454ba (diff) | |
download | cru-af43f72adcb6738eebaad505389084c17411a694.tar.gz cru-af43f72adcb6738eebaad505389084c17411a694.tar.bz2 cru-af43f72adcb6738eebaad505389084c17411a694.zip |
...
Diffstat (limited to 'include')
-rw-r--r-- | include/cru/ui/ThemeManager.hpp | 27 | ||||
-rw-r--r-- | include/cru/xml/XmlNode.hpp | 1 |
2 files changed, 26 insertions, 2 deletions
diff --git a/include/cru/ui/ThemeManager.hpp b/include/cru/ui/ThemeManager.hpp index be9daa47..68c2b121 100644 --- a/include/cru/ui/ThemeManager.hpp +++ b/include/cru/ui/ThemeManager.hpp @@ -8,6 +8,9 @@ #include "cru/ui/style/StyleRuleSet.hpp" #include "cru/xml/XmlNode.hpp" +#include <any> +#include <typeindex> +#include <typeinfo> #include <unordered_map> namespace cru::ui { @@ -40,6 +43,8 @@ class CRU_UI_API ThemeManager : public Object { void ReadResourcesFile(const String& file_path); + void SetThemeXml(xml::XmlElementNode* root); + template <typename T> T GetResource(const String& key) { auto find_result = theme_resource_map_.find(key); @@ -48,9 +53,17 @@ class CRU_UI_API ThemeManager : public Object { Format(u"Theme resource key \"%s\" not exist.", key)); } + auto& cache = find_result->second.cache; + auto cache_find_result = cache.find(typeid(T)); + if (cache_find_result != cache.cend()) { + return std::any_cast<T>(cache_find_result->second); + } + auto mapper_registry = mapper::MapperRegistry::GetInstance(); auto mapper = mapper_registry->GetMapper<T>(); - return mapper->MapFromXml(find_result->second); + auto resource = mapper->MapFromXml(find_result->second.xml_node); + cache[typeid(T)] = resource; + return resource; } std::shared_ptr<platform::graphics::IBrush> GetResourceBrush( @@ -62,8 +75,18 @@ class CRU_UI_API ThemeManager : public Object { const String& key); private: + struct ResourceEntry { + CRU_DEFAULT_CONSTRUCTOR_DESTRUCTOR(ResourceEntry) + CRU_DEFAULT_COPY(ResourceEntry) + CRU_DEFAULT_MOVE(ResourceEntry) + + String name; + xml::XmlElementNode* xml_node; + std::unordered_map<std::type_index, std::any> cache; + }; + Event<std::nullptr_t> theme_resource_change_event_; std::unique_ptr<xml::XmlElementNode> theme_resource_xml_root_; - std::unordered_map<String, xml::XmlElementNode*> theme_resource_map_; + std::unordered_map<String, ResourceEntry> theme_resource_map_; }; } // namespace cru::ui diff --git a/include/cru/xml/XmlNode.hpp b/include/cru/xml/XmlNode.hpp index d1cb9430..cfe6e155 100644 --- a/include/cru/xml/XmlNode.hpp +++ b/include/cru/xml/XmlNode.hpp @@ -121,6 +121,7 @@ class CRU_XML_API XmlElementNode : public XmlNode { void AddAttribute(String key, String value); void AddChild(XmlNode* child); + Index GetChildElementCount() const; XmlElementNode* GetFirstChildElement() const; XmlNode* Clone() const override; |