aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/cru/ui/controls/Control.h16
-rw-r--r--include/cru/ui/mapper/Mapper.h9
-rw-r--r--include/cru/ui/mapper/style/MarginStylerMapper.h26
-rw-r--r--include/cru/ui/mapper/style/PaddingStylerMapper.h26
-rw-r--r--include/cru/ui/style/Styler.h37
-rw-r--r--src/theme_builder/CMakeLists.txt2
-rw-r--r--src/theme_builder/components/stylers/MarginStylerEditor.cpp28
-rw-r--r--src/theme_builder/components/stylers/MarginStylerEditor.h25
-rw-r--r--src/theme_builder/components/stylers/PaddingStylerEditor.cpp28
-rw-r--r--src/theme_builder/components/stylers/PaddingStylerEditor.h25
-rw-r--r--src/theme_builder/components/stylers/StylerEditor.cpp12
-rw-r--r--src/ui/CMakeLists.txt2
-rw-r--r--src/ui/mapper/Mapper.cpp9
-rw-r--r--src/ui/mapper/MapperRegistry.cpp4
-rw-r--r--src/ui/mapper/style/MarginStylerMapper.cpp24
-rw-r--r--src/ui/mapper/style/PaddingStylerMapper.cpp26
-rw-r--r--src/ui/style/Styler.cpp8
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