diff options
-rw-r--r-- | include/cru/ui/controls/Control.h | 16 | ||||
-rw-r--r-- | include/cru/ui/mapper/Mapper.h | 9 | ||||
-rw-r--r-- | include/cru/ui/mapper/style/MarginStylerMapper.h | 26 | ||||
-rw-r--r-- | include/cru/ui/mapper/style/PaddingStylerMapper.h | 26 | ||||
-rw-r--r-- | include/cru/ui/style/Styler.h | 37 | ||||
-rw-r--r-- | src/theme_builder/CMakeLists.txt | 2 | ||||
-rw-r--r-- | src/theme_builder/components/stylers/MarginStylerEditor.cpp | 28 | ||||
-rw-r--r-- | src/theme_builder/components/stylers/MarginStylerEditor.h | 25 | ||||
-rw-r--r-- | src/theme_builder/components/stylers/PaddingStylerEditor.cpp | 28 | ||||
-rw-r--r-- | src/theme_builder/components/stylers/PaddingStylerEditor.h | 25 | ||||
-rw-r--r-- | src/theme_builder/components/stylers/StylerEditor.cpp | 12 | ||||
-rw-r--r-- | src/ui/CMakeLists.txt | 2 | ||||
-rw-r--r-- | src/ui/mapper/Mapper.cpp | 9 | ||||
-rw-r--r-- | src/ui/mapper/MapperRegistry.cpp | 4 | ||||
-rw-r--r-- | src/ui/mapper/style/MarginStylerMapper.cpp | 24 | ||||
-rw-r--r-- | src/ui/mapper/style/PaddingStylerMapper.cpp | 26 | ||||
-rw-r--r-- | src/ui/style/Styler.cpp | 8 |
17 files changed, 303 insertions, 4 deletions
diff --git a/include/cru/ui/controls/Control.h b/include/cru/ui/controls/Control.h index c52a53af..3b58222c 100644 --- a/include/cru/ui/controls/Control.h +++ b/include/cru/ui/controls/Control.h @@ -52,13 +52,25 @@ class CRU_UI_API Control : public Object { public: virtual render::RenderObject* GetRenderObject() const = 0; - render::MeasureSize GetPreferredSize() { + virtual render::MeasureSize GetPreferredSize() const { return GetRenderObject()->GetPreferredSize(); } - void SetPreferredSize(const render::MeasureSize& size) { + virtual void SetPreferredSize(const render::MeasureSize& size) { GetRenderObject()->SetPreferredSize(size); } + virtual Thickness GetMargin() const { return GetRenderObject()->GetMargin(); } + virtual void SetMargin(const Thickness& margin) { + GetRenderObject()->SetMargin(margin); + } + + virtual Thickness GetPadding() const { + return GetRenderObject()->GetPadding(); + } + virtual void SetPadding(const Thickness& padding) { + GetRenderObject()->SetPadding(padding); + } + //*************** region: focus *************** public: bool HasFocus(); diff --git a/include/cru/ui/mapper/Mapper.h b/include/cru/ui/mapper/Mapper.h index fa7f8cef..5bf140cd 100644 --- a/include/cru/ui/mapper/Mapper.h +++ b/include/cru/ui/mapper/Mapper.h @@ -38,12 +38,17 @@ class CRU_UI_API MapperBase : public Object { virtual bool SupportMapFromString() { return false; } virtual bool SupportMapFromXml() { return false; } - virtual bool XmlElementIsOfThisType(xml::XmlElementNode* node) { - return false; + virtual bool XmlElementIsOfThisType(xml::XmlElementNode* node); + + protected: + void SetAllowedTags(std::vector<String> allowed_tags) { + allowed_tags_ = std::move(allowed_tags); } private: std::type_index type_index_; + + std::vector<String> allowed_tags_; }; template <typename T> diff --git a/include/cru/ui/mapper/style/MarginStylerMapper.h b/include/cru/ui/mapper/style/MarginStylerMapper.h new file mode 100644 index 00000000..99e292b2 --- /dev/null +++ b/include/cru/ui/mapper/style/MarginStylerMapper.h @@ -0,0 +1,26 @@ +#pragma once +#include "../Mapper.h" +#include "cru/ui/mapper/style/IStylerMapper.h" +#include "cru/ui/style/Styler.h" + +namespace cru::ui::mapper::style { +class CRU_UI_API MarginStylerMapper + : public BasicPtrMapper<ui::style::MarginStyler>, + public virtual IStylerMapper { + public: + MarginStylerMapper(); + ~MarginStylerMapper(); + + public: + bool SupportMapFromXml() override { return true; } + + ClonablePtr<ui::style::Styler> MapStylerFromXml( + xml::XmlElementNode* node) override { + return MapFromXml(node); + } + + protected: + ClonablePtr<ui::style::MarginStyler> DoMapFromXml( + xml::XmlElementNode* node) override; +}; +} // namespace cru::ui::mapper::style diff --git a/include/cru/ui/mapper/style/PaddingStylerMapper.h b/include/cru/ui/mapper/style/PaddingStylerMapper.h new file mode 100644 index 00000000..2c0b4340 --- /dev/null +++ b/include/cru/ui/mapper/style/PaddingStylerMapper.h @@ -0,0 +1,26 @@ +#pragma once +#include "../Mapper.h" +#include "cru/ui/mapper/style/IStylerMapper.h" +#include "cru/ui/style/Styler.h" + +namespace cru::ui::mapper::style { +class CRU_UI_API PaddingStylerMapper + : public BasicPtrMapper<ui::style::PaddingStyler>, + public virtual IStylerMapper { + public: + PaddingStylerMapper(); + ~PaddingStylerMapper(); + + public: + bool SupportMapFromXml() override { return true; } + + ClonablePtr<ui::style::Styler> MapStylerFromXml( + xml::XmlElementNode* node) override { + return MapFromXml(node); + } + + protected: + ClonablePtr<ui::style::PaddingStyler> DoMapFromXml( + xml::XmlElementNode* node) override; +}; +} // namespace cru::ui::mapper::style diff --git a/include/cru/ui/style/Styler.h b/include/cru/ui/style/Styler.h index 4759c2ea..e2e05c5b 100644 --- a/include/cru/ui/style/Styler.h +++ b/include/cru/ui/style/Styler.h @@ -112,4 +112,41 @@ class CRU_UI_API PreferredSizeStyler : public Styler { private: render::MeasureSize size_; }; + +class CRU_UI_API MarginStyler : public Styler { + public: + static ClonablePtr<MarginStyler> Create(const Thickness& margin) { + return ClonablePtr<MarginStyler>(new MarginStyler(margin)); + } + + explicit MarginStyler(const Thickness& margin) : margin_(margin) {} + + void Apply(controls::Control* control) const override; + + MarginStyler* Clone() const override { return new MarginStyler(margin_); } + + Thickness GetMargin() const { return margin_; } + + private: + Thickness margin_; +}; + +class CRU_UI_API PaddingStyler : public Styler { + public: + static ClonablePtr<PaddingStyler> Create(const Thickness& padding) { + return ClonablePtr<PaddingStyler>(new PaddingStyler(padding)); + } + + explicit PaddingStyler(const Thickness& padding) : padding_(padding) {} + + void Apply(controls::Control* control) const override; + + PaddingStyler* Clone() const override { return new PaddingStyler(padding_); } + + Thickness GetPadding() const { return padding_; } + + private: + Thickness padding_; +}; + } // namespace cru::ui::style diff --git a/src/theme_builder/CMakeLists.txt b/src/theme_builder/CMakeLists.txt index 709c4d76..40d23c4a 100644 --- a/src/theme_builder/CMakeLists.txt +++ b/src/theme_builder/CMakeLists.txt @@ -21,6 +21,8 @@ add_executable(cru_theme_builder components/stylers/BorderStylerEditor.cpp components/stylers/CompoundStylerEditor.cpp components/stylers/CursorStylerEditor.cpp + components/stylers/MarginStylerEditor.cpp + components/stylers/PaddingStylerEditor.cpp components/stylers/PreferredSizeStylerEditor.cpp components/stylers/StylerEditor.cpp ) diff --git a/src/theme_builder/components/stylers/MarginStylerEditor.cpp b/src/theme_builder/components/stylers/MarginStylerEditor.cpp new file mode 100644 index 00000000..d7d89acb --- /dev/null +++ b/src/theme_builder/components/stylers/MarginStylerEditor.cpp @@ -0,0 +1,28 @@ +#include "MarginStylerEditor.h" +#include "cru/ui/style/Styler.h" + +namespace cru::theme_builder::components::stylers { +MarginStylerEditor::MarginStylerEditor() { + SetLabel(u"Margin Styler"); + GetContainer()->AddChild(thickness_editor_.GetRootControl()); + + thickness_editor_.SetLabel(u"Thickness"); + + ConnectChangeEvent(thickness_editor_); +} + +MarginStylerEditor::~MarginStylerEditor() {} + +ClonablePtr<ui::style::MarginStyler> MarginStylerEditor::GetValue() { + return ui::style::MarginStyler::Create(thickness_editor_.GetValue()); +} + +void MarginStylerEditor::SetValue(ui::style::MarginStyler* styler, + bool trigger_change) { + thickness_editor_.SetValue(styler->GetMargin(), false); + + if (trigger_change) { + RaiseChangeEvent(); + } +} +} // namespace cru::theme_builder::components::stylers diff --git a/src/theme_builder/components/stylers/MarginStylerEditor.h b/src/theme_builder/components/stylers/MarginStylerEditor.h new file mode 100644 index 00000000..9de6f1a2 --- /dev/null +++ b/src/theme_builder/components/stylers/MarginStylerEditor.h @@ -0,0 +1,25 @@ +#pragma once +#include "../properties/ThicknessPropertyEditor.h" +#include "StylerEditor.h" +#include "cru/common/ClonablePtr.h" +#include "cru/ui/style/Styler.h" + +namespace cru::theme_builder::components::stylers { +class MarginStylerEditor : public StylerEditor { + public: + MarginStylerEditor(); + ~MarginStylerEditor() override; + + ClonablePtr<ui::style::MarginStyler> GetValue(); + void SetValue(ui::style::MarginStyler* styler, bool trigger_change = true); + void SetValue(const ClonablePtr<ui::style::MarginStyler>& styler, + bool trigger_change = true) { + SetValue(styler.get(), trigger_change); + } + + ClonablePtr<ui::style::Styler> GetStyler() override { return GetValue(); } + + private: + properties::ThicknessPropertyEditor thickness_editor_; +}; +} // namespace cru::theme_builder::components::stylers diff --git a/src/theme_builder/components/stylers/PaddingStylerEditor.cpp b/src/theme_builder/components/stylers/PaddingStylerEditor.cpp new file mode 100644 index 00000000..476d21f1 --- /dev/null +++ b/src/theme_builder/components/stylers/PaddingStylerEditor.cpp @@ -0,0 +1,28 @@ +#include "PaddingStylerEditor.h" +#include "cru/ui/style/Styler.h" + +namespace cru::theme_builder::components::stylers { +PaddingStylerEditor::PaddingStylerEditor() { + SetLabel(u"Padding Styler"); + GetContainer()->AddChild(thickness_editor_.GetRootControl()); + + thickness_editor_.SetLabel(u"Thickness"); + + ConnectChangeEvent(thickness_editor_); +} + +PaddingStylerEditor::~PaddingStylerEditor() {} + +ClonablePtr<ui::style::PaddingStyler> PaddingStylerEditor::GetValue() { + return ui::style::PaddingStyler::Create(thickness_editor_.GetValue()); +} + +void PaddingStylerEditor::SetValue(ui::style::PaddingStyler* styler, + bool trigger_change) { + thickness_editor_.SetValue(styler->GetPadding(), false); + + if (trigger_change) { + RaiseChangeEvent(); + } +} +} // namespace cru::theme_builder::components::stylers diff --git a/src/theme_builder/components/stylers/PaddingStylerEditor.h b/src/theme_builder/components/stylers/PaddingStylerEditor.h new file mode 100644 index 00000000..b78d310b --- /dev/null +++ b/src/theme_builder/components/stylers/PaddingStylerEditor.h @@ -0,0 +1,25 @@ +#pragma once +#include "../properties/ThicknessPropertyEditor.h" +#include "StylerEditor.h" +#include "cru/common/ClonablePtr.h" +#include "cru/ui/style/Styler.h" + +namespace cru::theme_builder::components::stylers { +class PaddingStylerEditor : public StylerEditor { + public: + PaddingStylerEditor(); + ~PaddingStylerEditor() override; + + ClonablePtr<ui::style::PaddingStyler> GetValue(); + void SetValue(ui::style::PaddingStyler* styler, bool trigger_change = true); + void SetValue(const ClonablePtr<ui::style::PaddingStyler>& styler, + bool trigger_change = true) { + SetValue(styler.get(), trigger_change); + } + + ClonablePtr<ui::style::Styler> GetStyler() override { return GetValue(); } + + private: + properties::ThicknessPropertyEditor thickness_editor_; +}; +} // namespace cru::theme_builder::components::stylers diff --git a/src/theme_builder/components/stylers/StylerEditor.cpp b/src/theme_builder/components/stylers/StylerEditor.cpp index 08684edc..030a3752 100644 --- a/src/theme_builder/components/stylers/StylerEditor.cpp +++ b/src/theme_builder/components/stylers/StylerEditor.cpp @@ -2,6 +2,8 @@ #include "BorderStylerEditor.h" #include "CompoundStylerEditor.h" #include "CursorStylerEditor.h" +#include "MarginStylerEditor.h" +#include "PaddingStylerEditor.h" #include "PreferredSizeStylerEditor.h" #include "cru/ui/style/Styler.h" @@ -33,6 +35,16 @@ std::unique_ptr<StylerEditor> CreateStylerEditor(ui::style::Styler* styler) { auto editor = std::make_unique<PreferredSizeStylerEditor>(); editor->SetValue(preferred_size_styler); return editor; + } else if (auto margin_styler = + dynamic_cast<ui::style::MarginStyler*>(styler)) { + auto editor = std::make_unique<MarginStylerEditor>(); + editor->SetValue(margin_styler); + return editor; + } else if (auto padding_styler = + dynamic_cast<ui::style::PaddingStyler*>(styler)) { + auto editor = std::make_unique<PaddingStylerEditor>(); + editor->SetValue(padding_styler); + return editor; } else { throw Exception(u"Unknown styler type"); } diff --git a/src/ui/CMakeLists.txt b/src/ui/CMakeLists.txt index e02ad9da..e3819800 100644 --- a/src/ui/CMakeLists.txt +++ b/src/ui/CMakeLists.txt @@ -45,8 +45,10 @@ add_library(cru_ui SHARED mapper/style/CursorStylerMapper.cpp mapper/style/FocusConditionMapper.cpp mapper/style/HoverConditionMapper.cpp + mapper/style/MarginStylerMapper.cpp mapper/style/NoConditionMapper.cpp mapper/style/OrConditionMapper.cpp + mapper/style/PaddingStylerMapper.cpp mapper/style/PreferredSizeStylerMapper.cpp mapper/style/StyleRuleMapper.cpp mapper/style/StyleRuleSetMapper.cpp diff --git a/src/ui/mapper/Mapper.cpp b/src/ui/mapper/Mapper.cpp index 40653118..ebf880a2 100644 --- a/src/ui/mapper/Mapper.cpp +++ b/src/ui/mapper/Mapper.cpp @@ -5,4 +5,13 @@ namespace cru::ui::mapper { MapperBase::MapperBase(std::type_index type_index) : type_index_(std::move(type_index)) {} + +bool MapperBase::XmlElementIsOfThisType(xml::XmlElementNode* node) { + for (const auto& tag : allowed_tags_) { + if (node->GetTag().CaseInsensitiveEqual(tag)) { + return true; + } + } + return false; +} } // namespace cru::ui::mapper diff --git a/src/ui/mapper/MapperRegistry.cpp b/src/ui/mapper/MapperRegistry.cpp index 9ae95a59..ad5b7e8d 100644 --- a/src/ui/mapper/MapperRegistry.cpp +++ b/src/ui/mapper/MapperRegistry.cpp @@ -16,8 +16,10 @@ #include "cru/ui/mapper/style/CursorStylerMapper.h" #include "cru/ui/mapper/style/FocusConditionMapper.h" #include "cru/ui/mapper/style/HoverConditionMapper.h" +#include "cru/ui/mapper/style/MarginStylerMapper.h" #include "cru/ui/mapper/style/NoConditionMapper.h" #include "cru/ui/mapper/style/OrConditionMapper.h" +#include "cru/ui/mapper/style/PaddingStylerMapper.h" #include "cru/ui/mapper/style/PreferredSizeStylerMapper.h" #include "cru/ui/mapper/style/StyleRuleMapper.h" #include "cru/ui/mapper/style/StyleRuleSetMapper.h" @@ -48,8 +50,10 @@ MapperRegistry::MapperRegistry() { RegisterMapper(new CursorStylerMapper()); RegisterMapper(new FocusConditionMapper()); RegisterMapper(new HoverConditionMapper()); + RegisterMapper(new MarginStylerMapper()); RegisterMapper(new NoConditionMapper()); RegisterMapper(new OrConditionMapper()); + RegisterMapper(new PaddingStylerMapper()); RegisterMapper(new PreferredSizeStylerMapper()); RegisterMapper(new StyleRuleMapper()); RegisterMapper(new StyleRuleSetMapper()); diff --git a/src/ui/mapper/style/MarginStylerMapper.cpp b/src/ui/mapper/style/MarginStylerMapper.cpp new file mode 100644 index 00000000..cb2fd7ee --- /dev/null +++ b/src/ui/mapper/style/MarginStylerMapper.cpp @@ -0,0 +1,24 @@ +#include "cru/ui/mapper/style/MarginStylerMapper.h" +#include "cru/ui/mapper/MapperRegistry.h" +#include "cru/ui/render/MeasureRequirement.h" +#include "cru/ui/style/Styler.h" + +namespace cru::ui::mapper::style { +MarginStylerMapper::MarginStylerMapper() { SetAllowedTags({u"MarginStyler"}); } + +MarginStylerMapper::~MarginStylerMapper() {} + +ClonablePtr<ui::style::MarginStyler> MarginStylerMapper::DoMapFromXml( + xml::XmlElementNode* node) { + Thickness thickness; + + auto thickness_mapper = MapperRegistry::GetInstance()->GetMapper<Thickness>(); + + auto value_attribute = node->GetOptionalAttributeCaseInsensitive(u"value"); + if (value_attribute) { + thickness = thickness_mapper->MapFromString(*value_attribute); + } + + return ui::style::MarginStyler::Create(thickness); +} +} // namespace cru::ui::mapper::style diff --git a/src/ui/mapper/style/PaddingStylerMapper.cpp b/src/ui/mapper/style/PaddingStylerMapper.cpp new file mode 100644 index 00000000..cd316cd2 --- /dev/null +++ b/src/ui/mapper/style/PaddingStylerMapper.cpp @@ -0,0 +1,26 @@ +#include "cru/ui/mapper/style/PaddingStylerMapper.h" +#include "cru/ui/mapper/MapperRegistry.h" +#include "cru/ui/render/MeasureRequirement.h" +#include "cru/ui/style/Styler.h" + +namespace cru::ui::mapper::style { +PaddingStylerMapper::PaddingStylerMapper() { + SetAllowedTags({u"PaddingStyler"}); +} + +PaddingStylerMapper::~PaddingStylerMapper() {} + +ClonablePtr<ui::style::PaddingStyler> PaddingStylerMapper::DoMapFromXml( + xml::XmlElementNode* node) { + Thickness thickness; + + auto thickness_mapper = MapperRegistry::GetInstance()->GetMapper<Thickness>(); + + auto value_attribute = node->GetOptionalAttributeCaseInsensitive(u"value"); + if (value_attribute) { + thickness = thickness_mapper->MapFromString(*value_attribute); + } + + return ui::style::PaddingStyler::Create(thickness); +} +} // namespace cru::ui::mapper::style diff --git a/src/ui/style/Styler.cpp b/src/ui/style/Styler.cpp index 7085fd3e..44a24462 100644 --- a/src/ui/style/Styler.cpp +++ b/src/ui/style/Styler.cpp @@ -30,4 +30,12 @@ void CursorStyler::Apply(controls::Control *control) const { void PreferredSizeStyler::Apply(controls::Control *control) const { control->SetPreferredSize(size_); } + +void MarginStyler::Apply(controls::Control *control) const { + control->SetMargin(margin_); +} + +void PaddingStyler::Apply(controls::Control *control) const { + control->SetPadding(padding_); +} } // namespace cru::ui::style |