diff options
author | 杨宇千 <crupest@outlook.com> | 2019-08-11 01:09:49 +0800 |
---|---|---|
committer | 杨宇千 <crupest@outlook.com> | 2019-08-11 01:09:49 +0800 |
commit | 0e35b2c022599bca2df61488945f07e4d6b4eb35 (patch) | |
tree | 71daef6f9725a250b9fcaf97fdecc9bdf46bd6e3 /src/ui/control.cpp | |
parent | 9eed31954c14f2d60c906adb5b49b58fbee4ff7f (diff) | |
download | cru-0e35b2c022599bca2df61488945f07e4d6b4eb35.tar.gz cru-0e35b2c022599bca2df61488945f07e4d6b4eb35.tar.bz2 cru-0e35b2c022599bca2df61488945f07e4d6b4eb35.zip |
...
Diffstat (limited to 'src/ui/control.cpp')
-rw-r--r-- | src/ui/control.cpp | 73 |
1 files changed, 70 insertions, 3 deletions
diff --git a/src/ui/control.cpp b/src/ui/control.cpp index 7563dc91..51e1937a 100644 --- a/src/ui/control.cpp +++ b/src/ui/control.cpp @@ -1,6 +1,10 @@ #include "cru/ui/control.hpp" +#include "cru/platform/native/basic_types.hpp" +#include "cru/ui/base.hpp" +#include "cru/ui/event/ui_event.hpp" #include "cru/ui/window.hpp" +#include "routed_event_dispatch.hpp" #include <cassert> @@ -10,7 +14,69 @@ void Control::_SetParent(Control* parent) { parent_ = parent; const auto new_parent = GetParent(); if (old_parent != new_parent) OnParentChanged(old_parent, new_parent); -} + + MouseDownEvent()->direct->AddHandler( + [this](event::MouseButtonEventArgs& args) { + switch (args.GetMouseButton()) { + case MouseButton::Left: + click_map_.left = true; + OnMouseClickBegin(MouseButton::Left); + break; + case MouseButton::Middle: + click_map_.middle = true; + OnMouseClickBegin(MouseButton::Middle); + break; + case MouseButton::Right: + click_map_.right = true; + OnMouseClickBegin(MouseButton::Right); + break; + } + }); + + MouseEnterEvent()->direct->AddHandler([this](event::MouseEventArgs&) { + this->is_mouse_over_ = true; + }); + + MouseLeaveEvent()->direct->AddHandler([this](event::MouseEventArgs&) { + this->is_mouse_over_ = false; + if (click_map_.left) { + OnMouseClickCancel(MouseButton::Left); + } + if (click_map_.middle) { + OnMouseClickCancel(MouseButton::Middle); + } + if (click_map_.right) { + OnMouseClickCancel(MouseButton::Right); + } + click_map_.left = click_map_.middle = click_map_.right = false; + }); + + MouseUpEvent()->direct->AddHandler([this](event::MouseButtonEventArgs& args) { + switch (args.GetMouseButton()) { + case MouseButton::Left: + if (click_map_.left) { + click_map_.left = false; + OnMouseClickEnd(MouseButton::Left); + DispatchEvent(this, &Control::MouseClickEvent, nullptr, args.GetPoint(), args.GetMouseButton()); + } + break; + case MouseButton::Middle: + if (click_map_.middle) { + click_map_.middle = false; + OnMouseClickEnd(MouseButton::Middle); + DispatchEvent(this, &Control::MouseClickEvent, nullptr, args.GetPoint(), args.GetMouseButton()); + } + break; + case MouseButton::Right: + if (click_map_.right) { + click_map_.right = false; + OnMouseClickEnd(MouseButton::Right); + DispatchEvent(this, &Control::MouseClickEvent, nullptr, args.GetPoint(), args.GetMouseButton()); + } + break; + } + }); +} // namespace cru::ui void Control::_SetDescendantWindow(Window* window) { if (window == nullptr && window_ == nullptr) return; @@ -40,8 +106,7 @@ void Control::TraverseDescendants( void Control::_TraverseDescendants( Control* control, const std::function<void(Control*)>& predicate) { predicate(control); - for (auto c : control->GetChildren()) - _TraverseDescendants(c, predicate); + for (auto c : control->GetChildren()) _TraverseDescendants(c, predicate); } bool Control::RequestFocus() { auto window = GetWindow(); @@ -66,4 +131,6 @@ void Control::OnDetachToWindow(Window* window) {} void Control::OnMouseClickBegin(platform::native::MouseButton button) {} void Control::OnMouseClickEnd(platform::native::MouseButton button) {} + +void Control::OnMouseClickCancel(platform::native::MouseButton button) {} } // namespace cru::ui |