mirror of https://github.com/espruino/BangleApps
172 lines
4.4 KiB
JavaScript
172 lines
4.4 KiB
JavaScript
exports.input = function(options) {
|
|
options = options||{};
|
|
var text = options.text;
|
|
if ("string"!=typeof text) text="";
|
|
|
|
// Key Maps for Keyboard
|
|
var KEYMAPLOWER = [
|
|
"`1234567890-=\b",
|
|
"\2qwertyuiop[]\n",
|
|
"\2asdfghjkl;'#\n",
|
|
" \\zxcvbnm,./ ",
|
|
];
|
|
var KEYMAPUPPER = [
|
|
"¬!\"£$%^&*()_+\b",
|
|
"\2QWERTYUIOP{}\n",
|
|
"\2ASDFGHJKL:@~\n",
|
|
" |ZXCVBNM<>? ",
|
|
];
|
|
var KEYIMGL = Graphics.createImage(`
|
|
|
|
|
|
#
|
|
###
|
|
#####
|
|
#
|
|
#
|
|
#
|
|
#
|
|
#
|
|
#
|
|
#
|
|
#
|
|
#
|
|
#
|
|
#
|
|
#
|
|
#
|
|
`);KEYIMGL.transparent=0;
|
|
var KEYIMGR = Graphics.createImage(`
|
|
|
|
|
|
#
|
|
##
|
|
#####
|
|
##
|
|
#
|
|
|
|
|
|
|
|
###
|
|
#
|
|
#
|
|
#
|
|
#
|
|
#
|
|
#####
|
|
###
|
|
#
|
|
|
|
#`);KEYIMGR.transparent=0;
|
|
/* If a char in the keymap is >=128,
|
|
subtract 128 and look in this array for
|
|
multi-character key codes*/
|
|
var KEYEXTRA = [
|
|
String.fromCharCode(27,91,68), // 0x80 left
|
|
String.fromCharCode(27,91,67), // 0x81 right
|
|
String.fromCharCode(27,91,65), // 0x82 up
|
|
String.fromCharCode(27,91,66), // 0x83 down
|
|
String.fromCharCode(27,91,53,126), // 0x84 page up
|
|
String.fromCharCode(27,91,54,126), // 0x85 page down
|
|
];
|
|
|
|
var settings = Object.assign({
|
|
// default values
|
|
textSize: 1,
|
|
offsetKeyboard: 0,
|
|
loopAround: 1,
|
|
oneToOne: 0,
|
|
speedScaling: 24
|
|
}, require('Storage').readJSON("kbtouch.settings.json", true) || {});
|
|
|
|
// state
|
|
const R = Bangle.appRect;
|
|
var kbx = 0, kby = 0, kbdx = 0, kbdy = 0, kbShift = false, flashToggle = false;
|
|
const PX=12, PY=16, DRAGSCALE=settings.speedScaling;
|
|
var xoff = 3, yoff = g.getHeight()-PY*(4+5*settings.offsetKeyboard);
|
|
|
|
function draw() {
|
|
"ram";
|
|
var map = kbShift ? KEYMAPUPPER : KEYMAPLOWER;
|
|
//g.drawImage(KEYIMG,0,yoff);
|
|
g.reset().setFont("6x8:2");
|
|
g.clearRect(R);
|
|
if (kbx>=0)
|
|
g.setColor(g.theme.bgH).fillRect(xoff+kbx*PX,yoff+kby*PY, xoff+(kbx+1)*PX-1,yoff+(kby+1)*PY-1).setColor(g.theme.fg);
|
|
g.drawImage(KEYIMGL,xoff,yoff+PY,{scale:2});
|
|
g.drawImage(KEYIMGR,xoff+PX*13,yoff,{scale:2});
|
|
g.drawString(map[0],xoff,yoff);
|
|
g.drawString(map[1],xoff,yoff+PY);
|
|
g.drawString(map[2],xoff,yoff+PY*2);
|
|
g.drawString(map[3],xoff,yoff+PY*3);
|
|
var l = g.setFont(settings.textSize ? "6x8:4":"6x8:2").wrapString(text+(flashToggle?"_":" "), R.w-8);
|
|
if (l.length>2+2*settings.textSize) l=l.slice(-(2+2*settings.textSize));
|
|
g.drawString(l.join("\n"),R.x+4,R.y+4 +82*settings.offsetKeyboard);
|
|
|
|
g.flip();
|
|
}
|
|
g.reset().clearRect(R);
|
|
draw();
|
|
var flashInterval = setInterval(() => {
|
|
flashToggle = !flashToggle;
|
|
draw();
|
|
}, 1000);
|
|
|
|
return new Promise((resolve,reject) => {
|
|
|
|
Bangle.setUI({mode:"custom", drag:e=>{
|
|
if (settings.oneToOne) {
|
|
kbx = Math.max(Math.min(Math.floor((e.x-16) / (6*2)) , 13) , 0);
|
|
kby = Math.max(Math.min(Math.floor((e.y-120) / (8*2)) , 3) , 0);
|
|
//print(e.y, kby, e.x, kbx);
|
|
}
|
|
|
|
if (!settings.oneToOne) {
|
|
kbdx += e.dx;
|
|
kbdy += e.dy;
|
|
var dx = Math.round(kbdx/DRAGSCALE), dy = Math.round(kbdy/DRAGSCALE);
|
|
kbdx -= dx*DRAGSCALE;
|
|
kbdy -= dy*DRAGSCALE;
|
|
if (dx || dy) {
|
|
if (settings.loopAround) {
|
|
kbx = (kbx+dx+15)%15;
|
|
kby = (kby+dy+4)%4;
|
|
} else {
|
|
kbx = Math.max(Math.min((kbx+dx),13),0);
|
|
kby = Math.max(Math.min((kby+dy),3),0);
|
|
}
|
|
}
|
|
}
|
|
draw();
|
|
|
|
if (!e.b && e.y>Bangle.appRect.y && settings.oneToOne /*&& settings.releaseToSelect*/) {
|
|
var map = kbShift ? KEYMAPUPPER : KEYMAPLOWER;
|
|
var ch = map[kby][kbx];
|
|
if (ch=="\2") kbShift=!kbShift;
|
|
else if (ch=="\b") text = text.slice(0,-1);
|
|
else text += ch;
|
|
Bangle.buzz(20);
|
|
draw();
|
|
}
|
|
},touch:()=>{
|
|
if ( !settings.oneToOne /*|| !settings.releaseToSelect*/) {
|
|
var map = kbShift ? KEYMAPUPPER : KEYMAPLOWER;
|
|
var ch = map[kby][kbx];
|
|
if (ch=="\2") kbShift=!kbShift;
|
|
else if (ch=="\b") text = text.slice(0,-1);
|
|
else text += ch;
|
|
Bangle.buzz(20);
|
|
draw();
|
|
}
|
|
},back:()=>{
|
|
clearInterval(flashInterval);
|
|
Bangle.setUI();
|
|
Bangle.prependListener&&Bangle.removeListener('swipe', catchSwipe); // Remove swipe lister if it was added with `Bangle.prependListener()` (fw2v19 and up).
|
|
g.clearRect(Bangle.appRect);
|
|
resolve(text);
|
|
}});
|
|
let catchSwipe = ()=>{E.stopEventPropagation&&E.stopEventPropagation();};
|
|
Bangle.prependListener&&Bangle.prependListener('swipe', catchSwipe); // Intercept swipes on fw2v19 and later. Should not break on older firmwares.
|
|
});
|
|
};
|