mirror of
https://github.com/espruino/Espruino.git
synced 2025-12-08 19:06:15 +00:00
160 lines
5.8 KiB
JavaScript
160 lines
5.8 KiB
JavaScript
(function(mode, cb) {
|
|
var options = {},
|
|
hadBackWidget = false,
|
|
b = ()=>Bangle.buzz(30);
|
|
if ("object"==typeof mode) {
|
|
options = mode;
|
|
mode = options.mode;
|
|
if (!mode) throw new Error("Missing mode in setUI({...})");
|
|
}
|
|
if (global.WIDGETS && WIDGETS.back) {
|
|
hadBackWidget = true; // if we had a back widget already, don't redraw at the end
|
|
WIDGETS.back.remove(options.back); // only redraw when removing if we don't have options.back
|
|
}
|
|
if (Bangle.btnWatches) {
|
|
Bangle.btnWatches.forEach(clearWatch);
|
|
delete Bangle.btnWatches;
|
|
}
|
|
if (Bangle.swipeHandler) {
|
|
Bangle.removeListener("swipe", Bangle.swipeHandler);
|
|
delete Bangle.swipeHandler;
|
|
}
|
|
if (Bangle.dragHandler) {
|
|
Bangle.removeListener("drag", Bangle.dragHandler);
|
|
delete Bangle.dragHandler;
|
|
}
|
|
if (Bangle.touchHandler) {
|
|
Bangle.removeListener("touch", Bangle.touchHandler);
|
|
delete Bangle.touchHandler;
|
|
}
|
|
if (Bangle.touchHandler2) {
|
|
Bangle.removeListener("touch", Bangle.touchHandler2);
|
|
delete Bangle.touchHandler2;
|
|
}
|
|
delete Bangle.uiRedraw;
|
|
delete Bangle.CLOCK;
|
|
if (Bangle.uiRemove) {
|
|
let r = Bangle.uiRemove;
|
|
delete Bangle.uiRemove; // stop recursion if setUI is called inside uiRemove
|
|
r();
|
|
}
|
|
g.reset();// reset graphics state, just in case
|
|
if (!mode) return;
|
|
|
|
if (mode=="updown") {
|
|
if (options.drag) throw new Error("Custom drag handler not supported in mode updown!")
|
|
var dy = 0;
|
|
Bangle.dragHandler = e=>{
|
|
dy += e.dy;
|
|
if (!e.b) dy=0;
|
|
while (Math.abs(dy)>32) {
|
|
if (dy>0) { dy-=32; cb(1) }
|
|
else { dy+=32; cb(-1) }
|
|
Bangle.buzz(20);
|
|
}
|
|
};
|
|
Bangle.on('drag',Bangle.dragHandler);
|
|
Bangle.touchHandler = d => {b();cb();};
|
|
Bangle.on("touch", Bangle.touchHandler);
|
|
Bangle.btnWatches = [
|
|
setWatch(function() { b();cb(); }, BTN1, {repeat:1, edge:"rising"}),
|
|
];
|
|
} else if (mode=="leftright") {
|
|
if (options.drag) throw new Error("Custom drag handler not supported in mode leftright!")
|
|
var dx = 0;
|
|
Bangle.dragHandler = e=>{
|
|
dx += e.dx;
|
|
if (!e.b) dx=0;
|
|
while (Math.abs(dx)>32) {
|
|
if (dx>0) { dx-=32; cb(1) }
|
|
else { dx+=32; cb(-1) }
|
|
Bangle.buzz(20);
|
|
}
|
|
};
|
|
Bangle.on('drag',Bangle.dragHandler);
|
|
Bangle.touchHandler = d => {b();cb();};
|
|
Bangle.on("touch", Bangle.touchHandler);
|
|
Bangle.btnWatches = [
|
|
setWatch(function() { b();cb(); }, BTN1, {repeat:1, edge:"rising"}),
|
|
];
|
|
} else if (mode=="clock") {
|
|
Bangle.CLOCK=1;
|
|
Bangle.btnWatches = [
|
|
setWatch(Bangle.showLauncher, BTN1, {repeat:1,edge:"rising"})
|
|
];
|
|
} else if (mode=="clockupdown") {
|
|
Bangle.CLOCK=1;
|
|
Bangle.touchHandler = (d,e) => {
|
|
if (e.x < 120) return;
|
|
b();cb((e.y > 88) ? 1 : -1);
|
|
};
|
|
Bangle.on("touch", Bangle.touchHandler);
|
|
Bangle.btnWatches = [
|
|
setWatch(Bangle.showLauncher, BTN1, {repeat:1,edge:"rising"})
|
|
];
|
|
} else if (mode=="custom") {
|
|
if (options.clock) {
|
|
Bangle.btnWatches = [
|
|
setWatch(Bangle.showLauncher, BTN1, {repeat:1,edge:"rising"})
|
|
];
|
|
}
|
|
} else
|
|
throw new Error("Unknown UI mode "+E.toJS(mode));
|
|
if (options.clock) Bangle.CLOCK=1;
|
|
if (options.touch) {
|
|
if (Bangle.touchHandler) // don't overwrite existing touch handler if using updown/etc (#2648)
|
|
Bangle.on("touch", Bangle.touchHandler2 = options.touch);
|
|
else
|
|
Bangle.on("touch", Bangle.touchHandler = options.touch);
|
|
}
|
|
if (options.drag) {
|
|
Bangle.dragHandler = options.drag;
|
|
Bangle.on("drag", Bangle.dragHandler);
|
|
}
|
|
if (options.swipe) {
|
|
Bangle.swipeHandler = options.swipe;
|
|
Bangle.on("swipe", Bangle.swipeHandler);
|
|
}
|
|
if ((options.btn || options.btnRelease) && !Bangle.btnWatches) Bangle.btnWatches = [];
|
|
if (options.btn) Bangle.btnWatches.push(setWatch(options.btn.bind(options), BTN1, {repeat:1,edge:"rising"}))
|
|
if (options.btnRelease) Bangle.btnWatches.push(setWatch(options.btnRelease.bind(options), BTN1, {repeat:1,edge:"falling"}))
|
|
if (options.remove) // handler for removing the UI (intervals/etc)
|
|
Bangle.uiRemove = options.remove;
|
|
if (options.redraw) // handler for redrawing the UI
|
|
Bangle.uiRedraw = options.redraw;
|
|
if (options.back) {
|
|
// only add back button handler if there's no existing watch on BTN1
|
|
if (Bangle.btnWatches===undefined)
|
|
Bangle.btnWatches = [ setWatch(function() {
|
|
Bangle.btnWatches = undefined; // watch doesn't repeat
|
|
options.back();
|
|
}, BTN1, {edge:"rising"}) ];
|
|
// if we have widgets loaded *and* visible at the top, add a back widget (see #3788)
|
|
if (global.WIDGETS && Bangle.appRect.y) {
|
|
// add our own touch handler for touching in the top left
|
|
var touchHandler = function(_,e) {
|
|
if (e.y<36 && e.x<48) {
|
|
e.handled = true;
|
|
E.stopEventPropagation(); // stop subsequent touch handlers from being called
|
|
b().then(() => options.back());
|
|
}
|
|
};
|
|
Bangle.prependListener("touch", touchHandler);
|
|
// add widget - 'remove' function will remove the widgets
|
|
WIDGETS = Object.assign({back:{ // Object.assign({back..}) ensures this is always the FIRST widget
|
|
area:"tl", width:24,
|
|
draw:e=>g.reset().setColor("#f00").drawImage(atob("GBiBAAAYAAH/gAf/4A//8B//+D///D///H/P/n+H/n8P/n4f/vwAP/wAP34f/n8P/n+H/n/P/j///D///B//+A//8Af/4AH/gAAYAA=="),e.x,e.y),
|
|
remove:function(noclear){
|
|
var w = WIDGETS.back;
|
|
if (w.area!="tl") noclear=true; // area="" is set by widget_utils.hide, so avoid drawing
|
|
Bangle.removeListener("touch", touchHandler);
|
|
if (!noclear) g.reset().clearRect({x:w.x, y:w.y, w:24,h:24});
|
|
delete WIDGETS.back;
|
|
if (!noclear) Bangle.drawWidgets();
|
|
}
|
|
}},global.WIDGETS)
|
|
if (!hadBackWidget) Bangle.drawWidgets();
|
|
}
|
|
}
|
|
})
|