forked from FOSS/BangleApps
widhid: gesture/dragging improvements
parent
4af055dac7
commit
d2a989170c
|
@ -5,64 +5,91 @@
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
let start = {x:0,y:0}, end = {x:0,y:0};
|
let anchor = {x:0,y:0};
|
||||||
|
let start = {x:0,y:0};
|
||||||
let dragging = false;
|
let dragging = false;
|
||||||
let activeTimeout: number | undefined;
|
let activeTimeout: number | undefined;
|
||||||
|
let waitForRelease = true;
|
||||||
|
|
||||||
Bangle.on("swipe", (_lr, ud) => {
|
Bangle.on("swipe", (_lr, ud) => {
|
||||||
if(ud! > 0){
|
if(!activeTimeout && ud! > 0){
|
||||||
listen();
|
listen();
|
||||||
Bangle.buzz();
|
Bangle.buzz(20);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
Bangle.on("drag", e => {
|
const onDrag = (e => {
|
||||||
if(!activeTimeout) return;
|
if(e.b === 0){
|
||||||
|
// released
|
||||||
|
const wasDragging = dragging;
|
||||||
|
dragging = false;
|
||||||
|
|
||||||
if(!dragging){
|
if(waitForRelease){
|
||||||
dragging = true;
|
waitForRelease = false;
|
||||||
start.x = e.x;
|
return;
|
||||||
start.y = e.y;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
const released = e.b === 0;
|
|
||||||
if(released){
|
|
||||||
const dx = end.x - start.x;
|
|
||||||
const dy = end.y - start.y;
|
|
||||||
|
|
||||||
if(Math.abs(dy) < 10){
|
|
||||||
if(dx > 40) next();
|
|
||||||
else if(dx < 40) prev();
|
|
||||||
}else if(Math.abs(dx) < 10){
|
|
||||||
if(dy > 40) down();
|
|
||||||
else if(dy < 40) up();
|
|
||||||
}else if(dx === 0 && dy === 0){
|
|
||||||
toggle();
|
|
||||||
}
|
}
|
||||||
Bangle.buzz(); // feedback event sent
|
|
||||||
|
|
||||||
listen(); // had an event, keep listening for more
|
if(!wasDragging // i.e. tap
|
||||||
|
|| (Math.abs(e.x - anchor.x) < 2 && Math.abs(e.y - anchor.y) < 2))
|
||||||
|
{
|
||||||
|
toggle();
|
||||||
|
onEvent();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(waitForRelease) return;
|
||||||
|
|
||||||
|
if(e.b && !dragging){
|
||||||
|
dragging = true;
|
||||||
|
setStart(e);
|
||||||
|
Object.assign(anchor, start);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
end.x = e.x;
|
const dx = e.x - start.x;
|
||||||
end.y = e.y;
|
const dy = e.y - start.y;
|
||||||
});
|
|
||||||
|
if(Math.abs(dy) > 25 && Math.abs(dx) > 25){
|
||||||
|
// diagonal, ignore
|
||||||
|
setStart(e);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// had a drag in a single axis
|
||||||
|
/**/ if(dx > 40) { next(); onEvent(); waitForRelease = true; }
|
||||||
|
else if(dx < -40){ prev(); onEvent(); waitForRelease = true; }
|
||||||
|
else if(dy > 30) { down(); onEvent(); setStart(e); }
|
||||||
|
else if(dy < -30){ up(); onEvent(); setStart(e); }
|
||||||
|
}) satisfies DragCallback;
|
||||||
|
|
||||||
|
const setStart = ({ x, y }: { x: number, y: number }) => {
|
||||||
|
start.x = x;
|
||||||
|
start.y = y;
|
||||||
|
};
|
||||||
|
|
||||||
|
const onEvent = () => {
|
||||||
|
Bangle.buzz(20); // feedback event sent
|
||||||
|
listen(); // had an event, keep listening for more
|
||||||
|
};
|
||||||
|
|
||||||
const listen = () => {
|
const listen = () => {
|
||||||
suspendOthers();
|
|
||||||
|
|
||||||
const wasActive = !!activeTimeout;
|
const wasActive = !!activeTimeout;
|
||||||
|
if(!wasActive){
|
||||||
|
suspendOthers();
|
||||||
|
waitForRelease = true; // wait for first touch up before accepting gestures
|
||||||
|
Bangle.on("drag", onDrag);
|
||||||
|
redraw();
|
||||||
|
}
|
||||||
|
|
||||||
clearTimeout(activeTimeout);
|
if(activeTimeout) clearTimeout(activeTimeout);
|
||||||
activeTimeout = setTimeout(() => {
|
activeTimeout = setTimeout(() => {
|
||||||
activeTimeout = undefined;
|
activeTimeout = undefined;
|
||||||
resumeOthers();
|
|
||||||
redraw();
|
|
||||||
}, 5000);
|
|
||||||
|
|
||||||
if(!wasActive) redraw();
|
Bangle.removeListener("drag", onDrag);
|
||||||
|
resumeOthers();
|
||||||
|
|
||||||
|
redraw();
|
||||||
|
}, 3000);
|
||||||
};
|
};
|
||||||
|
|
||||||
WIDGETS["hid"] = {
|
WIDGETS["hid"] = {
|
||||||
|
|
Loading…
Reference in New Issue