aboutsummaryrefslogtreecommitdiff
path: root/src/ui/click_detector.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/ui/click_detector.cpp')
-rw-r--r--src/ui/click_detector.cpp32
1 files changed, 32 insertions, 0 deletions
diff --git a/src/ui/click_detector.cpp b/src/ui/click_detector.cpp
new file mode 100644
index 00000000..1442b885
--- /dev/null
+++ b/src/ui/click_detector.cpp
@@ -0,0 +1,32 @@
+#include "cru/ui/click_detector.hpp"
+
+#include <cassert>
+#include <optional>
+
+namespace cru::ui {
+ClickDetector::ClickDetector(Control* control) {
+ assert(control);
+ control_ = control;
+
+ event_rovoker_guards_.push_front(
+ EventRevokerGuard(control->MouseDownEvent()->Direct()->AddHandler(
+ [this, control](event::MouseButtonEventArgs& args) {
+ if (!control->CaptureMouse()) return; // capture failed
+ FromButton(args.GetMouseButton()) =
+ args.GetPoint(); // save mouse down point
+ })));
+
+ event_rovoker_guards_.push_front(
+ EventRevokerGuard(control->MouseUpEvent()->Direct()->AddHandler(
+ [this, control](event::MouseButtonEventArgs& args) {
+ if (!control->IsMouseCaptured()) return;
+ const auto button = args.GetMouseButton();
+ auto& down_point = FromButton(button);
+ if (down_point.has_value()) {
+ event_.Raise(ClickEventArgs(control, down_point.value(),
+ args.GetPoint(), button));
+ down_point = std::nullopt;
+ }
+ })));
+}
+} // namespace cru::ui