From 74bb9cd27242b9320f99ff4d2b50c3051576cc14 Mon Sep 17 00:00:00 2001 From: crupest Date: Tue, 8 Feb 2022 16:53:51 +0800 Subject: ... --- include/cru/ui/ThemeManager.h | 92 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 92 insertions(+) create mode 100644 include/cru/ui/ThemeManager.h (limited to 'include/cru/ui/ThemeManager.h') diff --git a/include/cru/ui/ThemeManager.h b/include/cru/ui/ThemeManager.h new file mode 100644 index 00000000..9176d85e --- /dev/null +++ b/include/cru/ui/ThemeManager.h @@ -0,0 +1,92 @@ +#pragma once +#include "Base.h" +#include "cru/common/Base.h" +#include "cru/common/Event.h" +#include "cru/common/Exception.h" +#include "cru/platform/graphics/Brush.h" +#include "cru/ui/mapper/MapperRegistry.h" +#include "cru/ui/style/StyleRuleSet.h" +#include "cru/xml/XmlNode.h" + +#include +#include +#include +#include + +namespace cru::ui { +class CRU_UI_API ThemeResourceKeyNotExistException : public Exception { + public: + using Exception::Exception; +}; + +class CRU_UI_API BadThemeResourceException : public Exception { + public: + using Exception::Exception; +}; + +class CRU_UI_API ThemeManager : public Object { + public: + static ThemeManager* GetInstance(); + + private: + ThemeManager(); + + public: + CRU_DELETE_COPY(ThemeManager) + CRU_DELETE_MOVE(ThemeManager) + + ~ThemeManager() override; + + IEvent* ThemeResourceChangeEvent() { + return &theme_resource_change_event_; + } + + void ReadResourcesFile(const String& file_path); + + void SetThemeXml(xml::XmlElementNode* root); + + template + T GetResource(const String& key) { + auto find_result = theme_resource_map_.find(key); + if (find_result == theme_resource_map_.cend()) { + throw ThemeResourceKeyNotExistException( + 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(cache_find_result->second); + } + + auto mapper_registry = mapper::MapperRegistry::GetInstance(); + auto mapper = mapper_registry->GetMapper(); + auto resource = mapper->MapFromXml(find_result->second.xml_node); + cache[typeid(T)] = resource; + return resource; + } + + std::shared_ptr GetResourceBrush( + const String& key); + + std::shared_ptr GetResourceFont(const String& key); + + std::shared_ptr GetResourceStyleRuleSet( + 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 cache; + }; + + Event theme_resource_change_event_; + std::unique_ptr theme_resource_xml_root_; + std::unordered_map theme_resource_map_; +}; +} // namespace cru::ui -- cgit v1.2.3