mirror of https://github.com/espruino/BangleApps
262 lines
8.5 KiB
JavaScript
262 lines
8.5 KiB
JavaScript
//Keep banglejs screen on for 100 sec at 0.55 power level for development purposes
|
|
//Bangle.setLCDTimeout(30);
|
|
//Bangle.setLCDPower(1);
|
|
|
|
exports.input = function(options) {
|
|
options = options||{};
|
|
var text = options.text;
|
|
if ("string"!=typeof text) text="";
|
|
|
|
var BGCOLOR = g.theme.bg;
|
|
var HLCOLOR = g.theme.fg;
|
|
var ABCCOLOR = g.toColor(1,0,0);//'#FF0000';
|
|
var NUMCOLOR = g.toColor(0,1,0);//'#00FF00';
|
|
var BIGFONT = '6x8:3';
|
|
var BIGFONTWIDTH = parseInt(BIGFONT.charAt(0)*parseInt(BIGFONT.charAt(-1)));
|
|
var SMALLFONT = '6x8:1';
|
|
var SMALLFONTWIDTH = parseInt(SMALLFONT.charAt(0)*parseInt(SMALLFONT.charAt(-1)));
|
|
|
|
var ABC = 'abcdefghijklmnopqrstuvwxyz'.toUpperCase();
|
|
var ABCPADDING = (g.getWidth()-6*ABC.length)/2;
|
|
|
|
var NUM = ' 1234567890!?,.- ';
|
|
var NUMHIDDEN = ' 1234567890!?,.- ';
|
|
var NUMPADDING = (g.getWidth()-6*NUM.length)/2;
|
|
|
|
var rectHeight = 40;
|
|
|
|
|
|
var delSpaceLast;
|
|
|
|
function drawAbcRow() {
|
|
g.clear();
|
|
g.setFont(SMALLFONT);
|
|
g.setColor(ABCCOLOR);
|
|
g.drawString(ABC, ABCPADDING, g.getHeight()/2);
|
|
g.fillRect(0, g.getHeight()-26, g.getWidth(), g.getHeight());
|
|
}
|
|
|
|
function drawNumRow() {
|
|
g.setFont(SMALLFONT);
|
|
g.setColor(NUMCOLOR);
|
|
g.drawString(NUM, NUMPADDING, g.getHeight()/4);
|
|
|
|
g.fillRect(NUMPADDING, g.getHeight()-rectHeight*4/3, g.getWidth()-NUMPADDING, g.getHeight()-rectHeight*2/3);
|
|
}
|
|
|
|
function updateTopString() {
|
|
"ram"
|
|
g.setColor(BGCOLOR);
|
|
g.fillRect(0,4+20,176,13+20);
|
|
g.setColor(0.2,0,0);
|
|
var rectLen = text.length<27? text.length*6:27*6;
|
|
g.fillRect(3,4+20,5+rectLen,13+20);
|
|
g.setColor(0.7,0,0);
|
|
g.fillRect(rectLen+5,4+20,rectLen+10,13+20);
|
|
g.setColor(1,1,1);
|
|
g.drawString(text.length<=27? text.substr(-27, 27) : '<- '+text.substr(-24,24), 5, 5+20);
|
|
}
|
|
|
|
drawAbcRow();
|
|
drawNumRow();
|
|
updateTopString();
|
|
|
|
var abcHL;
|
|
var abcHLPrev = -10;
|
|
var numHL;
|
|
var numHLPrev = -10;
|
|
var type = '';
|
|
var typePrev = '';
|
|
var largeCharOffset = 6;
|
|
|
|
function resetChars(char, HLPrev, typePadding, heightDivisor, rowColor) {
|
|
"ram"
|
|
// Small character in list
|
|
g.setColor(rowColor);
|
|
g.setFont(SMALLFONT);
|
|
g.drawString(char, typePadding + HLPrev*6, g.getHeight()/heightDivisor);
|
|
// Large character
|
|
g.setColor(BGCOLOR);
|
|
g.fillRect(0,g.getHeight()/3,176,g.getHeight()/3+24);
|
|
//g.drawString(charSet.charAt(HLPrev), typePadding + HLPrev*6 -largeCharOffset, g.getHeight()/3);; //Old implementation where I find the shape and place of letter to remove instead of just a rectangle.
|
|
// mark in the list
|
|
}
|
|
function showChars(char, HL, typePadding, heightDivisor) {
|
|
"ram"
|
|
// mark in the list
|
|
g.setColor(HLCOLOR);
|
|
g.setFont(SMALLFONT);
|
|
if (char != 'del' && char != 'space') g.drawString(char, typePadding + HL*6, g.getHeight()/heightDivisor);
|
|
// show new large character
|
|
g.setFont(BIGFONT);
|
|
g.drawString(char, typePadding + HL*6 -largeCharOffset, g.getHeight()/3);
|
|
g.setFont(SMALLFONT);
|
|
}
|
|
|
|
function changeCase(abcHL) {
|
|
g.setColor(BGCOLOR);
|
|
g.drawString(ABC, ABCPADDING, g.getHeight()/2);
|
|
if (ABC.charAt(abcHL) == ABC.charAt(abcHL).toUpperCase()) ABC = ABC.toLowerCase();
|
|
else ABC = ABC.toUpperCase();
|
|
g.setColor(ABCCOLOR);
|
|
g.drawString(ABC, ABCPADDING, g.getHeight()/2);
|
|
}
|
|
return new Promise((resolve,reject) => {
|
|
// Interpret touch input
|
|
Bangle.setUI({
|
|
mode: 'custom',
|
|
back: ()=>{
|
|
Bangle.setUI();
|
|
g.clearRect(Bangle.appRect);
|
|
resolve(text);
|
|
},
|
|
drag: function(event) {
|
|
|
|
// ABCDEFGHIJKLMNOPQRSTUVWXYZ
|
|
// Choose character by draging along red rectangle at bottom of screen
|
|
if (event.y >= ( g.getHeight() - 12 )) {
|
|
// Translate x-position to character
|
|
if (event.x < ABCPADDING) { abcHL = 0; }
|
|
else if (event.x >= 176-ABCPADDING) { abcHL = 25; }
|
|
else { abcHL = Math.floor((event.x-ABCPADDING)/6); }
|
|
|
|
// Datastream for development purposes
|
|
//print(event.x, event.y, event.b, ABC.charAt(abcHL), ABC.charAt(abcHLPrev));
|
|
|
|
// Unmark previous character and mark the current one...
|
|
// Handling switching between letters and numbers/punctuation
|
|
if (typePrev != 'abc') resetChars(NUM.charAt(numHLPrev), numHLPrev, NUMPADDING, 4, NUMCOLOR);
|
|
|
|
if (abcHL != abcHLPrev) {
|
|
resetChars(ABC.charAt(abcHLPrev), abcHLPrev, ABCPADDING, 2, ABCCOLOR);
|
|
showChars(ABC.charAt(abcHL), abcHL, ABCPADDING, 2);
|
|
}
|
|
// Print string at top of screen
|
|
if (event.b == 0) {
|
|
text = text + ABC.charAt(abcHL);
|
|
updateTopString();
|
|
|
|
// Autoswitching letter case
|
|
if (ABC.charAt(abcHL) == ABC.charAt(abcHL).toUpperCase()) changeCase(abcHL);
|
|
}
|
|
// Update previous character to current one
|
|
abcHLPrev = abcHL;
|
|
typePrev = 'abc';
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 12345678901234567890
|
|
// Choose number or puctuation by draging on green rectangle
|
|
else if ((event.y < ( g.getHeight() - 12 )) && (event.y > ( g.getHeight() - 52 ))) {
|
|
// Translate x-position to character
|
|
if (event.x < NUMPADDING) { numHL = 0; }
|
|
else if (event.x > 176-NUMPADDING) { numHL = NUM.length-1; }
|
|
else { numHL = Math.floor((event.x-NUMPADDING)/6); }
|
|
|
|
// Datastream for development purposes
|
|
//print(event.x, event.y, event.b, NUM.charAt(numHL), NUM.charAt(numHLPrev));
|
|
|
|
// Unmark previous character and mark the current one...
|
|
// Handling switching between letters and numbers/punctuation
|
|
if (typePrev != 'num') resetChars(ABC.charAt(abcHLPrev), abcHLPrev, ABCPADDING, 2, ABCCOLOR);
|
|
|
|
if (numHL != numHLPrev) {
|
|
resetChars(NUM.charAt(numHLPrev), numHLPrev, NUMPADDING, 4, NUMCOLOR);
|
|
showChars(NUM.charAt(numHL), numHL, NUMPADDING, 4);
|
|
}
|
|
// Print string at top of screen
|
|
if (event.b == 0) {
|
|
g.setColor(HLCOLOR);
|
|
// Backspace if releasing before list of numbers/punctuation
|
|
if (event.x < NUMPADDING) {
|
|
// show delete sign
|
|
showChars('del', 0, g.getWidth()/2 +6 -27 , 4);
|
|
delSpaceLast = 1;
|
|
text = text.slice(0, -1);
|
|
updateTopString();
|
|
//print(text);
|
|
}
|
|
// Append space if releasing after list of numbers/punctuation
|
|
else if (event.x > g.getWidth()-NUMPADDING) {
|
|
//show space sign
|
|
showChars('space', 0, g.getWidth()/2 +6 -6*3*5/2 , 4);
|
|
delSpaceLast = 1;
|
|
text = text + ' ';
|
|
updateTopString();
|
|
//print(text);
|
|
}
|
|
// Append selected number/punctuation
|
|
else {
|
|
text = text + NUMHIDDEN.charAt(numHL);
|
|
updateTopString();
|
|
|
|
// Autoswitching letter case
|
|
if ((text.charAt(text.length-1) == '.') || (text.charAt(text.length-1) == '!')) changeCase();
|
|
}
|
|
}
|
|
// Update previous character to current one
|
|
numHLPrev = numHL;
|
|
typePrev = 'num';
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Make a space or backspace by swiping right or left on screen above green rectangle
|
|
else if (event.y > 20+4) {
|
|
if (event.b == 0) {
|
|
g.setColor(HLCOLOR);
|
|
if (event.x < g.getWidth()/2) {
|
|
resetChars(ABC.charAt(abcHLPrev), abcHLPrev, ABCPADDING, 2, ABCCOLOR);
|
|
resetChars(NUM.charAt(numHLPrev), numHLPrev, NUMPADDING, 4, NUMCOLOR);
|
|
|
|
// show delete sign
|
|
showChars('del', 0, g.getWidth()/2 +6 -27 , 4);
|
|
delSpaceLast = 1;
|
|
|
|
// Backspace and draw string upper right corner
|
|
text = text.slice(0, -1);
|
|
updateTopString();
|
|
if (text.length==0) changeCase(abcHL);
|
|
//print(text, 'undid');
|
|
}
|
|
else {
|
|
resetChars(ABC.charAt(abcHLPrev), abcHLPrev, ABCPADDING, 2, ABCCOLOR);
|
|
resetChars(NUM.charAt(numHLPrev), numHLPrev, NUMPADDING, 4, NUMCOLOR);
|
|
|
|
//show space sign
|
|
showChars('space', 0, g.getWidth()/2 +6 -6*3*5/2 , 4);
|
|
delSpaceLast = 1;
|
|
|
|
// Append space and draw string upper right corner
|
|
text = text + NUMHIDDEN.charAt(0);
|
|
updateTopString();
|
|
//print(text, 'made space');
|
|
}
|
|
}
|
|
}
|
|
}
|
|
});
|
|
});
|
|
/* return new Promise((resolve,reject) => {
|
|
Bangle.setUI({mode:"custom", back:()=>{
|
|
Bangle.setUI();
|
|
g.clearRect(Bangle.appRect);
|
|
Bangle.setUI();
|
|
resolve(text);
|
|
}});
|
|
}); */
|
|
|
|
};
|