#pragma once #include "../Base.hpp" #include "cru/common/Base.hpp" #include "cru/common/ClonablePtr.hpp" #include "cru/common/Event.hpp" #include "cru/ui/controls/IClickableControl.hpp" #include "cru/ui/helper/ClickDetector.hpp" #include #include #include #include namespace cru::ui::style { class Condition : public Object { public: virtual std::vector ChangeOn( controls::Control* control) const = 0; virtual bool Judge(controls::Control* control) const = 0; virtual Condition* Clone() const = 0; }; class NoCondition : public Condition { public: static ClonablePtr Create() { return ClonablePtr(new NoCondition); }; std::vector 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> conditions); std::vector ChangeOn(controls::Control* control) const override; protected: std::vector> conditions_; }; class AndCondition : public CompoundCondition { public: static ClonablePtr Create( std::vector> conditions) { return ClonablePtr(new AndCondition(std::move(conditions))); } using CompoundCondition::CompoundCondition; bool Judge(controls::Control* control) const override; AndCondition* Clone() const override { return new AndCondition(conditions_); } }; class OrCondition : public CompoundCondition { public: static ClonablePtr Create( std::vector> conditions) { return ClonablePtr(new OrCondition(std::move(conditions))); } using CompoundCondition::CompoundCondition; bool Judge(controls::Control* control) const override; OrCondition* Clone() const override { return new OrCondition(conditions_); } }; class FocusCondition : public Condition { public: static ClonablePtr Create(bool has_focus) { return ClonablePtr(new FocusCondition(has_focus)); } explicit FocusCondition(bool has_focus); std::vector ChangeOn(controls::Control* control) const override; bool Judge(controls::Control* control) const override; FocusCondition* Clone() const override { return new FocusCondition(has_focus_); } private: bool has_focus_; }; class HoverCondition : public Condition { public: static ClonablePtr Create(bool hover) { return ClonablePtr(new HoverCondition(hover)); } explicit HoverCondition(bool hover) : hover_(hover) {} std::vector 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 Create( helper::ClickState click_state) { return ClonablePtr( new ClickStateCondition(click_state)); } explicit ClickStateCondition(helper::ClickState click_state); std::vector ChangeOn(controls::Control* control) const override; bool Judge(controls::Control* control) const override; ClickStateCondition* Clone() const override { return new ClickStateCondition(click_state_); } private: helper::ClickState click_state_; }; } // namespace cru::ui::style