aboutsummaryrefslogtreecommitdiff
path: root/src/ui
diff options
context:
space:
mode:
authorcrupest <crupest@outlook.com>2020-12-02 19:19:22 +0800
committercrupest <crupest@outlook.com>2020-12-02 19:19:22 +0800
commit145cfd5b82d76e0c937eceda707aa22427899943 (patch)
treeab98708eea0e0ba7b965e20927303e49a8d9ae23 /src/ui
parent0fb7a0e0b2b9e04ca414b1e47c69cc854c79831b (diff)
downloadcru-145cfd5b82d76e0c937eceda707aa22427899943.tar.gz
cru-145cfd5b82d76e0c937eceda707aa22427899943.tar.bz2
cru-145cfd5b82d76e0c937eceda707aa22427899943.zip
...
Diffstat (limited to 'src/ui')
-rw-r--r--src/ui/CMakeLists.txt4
-rw-r--r--src/ui/style/Condition.cpp71
-rw-r--r--src/ui/style/Trigger.cpp49
3 files changed, 73 insertions, 51 deletions
diff --git a/src/ui/CMakeLists.txt b/src/ui/CMakeLists.txt
index 5cb50ce3..85c87f5e 100644
--- a/src/ui/CMakeLists.txt
+++ b/src/ui/CMakeLists.txt
@@ -34,7 +34,7 @@ add_library(cru_ui STATIC
render/ScrollRenderObject.cpp
render/StackLayoutRenderObject.cpp
render/TextRenderObject.cpp
- style/Trigger.cpp
+ style/Condition.cpp
)
target_sources(cru_ui PUBLIC
${CRU_UI_INCLUDE_DIR}/Base.hpp
@@ -71,6 +71,6 @@ target_sources(cru_ui PUBLIC
${CRU_UI_INCLUDE_DIR}/render/ScrollRenderObject.hpp
${CRU_UI_INCLUDE_DIR}/render/StackLayoutRenderObject.hpp
${CRU_UI_INCLUDE_DIR}/render/TextRenderObject.hpp
- ${CRU_UI_INCLUDE_DIR}/style/Trigger.hpp
+ ${CRU_UI_INCLUDE_DIR}/style/Condition.hpp
)
target_link_libraries(cru_ui PUBLIC cru_platform_gui)
diff --git a/src/ui/style/Condition.cpp b/src/ui/style/Condition.cpp
new file mode 100644
index 00000000..bc24e265
--- /dev/null
+++ b/src/ui/style/Condition.cpp
@@ -0,0 +1,71 @@
+#include "cru/ui/style/Condition.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<Condition*> conditions)
+ : conditions_(std::move(conditions)) {}
+
+std::vector<IBaseEvent*> CompoundCondition::ChangeOn(
+ controls::Control* control) const {
+ std::vector<IBaseEvent*> result;
+
+ for (auto condition : GetConditions()) {
+ for (auto e : condition->ChangeOn(control)) {
+ result.push_back(e);
+ }
+ }
+
+ return result;
+}
+
+bool AndCondition::Judge(controls::Control* control) const {
+ for (auto condition : GetConditions()) {
+ if (!condition->Judge(control)) return false;
+ }
+ return true;
+}
+
+bool OrCondition::Judge(controls::Control* control) const {
+ for (auto condition : GetConditions()) {
+ 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_;
+}
+
+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
diff --git a/src/ui/style/Trigger.cpp b/src/ui/style/Trigger.cpp
deleted file mode 100644
index b7292ce3..00000000
--- a/src/ui/style/Trigger.cpp
+++ /dev/null
@@ -1,49 +0,0 @@
-#include "cru/ui/style/Trigger.hpp"
-
-#include "cru/ui/controls/Control.hpp"
-#include "cru/ui/helper/ClickDetector.hpp"
-
-namespace cru::ui::style {
-void Trigger::Raise(bool value) {
- if (value == current_) return;
- current_ = value;
- change_event_.Raise(value);
-}
-
-CompoundTrigger::CompoundTrigger(std::vector<Trigger*> triggers)
- : triggers_(std::move(triggers)) {
- for (auto trigger : triggers_) {
- guard_ += trigger->ChangeEvent()->AddHandler(
- [this](bool) { Raise(this->CalculateState(triggers_)); });
- }
-}
-
-bool AndTrigger::CalculateState(const std::vector<Trigger*>& triggers) const {
- for (auto trigger : triggers) {
- if (!trigger->GetState()) return false;
- }
- return true;
-}
-
-bool OrTrigger::CalculateState(const std::vector<Trigger*>& triggers) const {
- for (auto trigger : triggers) {
- if (trigger->GetState()) return true;
- }
- return false;
-}
-
-FocusTrigger::FocusTrigger(controls::Control* control, bool has_focus)
- : has_focus_(has_focus) {
- guard_ += control->GainFocusEvent()->Direct()->AddHandler(
- [this](auto) { Raise(has_focus_); });
- guard_ += control->LoseFocusEvent()->Direct()->AddHandler(
- [this](auto) { Raise(!has_focus_); });
-}
-
-ClickStateTrigger::ClickStateTrigger(controls::IClickableControl* control,
- helper::ClickState click_state)
- : click_state_(click_state) {
- guard_ += control->ClickStateChangeEvent()->AddHandler(
- [this](helper::ClickState cs) { Raise(cs == click_state_); });
-}
-} // namespace cru::ui::style