aboutsummaryrefslogtreecommitdiff
path: root/include/cru/ui/style
diff options
context:
space:
mode:
authorcrupest <crupest@outlook.com>2020-12-03 22:44:57 +0800
committercrupest <crupest@outlook.com>2020-12-03 22:44:57 +0800
commitb29fb11be2f043a3438a50d8942b4ad7d2af0034 (patch)
tree5847f7b880b43f2596bc10b46fc52c6f028a7a58 /include/cru/ui/style
parent93a8bf8b967817031cd2798cdaedfa73f867dead (diff)
downloadcru-b29fb11be2f043a3438a50d8942b4ad7d2af0034.tar.gz
cru-b29fb11be2f043a3438a50d8942b4ad7d2af0034.tar.bz2
cru-b29fb11be2f043a3438a50d8942b4ad7d2af0034.zip
...
Diffstat (limited to 'include/cru/ui/style')
-rw-r--r--include/cru/ui/style/Condition.hpp42
-rw-r--r--include/cru/ui/style/StyleRuleSet.hpp55
-rw-r--r--include/cru/ui/style/Styler.hpp7
3 files changed, 103 insertions, 1 deletions
diff --git a/include/cru/ui/style/Condition.hpp b/include/cru/ui/style/Condition.hpp
index 13ab7764..d5cf16f2 100644
--- a/include/cru/ui/style/Condition.hpp
+++ b/include/cru/ui/style/Condition.hpp
@@ -21,6 +21,21 @@ class Condition : public Object {
virtual Condition* Clone() const = 0;
};
+class NoCondition : public Condition {
+ public:
+ static ClonablePtr<NoCondition> Create() {
+ return ClonablePtr<NoCondition>(new NoCondition);
+ };
+
+ std::vector<IBaseEvent*> ChangeOn(controls::Control*) const override {
+ return {};
+ }
+
+ bool Judge(controls::Control*) const override { return true; }
+
+ NoCondition* Clone() const override { return new NoCondition; }
+};
+
class CompoundCondition : public Condition {
public:
explicit CompoundCondition(std::vector<ClonablePtr<Condition>> conditions);
@@ -51,6 +66,10 @@ class OrCondition : public CompoundCondition {
class FocusCondition : public Condition {
public:
+ static ClonablePtr<FocusCondition> Create(bool has_focus) {
+ return ClonablePtr<FocusCondition>(new FocusCondition(has_focus));
+ }
+
explicit FocusCondition(bool has_focus);
std::vector<IBaseEvent*> ChangeOn(controls::Control* control) const override;
@@ -64,8 +83,31 @@ class FocusCondition : public Condition {
bool has_focus_;
};
+class HoverCondition : public Condition {
+ public:
+ static ClonablePtr<HoverCondition> Create(bool hover) {
+ return ClonablePtr<HoverCondition>(new HoverCondition(hover));
+ }
+
+ explicit HoverCondition(bool hover) : hover_(hover) {}
+
+ std::vector<IBaseEvent*> ChangeOn(controls::Control* control) const override;
+ bool Judge(controls::Control* control) const override;
+
+ HoverCondition* Clone() const override { return new HoverCondition(hover_); }
+
+ private:
+ bool hover_;
+};
+
class ClickStateCondition : public Condition {
public:
+ static ClonablePtr<ClickStateCondition> Create(
+ helper::ClickState click_state) {
+ return ClonablePtr<ClickStateCondition>(
+ new ClickStateCondition(click_state));
+ }
+
explicit ClickStateCondition(helper::ClickState click_state);
std::vector<IBaseEvent*> ChangeOn(controls::Control* control) const override;
diff --git a/include/cru/ui/style/StyleRuleSet.hpp b/include/cru/ui/style/StyleRuleSet.hpp
index e69de29b..3ec71730 100644
--- a/include/cru/ui/style/StyleRuleSet.hpp
+++ b/include/cru/ui/style/StyleRuleSet.hpp
@@ -0,0 +1,55 @@
+#pragma once
+#include "StyleRule.hpp"
+#include "cru/common/Base.hpp"
+#include "cru/common/Event.hpp"
+#include "gsl/gsl_assert"
+
+namespace cru::ui::style {
+class StyleRuleSet : public Object {
+ public:
+ StyleRuleSet() : control_(nullptr) {}
+ explicit StyleRuleSet(controls::Control* control) : control_(control) {}
+
+ CRU_DELETE_COPY(StyleRuleSet)
+ CRU_DELETE_MOVE(StyleRuleSet)
+
+ ~StyleRuleSet() override = default;
+
+ public:
+ gsl::index GetSize() const { return static_cast<gsl::index>(rules_.size()); }
+ const std::vector<StyleRule>& GetRules() const { return rules_; }
+
+ void AddStyleRule(StyleRule rule) {
+ AddStyleRule(std::move(rule), GetSize());
+ }
+
+ void AddStyleRule(StyleRule rule, gsl::index index);
+
+ template <typename Iter>
+ void AddStyleRuleRange(Iter start, Iter end, gsl::index index) {
+ Expects(index >= 0 && index <= GetSize());
+ rules_.insert(rules_.cbegin() + index, std::move(start), std::move(end));
+ UpdateChangeListener();
+ UpdateStyle();
+ }
+
+ void RemoveStyleRule(gsl::index index, gsl::index count = 1);
+
+ void Clear() { RemoveStyleRule(0, GetSize()); }
+
+ void Set(const StyleRuleSet& other);
+
+ const StyleRule& operator[](gsl::index index) const { return rules_[index]; }
+
+ private:
+ void UpdateChangeListener();
+ void UpdateStyle();
+
+ private:
+ controls::Control* control_;
+
+ std::vector<StyleRule> rules_;
+
+ EventRevokerListGuard guard_;
+};
+} // namespace cru::ui::style
diff --git a/include/cru/ui/style/Styler.hpp b/include/cru/ui/style/Styler.hpp
index 2aece114..10b169b1 100644
--- a/include/cru/ui/style/Styler.hpp
+++ b/include/cru/ui/style/Styler.hpp
@@ -2,19 +2,24 @@
#include "../Base.hpp"
#include "ApplyBorderStyleInfo.hpp"
#include "cru/common/Base.hpp"
+#include "cru/common/ClonablePtr.hpp"
#include <memory>
namespace cru::ui::style {
class Styler : public Object {
public:
- virtual void Apply(controls::Control* control) const;
+ virtual void Apply(controls::Control* control) const = 0;
virtual Styler* Clone() const = 0;
};
class BorderStyler : public Styler {
public:
+ static ClonablePtr<BorderStyler> Create(ApplyBorderStyleInfo style) {
+ return ClonablePtr<BorderStyler>(new BorderStyler(std::move(style)));
+ }
+
explicit BorderStyler(ApplyBorderStyleInfo style);
void Apply(controls::Control* control) const override;