use long-press shortcuts again, but make them a bit harder to trigger accidentally
This commit is contained in:
@@ -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_;
|
||||
|
||||
Reference in New Issue
Block a user