From ae6f797561cdfa438ebef1fbbf94d784d315e655 Mon Sep 17 00:00:00 2001 From: crupest Date: Wed, 1 Jan 2020 17:38:45 +0800 Subject: ... --- include/cru/ui/click_detector.hpp | 38 +++++++++++++++++--------------------- 1 file changed, 17 insertions(+), 21 deletions(-) (limited to 'include/cru/ui') diff --git a/include/cru/ui/click_detector.hpp b/include/cru/ui/click_detector.hpp index 1a88b8a6..d5e4ac78 100644 --- a/include/cru/ui/click_detector.hpp +++ b/include/cru/ui/click_detector.hpp @@ -1,9 +1,8 @@ #pragma once #include "control.hpp" -#include -#include #include +#include namespace cru::ui { class ClickEventArgs : Object { @@ -32,33 +31,30 @@ class ClickEventArgs : Object { MouseButton button_; }; +enum class ClickState { + None, // Mouse is outside the control. + Hover, // Mouse hovers on the control but not pressed + Press, // Mouse is pressed and if released click is done. + PressInactive // Mouse is pressed but if released click is canceled. +}; + class ClickDetector : public Object { public: explicit ClickDetector(Control* control); - ClickDetector(const ClickDetector& other) = delete; - ClickDetector& operator=(const ClickDetector& other) = delete; - ClickDetector(ClickDetector&& other) = delete; - ClickDetector& operator=(ClickDetector&& other) = delete; + CRU_DELETE_COPY(ClickDetector) + CRU_DELETE_MOVE(ClickDetector) ~ClickDetector() override = default; Control* GetControl() const { return control_; } - // Return a union of buttons being pressed. Return 0 if no button is being - // pressed. - MouseButton GetPressingButton() const { - unsigned result = 0; - if (click_map_.left.has_value()) result |= MouseButton::Left; - if (click_map_.middle.has_value()) result |= MouseButton::Middle; - if (click_map_.right.has_value()) result |= MouseButton::Right; - return static_cast(result); - } + MouseButton GetTriggerButton() const { return trigger_button_; } + void SetTriggerButton(MouseButton trigger_button); IEvent* ClickEvent() { return &event_; } - IEvent* ClickBeginEvent() { return &begin_event_; } - IEvent* ClickEndEvent() { return &end_event_; } + IEvent* StateChangeEvent() { return &state_change_event_; } private: std::optional& FromButton(MouseButton button) { @@ -77,12 +73,12 @@ class ClickDetector : public Object { private: Control* control_; - Event event_; + MouseButton trigger_button_ = MouseButton::Left | MouseButton::Right; - Event begin_event_; - Event end_event_; + Event event_; + Event state_change_event_; - std::forward_list event_rovoker_guards_; + std::vector event_rovoker_guards_; struct { std::optional left = std::nullopt; -- cgit v1.2.3