From 14d9efc39635dab2c6c0f791d6b0a63c92d941ee Mon Sep 17 00:00:00 2001 From: crupest Date: Sat, 22 Jan 2022 22:22:45 +0800 Subject: ... --- include/cru/ui/mapper/BorderStyleMapper.hpp | 20 ++++++++ include/cru/ui/mapper/ColorMapper.hpp | 4 +- include/cru/ui/mapper/CornerRadiusMapper.hpp | 3 +- include/cru/ui/mapper/CursorMapper.hpp | 5 ++ include/cru/ui/mapper/Mapper.hpp | 14 +++--- include/cru/ui/mapper/PointMapper.hpp | 4 +- include/cru/ui/mapper/SizeMapper.hpp | 4 +- include/cru/ui/mapper/ThicknessMapper.hpp | 4 +- include/cru/ui/mapper/style/BorderStyleMapper.hpp | 20 -------- include/cru/ui/style/ApplyBorderStyleInfo.hpp | 5 +- src/ui/CMakeLists.txt | 3 +- src/ui/mapper/BorderStyleMapper.cpp | 56 +++++++++++++++++++++++ src/ui/mapper/ColorMapper.cpp | 8 ++-- src/ui/mapper/CornerRadiusMapper.cpp | 16 +++---- src/ui/mapper/CursorMapper.cpp | 3 ++ src/ui/mapper/PointMapper.cpp | 10 ++-- src/ui/mapper/SizeMapper.cpp | 10 ++-- src/ui/mapper/ThicknessMapper.cpp | 16 +++---- src/ui/mapper/style/BorderStyleMapper.cpp | 56 ----------------------- 19 files changed, 133 insertions(+), 128 deletions(-) create mode 100644 include/cru/ui/mapper/BorderStyleMapper.hpp create mode 100644 include/cru/ui/mapper/CursorMapper.hpp delete mode 100644 include/cru/ui/mapper/style/BorderStyleMapper.hpp create mode 100644 src/ui/mapper/BorderStyleMapper.cpp create mode 100644 src/ui/mapper/CursorMapper.cpp delete mode 100644 src/ui/mapper/style/BorderStyleMapper.cpp diff --git a/include/cru/ui/mapper/BorderStyleMapper.hpp b/include/cru/ui/mapper/BorderStyleMapper.hpp new file mode 100644 index 00000000..4d9ae774 --- /dev/null +++ b/include/cru/ui/mapper/BorderStyleMapper.hpp @@ -0,0 +1,20 @@ +#pragma once +#include "Mapper.hpp" +#include "cru/ui/style/ApplyBorderStyleInfo.hpp" +#include "cru/xml/XmlNode.hpp" + +namespace cru::ui::mapper { +class CRU_UI_API BorderStyleMapper + : BasicMapper { + public: + CRU_DEFAULT_CONSTRUCTOR_DESTRUCTOR(BorderStyleMapper) + + public: + bool SupportMapFromXml() override { return true; } + bool XmlElementIsOfThisType(xml::XmlElementNode* node) override; + + protected: + ui::style::ApplyBorderStyleInfo DoMapFromXml( + xml::XmlElementNode* node) override; +}; +} // namespace cru::ui::mapper diff --git a/include/cru/ui/mapper/ColorMapper.hpp b/include/cru/ui/mapper/ColorMapper.hpp index 33333025..668a4fc2 100644 --- a/include/cru/ui/mapper/ColorMapper.hpp +++ b/include/cru/ui/mapper/ColorMapper.hpp @@ -13,7 +13,7 @@ class ColorMapper : public BasicMapper { bool XmlElementIsOfThisType(xml::XmlElementNode* node) override; protected: - std::unique_ptr DoMapFromString(String str) override; - std::unique_ptr DoMapFromXml(xml::XmlElementNode* node) override; + Color DoMapFromString(String str) override; + Color DoMapFromXml(xml::XmlElementNode* node) override; }; } // namespace cru::ui::mapper diff --git a/include/cru/ui/mapper/CornerRadiusMapper.hpp b/include/cru/ui/mapper/CornerRadiusMapper.hpp index b9fe6a52..4d83f2de 100644 --- a/include/cru/ui/mapper/CornerRadiusMapper.hpp +++ b/include/cru/ui/mapper/CornerRadiusMapper.hpp @@ -12,7 +12,6 @@ class CRU_UI_API CornerRadiusMapper : public BasicMapper { bool XmlElementIsOfThisType(xml::XmlElementNode* node) override; protected: - std::unique_ptr DoMapFromXml( - xml::XmlElementNode* node) override; + CornerRadius DoMapFromXml(xml::XmlElementNode* node) override; }; } // namespace cru::ui::mapper diff --git a/include/cru/ui/mapper/CursorMapper.hpp b/include/cru/ui/mapper/CursorMapper.hpp new file mode 100644 index 00000000..b4254061 --- /dev/null +++ b/include/cru/ui/mapper/CursorMapper.hpp @@ -0,0 +1,5 @@ +#pragma once +#include "Mapper.hpp" +#include "cru/platform/gui/Cursor.hpp" + +namespace cru::ui::mapper::style {} diff --git a/include/cru/ui/mapper/Mapper.hpp b/include/cru/ui/mapper/Mapper.hpp index 79aa39aa..d15b63aa 100644 --- a/include/cru/ui/mapper/Mapper.hpp +++ b/include/cru/ui/mapper/Mapper.hpp @@ -5,6 +5,7 @@ #include "cru/common/Exception.hpp" #include "cru/xml/XmlNode.hpp" +#include #include #include @@ -41,6 +42,9 @@ class CRU_UI_API MapperBase : public Object { template class CRU_UI_API BasicMapper : public MapperBase { public: + static_assert(std::is_default_constructible_v, + "T must be default constructible."); + BasicMapper() : MapperBase(typeid(T)) {} CRU_DELETE_COPY(BasicMapper) @@ -49,7 +53,7 @@ class CRU_UI_API BasicMapper : public MapperBase { ~BasicMapper() override = default; virtual bool SupportMapFromString() { return false; } - virtual std::unique_ptr MapFromString(String str) { + virtual T MapFromString(String str) { if (!SupportMapFromString()) { throw Exception(u"This mapper does not support map from string."); } @@ -61,7 +65,7 @@ class CRU_UI_API BasicMapper : public MapperBase { virtual bool XmlElementIsOfThisType(xml::XmlElementNode* node) { return false; } - std::unique_ptr MapFromXml(xml::XmlElementNode* node) { + T MapFromXml(xml::XmlElementNode* node) { if (!SupportMapFromXml()) { throw new Exception(u"This mapper does not support map from xml."); } @@ -74,9 +78,7 @@ class CRU_UI_API BasicMapper : public MapperBase { } protected: - virtual std::unique_ptr DoMapFromString(String str) { return nullptr; } - virtual std::unique_ptr DoMapFromXml(xml::XmlElementNode* node) { - return nullptr; - } + virtual T DoMapFromString(String str) { return {}; } + virtual T DoMapFromXml(xml::XmlElementNode* node) { return {}; } }; } // namespace cru::ui::mapper diff --git a/include/cru/ui/mapper/PointMapper.hpp b/include/cru/ui/mapper/PointMapper.hpp index 5641af01..b1837fe1 100644 --- a/include/cru/ui/mapper/PointMapper.hpp +++ b/include/cru/ui/mapper/PointMapper.hpp @@ -12,7 +12,7 @@ class CRU_UI_API PointMapper : public BasicMapper { bool XmlElementIsOfThisType(xml::XmlElementNode* node) override; protected: - std::unique_ptr DoMapFromString(String str) override; - std::unique_ptr DoMapFromXml(xml::XmlElementNode* node) override; + Point DoMapFromString(String str) override; + Point DoMapFromXml(xml::XmlElementNode* node) override; }; } // namespace cru::ui::mapper diff --git a/include/cru/ui/mapper/SizeMapper.hpp b/include/cru/ui/mapper/SizeMapper.hpp index 20558bf4..6ab4b97d 100644 --- a/include/cru/ui/mapper/SizeMapper.hpp +++ b/include/cru/ui/mapper/SizeMapper.hpp @@ -12,7 +12,7 @@ class CRU_UI_API SizeMapper : public BasicMapper { bool XmlElementIsOfThisType(xml::XmlElementNode* node) override; protected: - std::unique_ptr DoMapFromString(String str) override; - std::unique_ptr DoMapFromXml(xml::XmlElementNode* node) override; + Size DoMapFromString(String str) override; + Size DoMapFromXml(xml::XmlElementNode* node) override; }; } // namespace cru::ui::mapper diff --git a/include/cru/ui/mapper/ThicknessMapper.hpp b/include/cru/ui/mapper/ThicknessMapper.hpp index 68bbcf49..4ffbeb9b 100644 --- a/include/cru/ui/mapper/ThicknessMapper.hpp +++ b/include/cru/ui/mapper/ThicknessMapper.hpp @@ -16,7 +16,7 @@ class CRU_UI_API ThicknessMapper : public BasicMapper { bool XmlElementIsOfThisType(xml::XmlElementNode* node) override; protected: - std::unique_ptr DoMapFromString(String str) override; - std::unique_ptr DoMapFromXml(xml::XmlElementNode* node) override; + Thickness DoMapFromString(String str) override; + Thickness DoMapFromXml(xml::XmlElementNode* node) override; }; } // namespace cru::ui::mapper diff --git a/include/cru/ui/mapper/style/BorderStyleMapper.hpp b/include/cru/ui/mapper/style/BorderStyleMapper.hpp deleted file mode 100644 index 40a3e883..00000000 --- a/include/cru/ui/mapper/style/BorderStyleMapper.hpp +++ /dev/null @@ -1,20 +0,0 @@ -#pragma once -#include "../Mapper.hpp" -#include "cru/ui/style/ApplyBorderStyleInfo.hpp" -#include "cru/xml/XmlNode.hpp" - -namespace cru::ui::mapper::style { -class CRU_UI_API BorderStyleMapper - : BasicMapper { - public: - CRU_DEFAULT_CONSTRUCTOR_DESTRUCTOR(BorderStyleMapper) - - public: - bool SupportMapFromXml() override { return true; } - bool XmlElementIsOfThisType(xml::XmlElementNode* node) override; - - protected: - std::unique_ptr DoMapFromXml( - xml::XmlElementNode* node) override; -}; -} // namespace cru::ui::mapper::style diff --git a/include/cru/ui/style/ApplyBorderStyleInfo.hpp b/include/cru/ui/style/ApplyBorderStyleInfo.hpp index 3923ebb4..7ae5b2c5 100644 --- a/include/cru/ui/style/ApplyBorderStyleInfo.hpp +++ b/include/cru/ui/style/ApplyBorderStyleInfo.hpp @@ -5,9 +5,10 @@ namespace cru::ui::style { struct ApplyBorderStyleInfo { + ApplyBorderStyleInfo() = default; + explicit ApplyBorderStyleInfo( - std::optional> border_brush = - std::nullopt, + std::optional> border_brush, std::optional border_thickness = std::nullopt, std::optional border_radius = std::nullopt, std::optional> diff --git a/src/ui/CMakeLists.txt b/src/ui/CMakeLists.txt index b086cce1..4353a541 100644 --- a/src/ui/CMakeLists.txt +++ b/src/ui/CMakeLists.txt @@ -26,14 +26,15 @@ add_library(cru_ui SHARED helper/ShortcutHub.cpp host/LayoutPaintCycler.cpp host/WindowHost.cpp + mapper/BorderStyleMapper.cpp mapper/ColorMapper.cpp mapper/CornerRadiusMapper.cpp + mapper/CursorMapper.cpp mapper/Mapper.cpp mapper/MapperRegistry.cpp mapper/PointMapper.cpp mapper/SizeMapper.cpp mapper/ThicknessMapper.cpp - mapper/style/BorderStyleMapper.cpp render/BorderRenderObject.cpp render/CanvasRenderObject.cpp render/FlexLayoutRenderObject.cpp diff --git a/src/ui/mapper/BorderStyleMapper.cpp b/src/ui/mapper/BorderStyleMapper.cpp new file mode 100644 index 00000000..65dbfe3b --- /dev/null +++ b/src/ui/mapper/BorderStyleMapper.cpp @@ -0,0 +1,56 @@ +#include "cru/ui/mapper/BorderStyleMapper.hpp" +#include "../Helper.hpp" +#include "cru/common/Logger.hpp" +#include "cru/platform/graphics/Factory.hpp" +#include "cru/ui/mapper/MapperRegistry.hpp" +#include "cru/ui/style/ApplyBorderStyleInfo.hpp" +#include "cru/xml/XmlNode.hpp" + +namespace cru::ui::mapper { +using namespace xml; +using ui::style::ApplyBorderStyleInfo; + +bool BorderStyleMapper::XmlElementIsOfThisType(xml::XmlElementNode* node) { + return node->GetTag() == u"BorderStyle"; +} + +ApplyBorderStyleInfo BorderStyleMapper::DoMapFromXml( + xml::XmlElementNode* node) { + ApplyBorderStyleInfo result; + + for (auto child : node->GetChildren()) { + if (child->GetType() == XmlNode::Type::Text) { + log::Debug(u"Ignore text node."); + } else { + auto c = child->AsElement(); + auto thickness_mapper = + MapperRegistry::GetInstance()->GetMapper(); + auto corner_radius_mapper = + MapperRegistry::GetInstance()->GetMapper(); + auto color_mapper = MapperRegistry::GetInstance()->GetMapper(); + if (thickness_mapper->XmlElementIsOfThisType(c)) { + result.border_thickness = thickness_mapper->MapFromXml(c); + } else if (corner_radius_mapper->XmlElementIsOfThisType(c)) { + result.border_radius = corner_radius_mapper->MapFromXml(c); + } else if (color_mapper->XmlElementIsOfThisType(c)) { + auto brush = GetGraphicsFactory()->CreateSolidColorBrush( + color_mapper->MapFromXml(c)); + auto name = c->GetOptionalAttribute(u"name"); + if (name) { + if (name == u"foreground") { + result.foreground_brush = std::move(brush); + } else if (name == u"background") { + result.background_brush = std::move(brush); + } else { + log::Debug(u"Unknown brush name: {}", *name); + } + } else { + result.border_brush = std::move(brush); + } + } + } + } + + return result; +} +} // namespace cru::ui::mapper diff --git a/src/ui/mapper/ColorMapper.cpp b/src/ui/mapper/ColorMapper.cpp index e17352e1..a5d2c5e3 100644 --- a/src/ui/mapper/ColorMapper.cpp +++ b/src/ui/mapper/ColorMapper.cpp @@ -5,18 +5,18 @@ bool ColorMapper::XmlElementIsOfThisType(xml::XmlElementNode* node) { return node->GetTag() == u"Color"; } -std::unique_ptr ColorMapper::DoMapFromString(String str) { +Color ColorMapper::DoMapFromString(String str) { auto c = Color::Parse(str); if (!c) { throw Exception(u"Invalid color value."); } - return std::make_unique(*c); + return *c; } -std::unique_ptr ColorMapper::DoMapFromXml(xml::XmlElementNode* node) { +Color ColorMapper::DoMapFromXml(xml::XmlElementNode* node) { auto value_attr = node->GetOptionalAttribute(u"value"); if (!value_attr) { - return std::make_unique(colors::transparent); + return colors::transparent; } return DoMapFromString(*value_attr); } diff --git a/src/ui/mapper/CornerRadiusMapper.cpp b/src/ui/mapper/CornerRadiusMapper.cpp index ef63e26f..0c13db7c 100644 --- a/src/ui/mapper/CornerRadiusMapper.cpp +++ b/src/ui/mapper/CornerRadiusMapper.cpp @@ -10,35 +10,33 @@ bool CornerRadiusMapper::XmlElementIsOfThisType(xml::XmlElementNode* node) { return false; } -std::unique_ptr CornerRadiusMapper::DoMapFromXml( - xml::XmlElementNode* node) { +CornerRadius CornerRadiusMapper::DoMapFromXml(xml::XmlElementNode* node) { auto point_mapper = MapperRegistry::GetInstance()->GetMapper(); - - auto result = std::make_unique(); + CornerRadius result; auto all = node->GetOptionalAttribute(u"all"); if (all) { - result->SetAll(*point_mapper->MapFromString(*all)); + result.SetAll(point_mapper->MapFromString(*all)); } auto lefttop = node->GetOptionalAttribute(u"lefttop"); if (lefttop) { - result->left_top = *point_mapper->MapFromString(*lefttop); + result.left_top = point_mapper->MapFromString(*lefttop); } auto righttop = node->GetOptionalAttribute(u"righttop"); if (righttop) { - result->right_top = *point_mapper->MapFromString(*righttop); + result.right_top = point_mapper->MapFromString(*righttop); } auto rightbottom = node->GetOptionalAttribute(u"rightbottom"); if (rightbottom) { - result->right_bottom = *point_mapper->MapFromString(*rightbottom); + result.right_bottom = point_mapper->MapFromString(*rightbottom); } auto leftbottom = node->GetOptionalAttribute(u"leftbottom"); if (leftbottom) { - result->left_bottom = *point_mapper->MapFromString(*leftbottom); + result.left_bottom = point_mapper->MapFromString(*leftbottom); } return result; diff --git a/src/ui/mapper/CursorMapper.cpp b/src/ui/mapper/CursorMapper.cpp new file mode 100644 index 00000000..2dd08219 --- /dev/null +++ b/src/ui/mapper/CursorMapper.cpp @@ -0,0 +1,3 @@ +#include "cru/ui/mapper/CursorMapper.hpp" + +namespace cru::ui::mapper {} diff --git a/src/ui/mapper/PointMapper.cpp b/src/ui/mapper/PointMapper.cpp index 2be0ba01..bcf209fb 100644 --- a/src/ui/mapper/PointMapper.cpp +++ b/src/ui/mapper/PointMapper.cpp @@ -8,20 +8,20 @@ bool PointMapper::XmlElementIsOfThisType(xml::XmlElementNode* node) { return false; } -std::unique_ptr PointMapper::DoMapFromString(String str) { +Point PointMapper::DoMapFromString(String str) { std::vector values = str.ParseToFloatList(); if (values.size() == 2) { - return std::make_unique(values[0], values[1]); + return {values[0], values[1]}; } else if (values.size() == 1) { - return std::make_unique(values[0], values[0]); + return {values[0], values[0]}; } else { throw Exception(u"Invalid Point string."); } } -std::unique_ptr PointMapper::DoMapFromXml(xml::XmlElementNode* node) { +Point PointMapper::DoMapFromXml(xml::XmlElementNode* node) { auto value_attr = node->GetOptionalAttribute(u"value"); - if (!value_attr) return std::make_unique(); + if (!value_attr) return {}; return DoMapFromString(*value_attr); } } // namespace cru::ui::mapper diff --git a/src/ui/mapper/SizeMapper.cpp b/src/ui/mapper/SizeMapper.cpp index 4f9dc208..3e3355cd 100644 --- a/src/ui/mapper/SizeMapper.cpp +++ b/src/ui/mapper/SizeMapper.cpp @@ -8,20 +8,20 @@ bool SizeMapper::XmlElementIsOfThisType(xml::XmlElementNode* node) { return false; } -std::unique_ptr SizeMapper::DoMapFromString(String str) { +Size SizeMapper::DoMapFromString(String str) { std::vector values = str.ParseToFloatList(); if (values.size() == 2) { - return std::make_unique(values[0], values[1]); + return {values[0], values[1]}; } else if (values.size() == 1) { - return std::make_unique(values[0], values[0]); + return {values[0], values[0]}; } else { throw Exception(u"Invalid Point string."); } } -std::unique_ptr SizeMapper::DoMapFromXml(xml::XmlElementNode* node) { +Size SizeMapper::DoMapFromXml(xml::XmlElementNode* node) { auto value_attr = node->GetOptionalAttribute(u"value"); - if (!value_attr) return std::make_unique(); + if (!value_attr) return {}; return DoMapFromString(*value_attr); } } // namespace cru::ui::mapper diff --git a/src/ui/mapper/ThicknessMapper.cpp b/src/ui/mapper/ThicknessMapper.cpp index 11f0be0d..1829d64b 100644 --- a/src/ui/mapper/ThicknessMapper.cpp +++ b/src/ui/mapper/ThicknessMapper.cpp @@ -9,26 +9,22 @@ bool ThicknessMapper::XmlElementIsOfThisType(xml::XmlElementNode* node) { return false; } -std::unique_ptr ThicknessMapper::DoMapFromString(String str) { +Thickness ThicknessMapper::DoMapFromString(String str) { std::vector values = str.ParseToFloatList(); if (values.size() == 4) { - return std::make_unique(values[0], values[1], values[2], - values[3]); + return Thickness(values[0], values[1], values[2], values[3]); } else if (values.size() == 2) { - return std::make_unique(values[0], values[1], values[0], - values[1]); + return Thickness(values[0], values[1], values[0], values[1]); } else if (values.size() == 1) { - return std::make_unique(values[0], values[0], values[0], - values[0]); + return Thickness(values[0], values[0], values[0], values[0]); } else { throw Exception(u"Invalid Thickness string."); } } -std::unique_ptr ThicknessMapper::DoMapFromXml( - xml::XmlElementNode* node) { +Thickness ThicknessMapper::DoMapFromXml(xml::XmlElementNode* node) { auto value_attr = node->GetOptionalAttribute(u"value"); - if (!value_attr) return std::make_unique(); + if (!value_attr) return {}; return DoMapFromString(*value_attr); } } // namespace cru::ui::mapper diff --git a/src/ui/mapper/style/BorderStyleMapper.cpp b/src/ui/mapper/style/BorderStyleMapper.cpp deleted file mode 100644 index 0dc8a05f..00000000 --- a/src/ui/mapper/style/BorderStyleMapper.cpp +++ /dev/null @@ -1,56 +0,0 @@ -#include "cru/ui/mapper/style/BorderStyleMapper.hpp" -#include "../../Helper.hpp" -#include "cru/common/Logger.hpp" -#include "cru/platform/graphics/Factory.hpp" -#include "cru/ui/mapper/MapperRegistry.hpp" -#include "cru/ui/style/ApplyBorderStyleInfo.hpp" -#include "cru/xml/XmlNode.hpp" - -namespace cru::ui::mapper::style { -using namespace xml; -using ui::style::ApplyBorderStyleInfo; - -bool BorderStyleMapper::XmlElementIsOfThisType(xml::XmlElementNode* node) { - return node->GetTag() == u"BorderStyle"; -} - -std::unique_ptr BorderStyleMapper::DoMapFromXml( - xml::XmlElementNode* node) { - auto result = std::make_unique(); - - for (auto child : node->GetChildren()) { - if (child->GetType() == XmlNode::Type::Text) { - log::Debug(u"Ignore text node."); - } else { - auto c = child->AsElement(); - auto thickness_mapper = - MapperRegistry::GetInstance()->GetMapper(); - auto corner_radius_mapper = - MapperRegistry::GetInstance()->GetMapper(); - auto color_mapper = MapperRegistry::GetInstance()->GetMapper(); - if (thickness_mapper->XmlElementIsOfThisType(c)) { - result->border_thickness = *thickness_mapper->MapFromXml(c); - } else if (corner_radius_mapper->XmlElementIsOfThisType(c)) { - result->border_radius = *corner_radius_mapper->MapFromXml(c); - } else if (color_mapper->XmlElementIsOfThisType(c)) { - auto brush = GetGraphicsFactory()->CreateSolidColorBrush( - *color_mapper->MapFromXml(c)); - auto name = c->GetOptionalAttribute(u"name"); - if (name) { - if (name == u"foreground") { - result->foreground_brush = std::move(brush); - } else if (name == u"background") { - result->background_brush = std::move(brush); - } else { - log::Debug(u"Unknown brush name: {}", *name); - } - } else { - result->border_brush = std::move(brush); - } - } - } - } - - return result; -} -} // namespace cru::ui::mapper::style -- cgit v1.2.3