aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--assets/cru/ui/DefaultResources.xml25
-rw-r--r--include/cru/ui/mapper/style/StyleRuleMapper.h2
-rw-r--r--src/ui/controls/CheckBox.cpp6
-rw-r--r--src/ui/mapper/style/StyleRuleMapper.cpp6
-rw-r--r--src/ui/render/BorderRenderObject.cpp2
-rw-r--r--src/ui/style/StyleRuleSet.cpp7
6 files changed, 43 insertions, 5 deletions
diff --git a/assets/cru/ui/DefaultResources.xml b/assets/cru/ui/DefaultResources.xml
index 89f2b4a5..26f6e929 100644
--- a/assets/cru/ui/DefaultResources.xml
+++ b/assets/cru/ui/DefaultResources.xml
@@ -160,6 +160,31 @@
</StyleRuleSet>
</Resource>
+ <Resource key="checkbox.style">
+ <StyleRuleSet>
+ <StyleRule>
+ <NoCondition />
+ <PreferredSizeStyler width="20" height="20" />
+ <BorderStyler>
+ <BorderStyle>
+ <Color value="black" />
+ <Thickness value="1" />
+ <CornerRadius all="5" />
+ <Color name="background" value="white" />
+ </BorderStyle>
+ </BorderStyler>
+ </StyleRule>
+ <StyleRule>
+ <CheckedCondition value="true" />
+ <BorderStyler>
+ <BorderStyle>
+ <Color name="background" value="skyblue" />
+ </BorderStyle>
+ </BorderStyler>
+ </StyleRule>
+ </StyleRuleSet>
+ </Resource>
+
<Resource key="menuitem.style">
<StyleRuleSet></StyleRuleSet>
</Resource>
diff --git a/include/cru/ui/mapper/style/StyleRuleMapper.h b/include/cru/ui/mapper/style/StyleRuleMapper.h
index cba4872c..2d6d8d94 100644
--- a/include/cru/ui/mapper/style/StyleRuleMapper.h
+++ b/include/cru/ui/mapper/style/StyleRuleMapper.h
@@ -1,11 +1,13 @@
#pragma once
#include "../Mapper.h"
+#include "cru/common/Base.h"
#include "cru/common/ClonablePtr.h"
#include "cru/ui/style/StyleRule.h"
#include "cru/xml/XmlNode.h"
namespace cru::ui::mapper::style {
class CRU_UI_API StyleRuleMapper : public BasicPtrMapper<ui::style::StyleRule> {
+ CRU_DEFINE_CLASS_LOG_TAG(u"StyleRuleMapper")
public:
CRU_DEFAULT_CONSTRUCTOR_DESTRUCTOR(StyleRuleMapper)
diff --git a/src/ui/controls/CheckBox.cpp b/src/ui/controls/CheckBox.cpp
index cace3dbf..a28c4633 100644
--- a/src/ui/controls/CheckBox.cpp
+++ b/src/ui/controls/CheckBox.cpp
@@ -1,4 +1,5 @@
#include "cru/ui/controls/CheckBox.h"
+#include "cru/ui/ThemeManager.h"
#include "cru/ui/helper/ClickDetector.h"
#include "cru/ui/render/BorderRenderObject.h"
@@ -8,6 +9,11 @@ CheckBox::CheckBox()
click_detector_(this) {
container_render_object_->SetAttachedControl(this);
+ container_render_object_->SetBorderEnabled(true);
+ auto default_checkbox_style =
+ ThemeManager::GetInstance()->GetResourceStyleRuleSet(u"checkbox.style");
+ GetStyleRuleSet()->SetParent(std::move(default_checkbox_style));
+
click_detector_.ClickEvent()->AddHandler(
[this](const helper::ClickEventArgs&) { Toggle(); });
}
diff --git a/src/ui/mapper/style/StyleRuleMapper.cpp b/src/ui/mapper/style/StyleRuleMapper.cpp
index 1ca45a6e..2ab13c90 100644
--- a/src/ui/mapper/style/StyleRuleMapper.cpp
+++ b/src/ui/mapper/style/StyleRuleMapper.cpp
@@ -1,5 +1,7 @@
#include "cru/ui/mapper/style/StyleRuleMapper.h"
#include "cru/common/ClonablePtr.h"
+#include "cru/common/Exception.h"
+#include "cru/common/log/Logger.h"
#include "cru/ui/mapper/MapperRegistry.h"
#include "cru/ui/mapper/style/IConditionMapper.h"
#include "cru/ui/mapper/style/IStylerMapper.h"
@@ -45,6 +47,10 @@ ClonablePtr<ui::style::StyleRule> StyleRuleMapper::DoMapFromXml(
}
}
}
+
+ if (!resolved) {
+ throw Exception(u"Unknown element in StyleRule: " + c->GetTag());
+ }
}
}
diff --git a/src/ui/render/BorderRenderObject.cpp b/src/ui/render/BorderRenderObject.cpp
index cbea4b81..abba47e9 100644
--- a/src/ui/render/BorderRenderObject.cpp
+++ b/src/ui/render/BorderRenderObject.cpp
@@ -118,7 +118,7 @@ Size BorderRenderObject::OnMeasureContent(const MeasureRequirement& requirement,
child->Measure(requirement, preferred_size);
return child->GetDesiredSize();
} else {
- return Size{};
+ return preferred_size.GetSizeOr0();
}
}
diff --git a/src/ui/style/StyleRuleSet.cpp b/src/ui/style/StyleRuleSet.cpp
index c8d12500..6b475c8c 100644
--- a/src/ui/style/StyleRuleSet.cpp
+++ b/src/ui/style/StyleRuleSet.cpp
@@ -112,10 +112,9 @@ void StyleRuleSetBind::UpdateStyle() {
// reverse.
for (auto iter = ruleset_chain_cache_.crbegin();
iter != ruleset_chain_cache_.crend(); ++iter) {
- for (const auto& rule : (*iter)->GetRules())
- if (rule.GetCondition()->Judge(control_)) {
- rule.GetStyler()->Apply(control_);
- }
+ for (const auto& rule : (*iter)->GetRules()) {
+ rule.CheckAndApply(control_);
+ }
}
}
} // namespace cru::ui::style