diff options
author | crupest <crupest@outlook.com> | 2020-12-02 20:50:26 +0800 |
---|---|---|
committer | crupest <crupest@outlook.com> | 2020-12-02 20:50:26 +0800 |
commit | c6baeb6432a4db7433aab4fc8f89cc235473f11a (patch) | |
tree | dee45567f87a33a52de752fbc234a7f09bd41245 /include/cru/ui/style/Condition.hpp | |
parent | 7cb333e847eec701b0cb3577a84f0107a5be7602 (diff) | |
download | cru-c6baeb6432a4db7433aab4fc8f89cc235473f11a.tar.gz cru-c6baeb6432a4db7433aab4fc8f89cc235473f11a.tar.bz2 cru-c6baeb6432a4db7433aab4fc8f89cc235473f11a.zip |
...
Diffstat (limited to 'include/cru/ui/style/Condition.hpp')
-rw-r--r-- | include/cru/ui/style/Condition.hpp | 31 |
1 files changed, 28 insertions, 3 deletions
diff --git a/include/cru/ui/style/Condition.hpp b/include/cru/ui/style/Condition.hpp index 97d29287..c4fd2106 100644 --- a/include/cru/ui/style/Condition.hpp +++ b/include/cru/ui/style/Condition.hpp @@ -5,6 +5,7 @@ #include "cru/ui/controls/IClickableControl.hpp" #include "cru/ui/helper/ClickDetector.hpp" +#include <memory> #include <type_traits> #include <utility> #include <vector> @@ -15,18 +16,26 @@ class Condition : public Object { virtual std::vector<IBaseEvent*> ChangeOn( controls::Control* control) const = 0; virtual bool Judge(controls::Control* control) const = 0; + + virtual std::unique_ptr<Condition> Clone() const = 0; }; class CompoundCondition : public Condition { public: - explicit CompoundCondition(std::vector<Condition*> conditions); + explicit CompoundCondition( + std::vector<std::unique_ptr<Condition>> conditions); + + const std::vector<Condition*>& GetConditions() const { + return readonly_conditions_; + } - const std::vector<Condition*>& GetConditions() const { return conditions_; } + std::vector<std::unique_ptr<Condition>> CloneConditions() const; std::vector<IBaseEvent*> ChangeOn(controls::Control* control) const override; private: - std::vector<Condition*> conditions_; + std::vector<std::unique_ptr<Condition>> conditions_; + std::vector<Condition*> readonly_conditions_; }; class AndCondition : public CompoundCondition { @@ -34,6 +43,10 @@ class AndCondition : public CompoundCondition { using CompoundCondition::CompoundCondition; bool Judge(controls::Control* control) const override; + + std::unique_ptr<Condition> Clone() const override { + return std::make_unique<AndCondition>(CloneConditions()); + } }; class OrCondition : public CompoundCondition { @@ -41,6 +54,10 @@ class OrCondition : public CompoundCondition { using CompoundCondition::CompoundCondition; bool Judge(controls::Control* control) const override; + + std::unique_ptr<Condition> Clone() const override { + return std::make_unique<OrCondition>(CloneConditions()); + } }; class FocusCondition : public Condition { @@ -50,6 +67,10 @@ class FocusCondition : public Condition { std::vector<IBaseEvent*> ChangeOn(controls::Control* control) const override; bool Judge(controls::Control* control) const override; + std::unique_ptr<Condition> Clone() const override { + return std::make_unique<FocusCondition>(has_focus_); + } + private: bool has_focus_; }; @@ -61,6 +82,10 @@ class ClickStateCondition : public Condition { std::vector<IBaseEvent*> ChangeOn(controls::Control* control) const override; bool Judge(controls::Control* control) const override; + std::unique_ptr<Condition> Clone() const override { + return std::make_unique<ClickStateCondition>(click_state_); + } + private: helper::ClickState click_state_; }; |