aboutsummaryrefslogtreecommitdiff
path: root/src/ui/control.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/ui/control.cpp')
-rw-r--r--src/ui/control.cpp73
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