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,
std::optional<HookCallback> cb) -> void {
auto TriggerHooks::override(Trigger::State s, std::optional<HookCallback> cb)
-> void {
switch (s) {
case Trigger::State::kClick:
click_.override(cb);
@ -96,4 +96,8 @@ auto TriggerHooks::hooks() -> std::vector<std::reference_wrapper<Hook>> {
return {click_, long_press_, repeat_};
}
auto TriggerHooks::cancel() -> void {
trigger_.cancel();
}
} // namespace input

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

@ -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 {

@ -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

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

Loading…
Cancel
Save