aboutsummaryrefslogtreecommitdiff
path: root/src/ui/style/Condition.cpp
diff options
context:
space:
mode:
authorcrupest <crupest@outlook.com>2021-03-24 19:14:19 +0800
committercrupest <crupest@outlook.com>2021-03-24 19:14:19 +0800
commit7f15a1ff9a2007e119798053083a0a87d042990a (patch)
treecb35c01a7eaee867376d959b96c9bbd15df939e5 /src/ui/style/Condition.cpp
parent74956951ee663012df0c3fe4ebe29799cb2f7732 (diff)
parent7703063a5816b089483e78ccd74bb9902ccfbea8 (diff)
downloadcru-7f15a1ff9a2007e119798053083a0a87d042990a.tar.gz
cru-7f15a1ff9a2007e119798053083a0a87d042990a.tar.bz2
cru-7f15a1ff9a2007e119798053083a0a87d042990a.zip
Merge branch 'master' of https://github.com/crupest/CruUI
Diffstat (limited to 'src/ui/style/Condition.cpp')
-rw-r--r--src/ui/style/Condition.cpp84
1 files changed, 84 insertions, 0 deletions
diff --git a/src/ui/style/Condition.cpp b/src/ui/style/Condition.cpp
new file mode 100644
index 00000000..f4866c04
--- /dev/null
+++ b/src/ui/style/Condition.cpp
@@ -0,0 +1,84 @@
+#include "cru/ui/style/Condition.hpp"
+#include <memory>
+
+#include "cru/common/ClonablePtr.hpp"
+#include "cru/common/Event.hpp"
+#include "cru/ui/controls/Control.hpp"
+#include "cru/ui/controls/IClickableControl.hpp"
+#include "cru/ui/helper/ClickDetector.hpp"
+
+namespace cru::ui::style {
+CompoundCondition::CompoundCondition(
+ std::vector<ClonablePtr<Condition>> conditions)
+ : conditions_(std::move(conditions)) {}
+
+std::vector<IBaseEvent*> CompoundCondition::ChangeOn(
+ controls::Control* control) const {
+ std::vector<IBaseEvent*> result;
+
+ for (auto condition : conditions_) {
+ for (auto e : condition->ChangeOn(control)) {
+ result.push_back(e);
+ }
+ }
+
+ return result;
+}
+
+bool AndCondition::Judge(controls::Control* control) const {
+ for (auto condition : conditions_) {
+ if (!condition->Judge(control)) return false;
+ }
+ return true;
+}
+
+bool OrCondition::Judge(controls::Control* control) const {
+ for (auto condition : conditions_) {
+ if (condition->Judge(control)) return true;
+ }
+ return false;
+}
+
+FocusCondition::FocusCondition(bool has_focus) : has_focus_(has_focus) {}
+
+std::vector<IBaseEvent*> FocusCondition::ChangeOn(
+ controls::Control* control) const {
+ return {control->GainFocusEvent()->Direct(),
+ control->LoseFocusEvent()->Direct()};
+}
+
+bool FocusCondition::Judge(controls::Control* control) const {
+ return control->HasFocus() == has_focus_;
+}
+
+std::vector<IBaseEvent*> HoverCondition::ChangeOn(
+ controls::Control* control) const {
+ return {control->MouseEnterEvent()->Direct(),
+ control->MouseLeaveEvent()->Direct()};
+}
+
+bool HoverCondition::Judge(controls::Control* control) const {
+ return control->IsMouseOver() == hover_;
+}
+
+ClickStateCondition::ClickStateCondition(helper::ClickState click_state)
+ : click_state_(click_state) {}
+
+std::vector<IBaseEvent*> ClickStateCondition::ChangeOn(
+ controls::Control* control) const {
+ auto clickable_control = dynamic_cast<controls::IClickableControl*>(control);
+ if (clickable_control) {
+ return {clickable_control->ClickStateChangeEvent()};
+ } else {
+ return {};
+ }
+}
+
+bool ClickStateCondition::Judge(controls::Control* control) const {
+ auto clickable_control = dynamic_cast<controls::IClickableControl*>(control);
+ if (clickable_control) {
+ return clickable_control->GetClickState() == click_state_;
+ }
+ return false;
+}
+} // namespace cru::ui::style