fix(core/mercury): do not block swipe on button press, abort press on swipe lock instead

pull/3984/head
tychovrahe 3 months ago committed by matejcik
parent a4ff76e840
commit e89ae8246d

@ -141,6 +141,7 @@ impl core::ops::IndexMut<SwipeDirection> for SwipeConfig {
#[derive(Copy, Clone, Eq, PartialEq)]
pub enum SwipeDetectMsg {
Start(SwipeDirection),
Move(SwipeDirection, u16),
Trigger(SwipeDirection),
}
@ -237,7 +238,7 @@ impl SwipeDetect {
let progress = config.progress(dir, ofs, self.min_lock());
if progress > 0 {
self.locked = Some(dir);
res = Some(SwipeDetectMsg::Move(dir, self.progress(progress)));
res = Some(SwipeDetectMsg::Start(dir));
break;
}
}

@ -51,6 +51,8 @@ pub enum TouchEvent {
TouchMove(Point),
/// Touch has ended at a point on the screen.
TouchEnd(Point),
/// Touch event has been suppressed by more important event - i.e. Swipe.
TouchAbort,
}
impl TouchEvent {

@ -175,6 +175,7 @@ impl<Q: FlowState, S: FlowStore> Component for SwipeFlow<Q, S> {
Some(SwipeDetectMsg::Move(dir, progress)) => {
Some(Event::Swipe(SwipeEvent::Move(dir, progress as i16)))
}
Some(SwipeDetectMsg::Start(_)) => Some(Event::Touch(TouchEvent::TouchAbort)),
_ => Some(event),
}
} else {

@ -350,7 +350,6 @@ impl Component for Button {
if let Some(duration) = self.long_press {
self.long_timer = Some(ctx.request_timer(duration));
}
ctx.disable_swipe();
return Some(ButtonMsg::Pressed);
}
}
@ -361,7 +360,6 @@ impl Component for Button {
State::Pressed if !touch_area.contains(pos) => {
// Touch is leaving our area, transform to `Released` state.
self.set(ctx, State::Released);
ctx.enable_swipe();
return Some(ButtonMsg::Released);
}
_ => {
@ -377,17 +375,40 @@ impl Component for Button {
State::Pressed if touch_area.contains(pos) => {
// Touch finished in our area, we got clicked.
self.set(ctx, State::Initial);
ctx.enable_swipe();
return Some(ButtonMsg::Clicked);
}
State::Pressed => {
// Touch finished outside our area.
self.set(ctx, State::Initial);
self.long_timer = None;
return Some(ButtonMsg::Released);
}
_ => {
// Touch finished outside our area.
self.set(ctx, State::Initial);
ctx.enable_swipe();
self.long_timer = None;
}
}
}
Event::Touch(TouchEvent::TouchAbort) => {
match self.state {
State::Initial | State::Disabled => {
// Do nothing.
}
State::Pressed => {
// Touch aborted
self.set(ctx, State::Initial);
self.long_timer = None;
return Some(ButtonMsg::Released);
}
_ => {
// Irrelevant touch abort
self.set(ctx, State::Initial);
self.long_timer = None;
}
}
}
Event::Timer(token) => {
if self.long_timer == Some(token) {
self.long_timer = None;

@ -227,6 +227,7 @@ impl Component for HoldToConfirm {
self.anim.start();
ctx.request_anim_frame();
ctx.request_paint();
ctx.disable_swipe();
self.finalizing = false;
}
}
@ -235,6 +236,7 @@ impl Component for HoldToConfirm {
self.anim.reset();
ctx.request_anim_frame();
ctx.request_paint();
ctx.enable_swipe();
self.finalizing = false;
}
}
@ -249,6 +251,7 @@ impl Component for HoldToConfirm {
self.anim.reset();
ctx.request_anim_frame();
ctx.request_paint();
ctx.enable_swipe();
}
}
Some(ButtonMsg::LongPressed) => {

@ -181,6 +181,7 @@ impl Component for NumberInputSlider {
TouchEvent::TouchStart(pos) => self.slider_eval(pos, ctx),
TouchEvent::TouchMove(pos) => self.slider_eval(pos, ctx),
TouchEvent::TouchEnd(pos) => self.slider_eval(pos, ctx),
TouchEvent::TouchAbort => None,
};
}
None

@ -1,6 +1,6 @@
use crate::ui::{
component::{base::AttachType, Component, Event, EventCtx, SwipeDetect, SwipeDetectMsg},
event::{SwipeEvent},
event::{SwipeEvent, TouchEvent},
flow::Swipable,
geometry::Rect,
shape::Renderer,
@ -56,6 +56,7 @@ impl<T: Swipable + Component> Component for SwipeUpScreen<T> {
Some(SwipeDetectMsg::Move(dir, progress)) => {
Event::Swipe(SwipeEvent::Move(dir, progress as i16))
}
Some(SwipeDetectMsg::Start(_)) => Event::Touch(TouchEvent::TouchAbort),
_ => event,
};

@ -155,6 +155,7 @@ impl Component for NumberInputSlider {
TouchEvent::TouchStart(pos) => self.slider_eval(pos, ctx),
TouchEvent::TouchMove(pos) => self.slider_eval(pos, ctx),
TouchEvent::TouchEnd(pos) => self.slider_eval(pos, ctx),
TouchEvent::TouchAbort => None,
};
}
None

Loading…
Cancel
Save