diff options
-rw-r--r-- | include/cru/ui/mapper/ColorMapper.hpp | 19 | ||||
-rw-r--r-- | src/ui/CMakeLists.txt | 1 | ||||
-rw-r--r-- | src/ui/mapper/ColorMapper.cpp | 23 |
3 files changed, 43 insertions, 0 deletions
diff --git a/include/cru/ui/mapper/ColorMapper.hpp b/include/cru/ui/mapper/ColorMapper.hpp new file mode 100644 index 00000000..33333025 --- /dev/null +++ b/include/cru/ui/mapper/ColorMapper.hpp @@ -0,0 +1,19 @@ +#pragma once +#include "Mapper.hpp" +#include "cru/xml/XmlNode.hpp" + +namespace cru::ui::mapper { +class ColorMapper : public BasicMapper<Color> { + public: + CRU_DEFAULT_CONSTRUCTOR_DESTRUCTOR(ColorMapper) + + public: + bool SupportMapFromString() override { return true; } + bool SupportMapFromXml() override { return true; } + bool XmlElementIsOfThisType(xml::XmlElementNode* node) override; + + protected: + std::unique_ptr<Color> DoMapFromString(String str) override; + std::unique_ptr<Color> DoMapFromXml(xml::XmlElementNode* node) override; +}; +} // namespace cru::ui::mapper diff --git a/src/ui/CMakeLists.txt b/src/ui/CMakeLists.txt index 3050b8b8..1c8d8c85 100644 --- a/src/ui/CMakeLists.txt +++ b/src/ui/CMakeLists.txt @@ -26,6 +26,7 @@ add_library(cru_ui SHARED helper/ShortcutHub.cpp host/LayoutPaintCycler.cpp host/WindowHost.cpp + mapper/ColorMapper.cpp mapper/CornerRadiusMapper.cpp mapper/Mapper.cpp mapper/MapperRegistry.cpp diff --git a/src/ui/mapper/ColorMapper.cpp b/src/ui/mapper/ColorMapper.cpp new file mode 100644 index 00000000..be633a86 --- /dev/null +++ b/src/ui/mapper/ColorMapper.cpp @@ -0,0 +1,23 @@ +#include "cru/ui/mapper/ColorMapper.hpp" + +namespace cru::ui::mapper { +bool ColorMapper::XmlElementIsOfThisType(xml::XmlElementNode* node) { + return node->GetTag() == u"color"; +} + +std::unique_ptr<Color> ColorMapper::DoMapFromString(String str) { + auto c = Color::Parse(str); + if (!c) { + throw Exception(u"Invalid color value."); + } + return std::make_unique<Color>(*c); +} + +std::unique_ptr<Color> ColorMapper::DoMapFromXml(xml::XmlElementNode* node) { + auto value_attr = node->GetOptionalAttribute(u"value"); + if (!value_attr) { + return std::make_unique<Color>(colors::transparent); + } + return DoMapFromString(*value_attr); +} +} // namespace cru::ui::mapper |