From 2afeb2989b2f845664e12f93e850aab983be12cc Mon Sep 17 00:00:00 2001 From: jacqueline Date: Thu, 9 May 2024 17:05:54 +1000 Subject: [PATCH] use long-press shortcuts again, but make them a bit harder to trigger accidentally --- src/tangara/input/input_hook.cpp | 8 ++++-- src/tangara/input/input_hook.hpp | 2 ++ src/tangara/input/input_touch_wheel.cpp | 38 ++++++++++++++----------- src/tangara/input/input_trigger.cpp | 7 +++++ src/tangara/input/input_trigger.hpp | 1 + 5 files changed, 38 insertions(+), 18 deletions(-) diff --git a/src/tangara/input/input_hook.cpp b/src/tangara/input/input_hook.cpp index 6946c07f..95ff8f2c 100644 --- a/src/tangara/input/input_hook.cpp +++ b/src/tangara/input/input_hook.cpp @@ -70,8 +70,8 @@ auto TriggerHooks::update(bool pressed, lv_indev_data_t* d) -> void { } } -auto TriggerHooks::override(Trigger::State s, - std::optional cb) -> void { +auto TriggerHooks::override(Trigger::State s, std::optional cb) + -> void { switch (s) { case Trigger::State::kClick: click_.override(cb); @@ -96,4 +96,8 @@ auto TriggerHooks::hooks() -> std::vector> { return {click_, long_press_, repeat_}; } +auto TriggerHooks::cancel() -> void { + trigger_.cancel(); +} + } // namespace input diff --git a/src/tangara/input/input_hook.hpp b/src/tangara/input/input_hook.hpp index 3dc8a2c8..06fcb037 100644 --- a/src/tangara/input/input_hook.hpp +++ b/src/tangara/input/input_hook.hpp @@ -58,6 +58,8 @@ class TriggerHooks { auto name() const -> const std::string&; auto hooks() -> std::vector>; + auto cancel() -> void; + // Not copyable or movable. TriggerHooks(const TriggerHooks&) = delete; TriggerHooks& operator=(const TriggerHooks&) = delete; diff --git a/src/tangara/input/input_touch_wheel.cpp b/src/tangara/input/input_touch_wheel.cpp index 2c4a8b03..75159320 100644 --- a/src/tangara/input/input_touch_wheel.cpp +++ b/src/tangara/input/input_touch_wheel.cpp @@ -40,10 +40,10 @@ TouchWheel::TouchWheel(drivers::NvsStorage& nvs, drivers::TouchWheel& wheel) return true; }), centre_("centre", actions::select(), {}, {}, {}), - up_("up", {}, actions::scrollToTop(), {}, {}), + up_("up", {}, {}, actions::scrollToTop(), {}), right_("right", {}), - down_("down", {}, actions::scrollToBottom(), {}, {}), - left_("left", {}, actions::goBack(), {}, {}), + down_("down", {}, {}, actions::scrollToBottom(), {}), + left_("left", {}, {}, actions::goBack(), {}), is_scrolling_(false), threshold_(calculateThreshold(nvs.ScrollSensitivity())), is_first_read_(true), @@ -73,20 +73,26 @@ auto TouchWheel::read(lv_indev_data_t* data) -> void { // If the user is touching the wheel but not scrolling, then they may be // clicking on one of the wheel's cardinal directions. - bool pressing = wheel_data.is_wheel_touched && !is_scrolling_; - - up_.update(pressing && drivers::TouchWheel::isAngleWithin( - wheel_data.wheel_position, 0, 32), - data); - right_.update(pressing && drivers::TouchWheel::isAngleWithin( - wheel_data.wheel_position, 192, 32), - data); - down_.update(pressing && drivers::TouchWheel::isAngleWithin( - wheel_data.wheel_position, 128, 32), - data); - left_.update(pressing && drivers::TouchWheel::isAngleWithin( - wheel_data.wheel_position, 64, 32), + if (is_scrolling_) { + up_.cancel(); + right_.cancel(); + down_.cancel(); + left_.cancel(); + } else { + bool pressing = wheel_data.is_wheel_touched; + up_.update(pressing && drivers::TouchWheel::isAngleWithin( + wheel_data.wheel_position, 0, 32), data); + right_.update(pressing && drivers::TouchWheel::isAngleWithin( + wheel_data.wheel_position, 192, 32), + data); + down_.update(pressing && drivers::TouchWheel::isAngleWithin( + wheel_data.wheel_position, 128, 32), + data); + left_.update(pressing && drivers::TouchWheel::isAngleWithin( + wheel_data.wheel_position, 64, 32), + data); + } } auto TouchWheel::name() -> std::string { diff --git a/src/tangara/input/input_trigger.cpp b/src/tangara/input/input_trigger.cpp index 11b4dbe9..eb67bcca 100644 --- a/src/tangara/input/input_trigger.cpp +++ b/src/tangara/input/input_trigger.cpp @@ -85,4 +85,11 @@ auto Trigger::update(bool is_pressed) -> State { return State::kNone; } +auto Trigger::cancel() -> void { + touch_time_ms_.reset(); + was_pressed_ = false; + was_double_click_ = false; + times_long_pressed_ = 0; +} + } // namespace input diff --git a/src/tangara/input/input_trigger.hpp b/src/tangara/input/input_trigger.hpp index bcafa8ad..1b0e681d 100644 --- a/src/tangara/input/input_trigger.hpp +++ b/src/tangara/input/input_trigger.hpp @@ -30,6 +30,7 @@ class Trigger { Trigger(); auto update(bool is_pressed) -> State; + auto cancel() -> void; private: std::optional touch_time_ms_;