diff options
-rw-r--r-- | assets/cru/ui/DefaultResources.xml | 25 | ||||
-rw-r--r-- | include/cru/ui/mapper/style/StyleRuleMapper.h | 2 | ||||
-rw-r--r-- | src/ui/controls/CheckBox.cpp | 6 | ||||
-rw-r--r-- | src/ui/mapper/style/StyleRuleMapper.cpp | 6 | ||||
-rw-r--r-- | src/ui/render/BorderRenderObject.cpp | 2 | ||||
-rw-r--r-- | src/ui/style/StyleRuleSet.cpp | 7 |
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 |