use long-press shortcuts again, but make them a bit harder to trigger accidentally

custom
jacqueline 12 months ago
parent b720ba42a0
commit 2afeb2989b
  1. 8
      src/tangara/input/input_hook.cpp
  2. 2
      src/tangara/input/input_hook.hpp
  3. 38
      src/tangara/input/input_touch_wheel.cpp
  4. 7
      src/tangara/input/input_trigger.cpp
  5. 1
      src/tangara/input/input_trigger.hpp

@ -70,8 +70,8 @@ auto TriggerHooks::update(bool pressed, lv_indev_data_t* d) -> void {
} }
} }
auto TriggerHooks::override(Trigger::State s, auto TriggerHooks::override(Trigger::State s, std::optional<HookCallback> cb)
std::optional<HookCallback> cb) -> void { -> void {
switch (s) { switch (s) {
case Trigger::State::kClick: case Trigger::State::kClick:
click_.override(cb); click_.override(cb);
@ -96,4 +96,8 @@ auto TriggerHooks::hooks() -> std::vector<std::reference_wrapper<Hook>> {
return {click_, long_press_, repeat_}; return {click_, long_press_, repeat_};
} }
auto TriggerHooks::cancel() -> void {
trigger_.cancel();
}
} // namespace input } // namespace input

@ -58,6 +58,8 @@ class TriggerHooks {
auto name() const -> const std::string&; auto name() const -> const std::string&;
auto hooks() -> std::vector<std::reference_wrapper<Hook>>; auto hooks() -> std::vector<std::reference_wrapper<Hook>>;
auto cancel() -> void;
// Not copyable or movable. // Not copyable or movable.
TriggerHooks(const TriggerHooks&) = delete; TriggerHooks(const TriggerHooks&) = delete;
TriggerHooks& operator=(const TriggerHooks&) = delete; TriggerHooks& operator=(const TriggerHooks&) = delete;

@ -40,10 +40,10 @@ TouchWheel::TouchWheel(drivers::NvsStorage& nvs, drivers::TouchWheel& wheel)
return true; return true;
}), }),
centre_("centre", actions::select(), {}, {}, {}), centre_("centre", actions::select(), {}, {}, {}),
up_("up", {}, actions::scrollToTop(), {}, {}), up_("up", {}, {}, actions::scrollToTop(), {}),
right_("right", {}), right_("right", {}),
down_("down", {}, actions::scrollToBottom(), {}, {}), down_("down", {}, {}, actions::scrollToBottom(), {}),
left_("left", {}, actions::goBack(), {}, {}), left_("left", {}, {}, actions::goBack(), {}),
is_scrolling_(false), is_scrolling_(false),
threshold_(calculateThreshold(nvs.ScrollSensitivity())), threshold_(calculateThreshold(nvs.ScrollSensitivity())),
is_first_read_(true), 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 // If the user is touching the wheel but not scrolling, then they may be
// clicking on one of the wheel's cardinal directions. // clicking on one of the wheel's cardinal directions.
bool pressing = wheel_data.is_wheel_touched && !is_scrolling_; if (is_scrolling_) {
up_.cancel();
up_.update(pressing && drivers::TouchWheel::isAngleWithin( right_.cancel();
wheel_data.wheel_position, 0, 32), down_.cancel();
data); left_.cancel();
right_.update(pressing && drivers::TouchWheel::isAngleWithin( } else {
wheel_data.wheel_position, 192, 32), bool pressing = wheel_data.is_wheel_touched;
data); up_.update(pressing && drivers::TouchWheel::isAngleWithin(
down_.update(pressing && drivers::TouchWheel::isAngleWithin( wheel_data.wheel_position, 0, 32),
wheel_data.wheel_position, 128, 32),
data);
left_.update(pressing && drivers::TouchWheel::isAngleWithin(
wheel_data.wheel_position, 64, 32),
data); 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 { auto TouchWheel::name() -> std::string {

@ -85,4 +85,11 @@ auto Trigger::update(bool is_pressed) -> State {
return State::kNone; return State::kNone;
} }
auto Trigger::cancel() -> void {
touch_time_ms_.reset();
was_pressed_ = false;
was_double_click_ = false;
times_long_pressed_ = 0;
}
} // namespace input } // namespace input

@ -30,6 +30,7 @@ class Trigger {
Trigger(); Trigger();
auto update(bool is_pressed) -> State; auto update(bool is_pressed) -> State;
auto cancel() -> void;
private: private:
std::optional<uint64_t> touch_time_ms_; std::optional<uint64_t> touch_time_ms_;

Loading…
Cancel
Save