From 72402c09d45b696cd58a65b4a141a804e1cd9371 Mon Sep 17 00:00:00 2001 From: crupest Date: Mon, 24 Jan 2022 20:26:58 +0800 Subject: ... --- include/cru/ui/mapper/BorderStyleMapper.hpp | 2 +- include/cru/ui/mapper/ColorMapper.hpp | 2 +- .../ui/mapper/style/ClickStateConditionMapper.hpp | 2 +- .../cru/ui/mapper/style/FocusConditionMapper.hpp | 5 +- include/cru/ui/mapper/style/IConditionMapper.hpp | 2 +- include/cru/ui/mapper/style/IStylerMapper.hpp | 2 +- include/cru/ui/mapper/style/NoConditionMapper.hpp | 5 +- include/cru/ui/mapper/style/StyleRuleMapper.hpp | 20 ++++++++ include/cru/ui/mapper/style/StyleRuleSetMapper.hpp | 21 +++++++++ include/cru/ui/style/StyleRule.hpp | 7 +++ include/cru/ui/style/Styler.hpp | 5 ++ src/ui/CMakeLists.txt | 2 + src/ui/mapper/MapperRegistry.cpp | 26 +++++++++++ src/ui/mapper/style/StyleRuleMapper.cpp | 54 ++++++++++++++++++++++ src/ui/mapper/style/StyleRuleSetMapper.cpp | 35 ++++++++++++++ 15 files changed, 181 insertions(+), 9 deletions(-) create mode 100644 include/cru/ui/mapper/style/StyleRuleMapper.hpp create mode 100644 include/cru/ui/mapper/style/StyleRuleSetMapper.hpp create mode 100644 src/ui/mapper/style/StyleRuleMapper.cpp create mode 100644 src/ui/mapper/style/StyleRuleSetMapper.cpp diff --git a/include/cru/ui/mapper/BorderStyleMapper.hpp b/include/cru/ui/mapper/BorderStyleMapper.hpp index 4d9ae774..7a574f38 100644 --- a/include/cru/ui/mapper/BorderStyleMapper.hpp +++ b/include/cru/ui/mapper/BorderStyleMapper.hpp @@ -5,7 +5,7 @@ namespace cru::ui::mapper { class CRU_UI_API BorderStyleMapper - : BasicMapper { + : public BasicMapper { public: CRU_DEFAULT_CONSTRUCTOR_DESTRUCTOR(BorderStyleMapper) diff --git a/include/cru/ui/mapper/ColorMapper.hpp b/include/cru/ui/mapper/ColorMapper.hpp index 668a4fc2..d96ca74b 100644 --- a/include/cru/ui/mapper/ColorMapper.hpp +++ b/include/cru/ui/mapper/ColorMapper.hpp @@ -3,7 +3,7 @@ #include "cru/xml/XmlNode.hpp" namespace cru::ui::mapper { -class ColorMapper : public BasicMapper { +class CRU_UI_API ColorMapper : public BasicMapper { public: CRU_DEFAULT_CONSTRUCTOR_DESTRUCTOR(ColorMapper) diff --git a/include/cru/ui/mapper/style/ClickStateConditionMapper.hpp b/include/cru/ui/mapper/style/ClickStateConditionMapper.hpp index f60a27a1..2fea5353 100644 --- a/include/cru/ui/mapper/style/ClickStateConditionMapper.hpp +++ b/include/cru/ui/mapper/style/ClickStateConditionMapper.hpp @@ -4,7 +4,7 @@ #include "cru/ui/style/Condition.hpp" namespace cru::ui::mapper::style { -class ClickStateConditionMapper +class CRU_UI_API ClickStateConditionMapper : public BasicPtrMapper, public IConditionMapper { public: diff --git a/include/cru/ui/mapper/style/FocusConditionMapper.hpp b/include/cru/ui/mapper/style/FocusConditionMapper.hpp index 974a6739..00809850 100644 --- a/include/cru/ui/mapper/style/FocusConditionMapper.hpp +++ b/include/cru/ui/mapper/style/FocusConditionMapper.hpp @@ -4,8 +4,9 @@ #include "cru/ui/style/Condition.hpp" namespace cru::ui::mapper::style { -class FocusConditionMapper : public BasicPtrMapper, - public virtual IConditionMapper { +class CRU_UI_API FocusConditionMapper + : public BasicPtrMapper, + public virtual IConditionMapper { public: CRU_DEFAULT_CONSTRUCTOR_DESTRUCTOR(FocusConditionMapper) diff --git a/include/cru/ui/mapper/style/IConditionMapper.hpp b/include/cru/ui/mapper/style/IConditionMapper.hpp index f5d7ad1e..3fa7d10a 100644 --- a/include/cru/ui/mapper/style/IConditionMapper.hpp +++ b/include/cru/ui/mapper/style/IConditionMapper.hpp @@ -6,7 +6,7 @@ #include "cru/xml/XmlNode.hpp" namespace cru::ui::mapper::style { -struct IConditionMapper : virtual Interface { +struct CRU_UI_API IConditionMapper : virtual Interface { bool XmlElementIsOfThisType(xml::XmlElementNode* node) { return dynamic_cast(this)->XmlElementIsOfThisType(node); } diff --git a/include/cru/ui/mapper/style/IStylerMapper.hpp b/include/cru/ui/mapper/style/IStylerMapper.hpp index 03ee4289..d00f39be 100644 --- a/include/cru/ui/mapper/style/IStylerMapper.hpp +++ b/include/cru/ui/mapper/style/IStylerMapper.hpp @@ -6,7 +6,7 @@ #include "cru/xml/XmlNode.hpp" namespace cru::ui::mapper::style { -struct IStylerMapper : virtual Interface { +struct CRU_UI_API IStylerMapper : virtual Interface { bool XmlElementIsOfThisType(xml::XmlElementNode* node) { return dynamic_cast(this)->XmlElementIsOfThisType(node); } diff --git a/include/cru/ui/mapper/style/NoConditionMapper.hpp b/include/cru/ui/mapper/style/NoConditionMapper.hpp index 79985e89..ed3a9699 100644 --- a/include/cru/ui/mapper/style/NoConditionMapper.hpp +++ b/include/cru/ui/mapper/style/NoConditionMapper.hpp @@ -7,8 +7,9 @@ #include "cru/xml/XmlNode.hpp" namespace cru::ui::mapper::style { -class NoConditionMapper : public BasicPtrMapper, - public virtual IConditionMapper { +class CRU_UI_API NoConditionMapper + : public BasicPtrMapper, + public virtual IConditionMapper { public: CRU_DEFAULT_CONSTRUCTOR_DESTRUCTOR(NoConditionMapper) diff --git a/include/cru/ui/mapper/style/StyleRuleMapper.hpp b/include/cru/ui/mapper/style/StyleRuleMapper.hpp new file mode 100644 index 00000000..ce5ccf00 --- /dev/null +++ b/include/cru/ui/mapper/style/StyleRuleMapper.hpp @@ -0,0 +1,20 @@ +#pragma once +#include "../Mapper.hpp" +#include "cru/common/ClonablePtr.hpp" +#include "cru/ui/style/StyleRule.hpp" +#include "cru/xml/XmlNode.hpp" + +namespace cru::ui::mapper::style { +class CRU_UI_API StyleRuleMapper : public BasicPtrMapper { + public: + CRU_DEFAULT_CONSTRUCTOR_DESTRUCTOR(StyleRuleMapper) + + public: + bool SupportMapFromXml() override { return true; } + bool XmlElementIsOfThisType(xml::XmlElementNode* node) override; + + protected: + ClonablePtr DoMapFromXml( + xml::XmlElementNode* node) override; +}; +} // namespace cru::ui::mapper::style diff --git a/include/cru/ui/mapper/style/StyleRuleSetMapper.hpp b/include/cru/ui/mapper/style/StyleRuleSetMapper.hpp new file mode 100644 index 00000000..66b95f4a --- /dev/null +++ b/include/cru/ui/mapper/style/StyleRuleSetMapper.hpp @@ -0,0 +1,21 @@ +#pragma once +#include +#include "../../style/StyleRuleSet.hpp" +#include "../Mapper.hpp" + +namespace cru::ui::mapper::style { +class CRU_UI_API StyleRuleSetMapper + : public BasicRefMapper { + public: + CRU_DEFAULT_CONSTRUCTOR_DESTRUCTOR(StyleRuleSetMapper) + + public: + bool SupportMapFromXml() override { return true; } + bool XmlElementIsOfThisType(xml::XmlElementNode* node) override; + + protected: + std::shared_ptr DoMapFromXml( + xml::XmlElementNode* node) override; +}; +; +} // namespace cru::ui::mapper::style diff --git a/include/cru/ui/style/StyleRule.hpp b/include/cru/ui/style/StyleRule.hpp index e6035784..743aa759 100644 --- a/include/cru/ui/style/StyleRule.hpp +++ b/include/cru/ui/style/StyleRule.hpp @@ -10,6 +10,13 @@ namespace cru::ui::style { class StyleRule : public Object { public: + static ClonablePtr Create(ClonablePtr condition, + ClonablePtr styler, + String name = {}) { + return ClonablePtr(new StyleRule( + std::move(condition), std::move(styler), std::move(name))); + } + StyleRule(ClonablePtr condition, ClonablePtr styler, String name = {}); diff --git a/include/cru/ui/style/Styler.hpp b/include/cru/ui/style/Styler.hpp index 721a3bfd..3bf0b027 100644 --- a/include/cru/ui/style/Styler.hpp +++ b/include/cru/ui/style/Styler.hpp @@ -25,6 +25,11 @@ class CompoundStyler : public Styler { new CompoundStyler(std::vector>{std::move(s)...})); } + static ClonablePtr Create( + std::vector> stylers) { + return ClonablePtr(new CompoundStyler(std::move(stylers))); + } + explicit CompoundStyler(std::vector> stylers) : stylers_(std::move(stylers)) {} diff --git a/src/ui/CMakeLists.txt b/src/ui/CMakeLists.txt index fc2ef76b..47197569 100644 --- a/src/ui/CMakeLists.txt +++ b/src/ui/CMakeLists.txt @@ -42,6 +42,8 @@ add_library(cru_ui SHARED mapper/style/FocusConditionMapper.cpp mapper/style/NoConditionMapper.cpp mapper/style/OrConditionMapper.cpp + mapper/style/StyleRuleMapper.cpp + mapper/style/StyleRuleSetMapper.cpp render/BorderRenderObject.cpp render/CanvasRenderObject.cpp render/FlexLayoutRenderObject.cpp diff --git a/src/ui/mapper/MapperRegistry.cpp b/src/ui/mapper/MapperRegistry.cpp index 206d1d32..d7131e33 100644 --- a/src/ui/mapper/MapperRegistry.cpp +++ b/src/ui/mapper/MapperRegistry.cpp @@ -1,17 +1,43 @@ #include "cru/ui/mapper/MapperRegistry.hpp" +#include "cru/ui/mapper/BorderStyleMapper.hpp" +#include "cru/ui/mapper/ColorMapper.hpp" #include "cru/ui/mapper/CornerRadiusMapper.hpp" +#include "cru/ui/mapper/CursorMapper.hpp" #include "cru/ui/mapper/PointMapper.hpp" #include "cru/ui/mapper/SizeMapper.hpp" #include "cru/ui/mapper/ThicknessMapper.hpp" +#include "cru/ui/mapper/style/AndConditionMapper.hpp" +#include "cru/ui/mapper/style/BorderStylerMapper.hpp" +#include "cru/ui/mapper/style/ClickStateConditionMapper.hpp" +#include "cru/ui/mapper/style/CursorStylerMapper.hpp" +#include "cru/ui/mapper/style/FocusConditionMapper.hpp" +#include "cru/ui/mapper/style/NoConditionMapper.hpp" +#include "cru/ui/mapper/style/OrConditionMapper.hpp" +#include "cru/ui/mapper/style/StyleRuleMapper.hpp" +#include "cru/ui/mapper/style/StyleRuleSetMapper.hpp" namespace cru::ui::mapper { MapperRegistry *MapperRegistry::GetInstance() { static MapperRegistry instance; + using namespace style; + instance.RegisterMapper(new CornerRadiusMapper()); instance.RegisterMapper(new PointMapper()); instance.RegisterMapper(new SizeMapper()); instance.RegisterMapper(new ThicknessMapper()); + instance.RegisterMapper(new BorderStyleMapper()); + instance.RegisterMapper(new ColorMapper()); + instance.RegisterMapper(new CursorMapper()); + instance.RegisterMapper(new AndConditionMapper()); + instance.RegisterMapper(new BorderStylerMapper()); + instance.RegisterMapper(new ClickStateConditionMapper()); + instance.RegisterMapper(new CursorStylerMapper()); + instance.RegisterMapper(new FocusConditionMapper()); + instance.RegisterMapper(new NoConditionMapper()); + instance.RegisterMapper(new OrConditionMapper()); + instance.RegisterMapper(new StyleRuleMapper()); + instance.RegisterMapper(new StyleRuleSetMapper()); return &instance; } diff --git a/src/ui/mapper/style/StyleRuleMapper.cpp b/src/ui/mapper/style/StyleRuleMapper.cpp new file mode 100644 index 00000000..fea102ed --- /dev/null +++ b/src/ui/mapper/style/StyleRuleMapper.cpp @@ -0,0 +1,54 @@ +#include "cru/ui/mapper/style/StyleRuleMapper.hpp" +#include "cru/common/ClonablePtr.hpp" +#include "cru/ui/mapper/MapperRegistry.hpp" +#include "cru/ui/mapper/style/IConditionMapper.hpp" +#include "cru/ui/mapper/style/IStylerMapper.hpp" +#include "cru/ui/style/Condition.hpp" +#include "cru/ui/style/StyleRule.hpp" +#include "cru/ui/style/Styler.hpp" + +namespace cru::ui::mapper::style { +using namespace ui::style; +bool StyleRuleMapper::XmlElementIsOfThisType(xml::XmlElementNode* node) { + return node->GetTag().CaseInsensitiveEqual(u"StyleRule"); +} + +ClonablePtr StyleRuleMapper::DoMapFromXml( + xml::XmlElementNode* node) { + std::vector condition_mappers = + MapperRegistry::GetInstance()->GetMappersByInterface(); + std::vector styler_mappers = + MapperRegistry::GetInstance()->GetMappersByInterface(); + + std::vector> conditions; + std::vector> stylers; + + for (auto child : node->GetChildren()) { + if (child->GetType() == xml::XmlNode::Type::Element) { + auto c = child->AsElement(); + + bool resolved = false; + for (auto condition_mapper : condition_mappers) { + if (condition_mapper->XmlElementIsOfThisType(c)) { + conditions.push_back(condition_mapper->MapConditionFromXml(c)); + resolved = true; + break; + } + } + + if (!resolved) { + for (auto styler_mapper : styler_mappers) { + if (styler_mapper->XmlElementIsOfThisType(c)) { + stylers.push_back(styler_mapper->MapStylerFromXml(c)); + resolved = true; + break; + } + } + } + } + } + + return StyleRule::Create(AndCondition::Create(std::move(conditions)), + CompoundStyler::Create(std::move(stylers))); +} +} // namespace cru::ui::mapper::style diff --git a/src/ui/mapper/style/StyleRuleSetMapper.cpp b/src/ui/mapper/style/StyleRuleSetMapper.cpp new file mode 100644 index 00000000..b9199d27 --- /dev/null +++ b/src/ui/mapper/style/StyleRuleSetMapper.cpp @@ -0,0 +1,35 @@ +#include "cru/ui/mapper/style/StyleRuleSetMapper.hpp" +#include +#include "cru/ui/mapper/MapperRegistry.hpp" +#include "cru/ui/style/StyleRule.hpp" +#include "cru/ui/style/StyleRuleSet.hpp" + +namespace cru::ui::mapper::style { +using namespace cru::ui::style; + +bool StyleRuleSetMapper::XmlElementIsOfThisType(xml::XmlElementNode* node) { + return node->GetTag().CaseInsensitiveEqual(u"StyleRuleSet"); +} + +std::shared_ptr StyleRuleSetMapper::DoMapFromXml( + xml::XmlElementNode* node) { + auto style_rule_mapper = + MapperRegistry::GetInstance()->GetPtrMapper(); + + auto result = std::make_shared(); + + for (auto child : node->GetChildren()) { + if (child->GetType() == xml::XmlNode::Type::Element) { + auto c = child->AsElement(); + if (style_rule_mapper->XmlElementIsOfThisType(c)) { + auto style_rule = style_rule_mapper->MapFromXml(c); + result->AddStyleRule(*style_rule); + } else { + throw Exception(u"StyleRuleSet can only contain StyleRule."); + } + } + } + + return result; +} +} // namespace cru::ui::mapper::style -- cgit v1.2.3