diff options
author | crupest <crupest@outlook.com> | 2020-12-02 19:19:22 +0800 |
---|---|---|
committer | crupest <crupest@outlook.com> | 2020-12-02 19:19:22 +0800 |
commit | 145cfd5b82d76e0c937eceda707aa22427899943 (patch) | |
tree | ab98708eea0e0ba7b965e20927303e49a8d9ae23 /src | |
parent | 0fb7a0e0b2b9e04ca414b1e47c69cc854c79831b (diff) | |
download | cru-145cfd5b82d76e0c937eceda707aa22427899943.tar.gz cru-145cfd5b82d76e0c937eceda707aa22427899943.tar.bz2 cru-145cfd5b82d76e0c937eceda707aa22427899943.zip |
...
Diffstat (limited to 'src')
-rw-r--r-- | src/ui/CMakeLists.txt | 4 | ||||
-rw-r--r-- | src/ui/style/Condition.cpp | 71 | ||||
-rw-r--r-- | src/ui/style/Trigger.cpp | 49 |
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 |