diff options
author | 杨宇千 <crupest@outlook.com> | 2019-08-11 22:08:49 +0800 |
---|---|---|
committer | 杨宇千 <crupest@outlook.com> | 2019-08-11 22:08:49 +0800 |
commit | 99a322a6badf5b6d95be4944e80d92fc1cb2589e (patch) | |
tree | 4227de0cbb1fd73ef99de4bc57041492a0450208 /src/ui/click_detector.cpp | |
parent | 3a8abe0aed9bb72ed64cbfe9f2f83a0db285e14c (diff) | |
download | cru-99a322a6badf5b6d95be4944e80d92fc1cb2589e.tar.gz cru-99a322a6badf5b6d95be4944e80d92fc1cb2589e.tar.bz2 cru-99a322a6badf5b6d95be4944e80d92fc1cb2589e.zip |
...
Diffstat (limited to 'src/ui/click_detector.cpp')
-rw-r--r-- | src/ui/click_detector.cpp | 32 |
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 |