kbtouch v0.02 - introduce settings for layout...

...and functionality.
pull/1781/head
thyttan 2022-05-02 01:36:24 +02:00 committed by GitHub
parent b32c71c6ec
commit cfb737e1c0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 135 additions and 22 deletions

View File

@ -1 +1,2 @@
0.01: New App!
0.02: Introduced settings to customize the layout and functionality of the keyboard.

View File

@ -2,6 +2,17 @@
A library that provides an on-screen keyboard for text input.
## Settings ( -> Apps -> kbtouch )
Text size - small or big text font. Default=Big. Suggested=Small.
Offset keyboard - display the keyboard on top, making it faster to see what character you have selected. Default=No. Suggested=Yes.
Loop around - should the keyboard highlight loop around when going past the edges? Default=Yes. Suggested=No.
One-to-one input and release to select - should the input correspond directly to discrete areas on the screen, instead of being handled by scaled relative changes in position on swipes? Default=No. Suggested=Yes.
Speed scaling - how much should a swipe move the highligt on the keyboard? Higher number corresponds to slower movement. Not applicable if using one-to-one input. Default=24. Suggested=15.
## Usage
In your app's metadata, add:

View File

@ -69,13 +69,29 @@ var KEYEXTRA = [
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) || {});
print(settings);
//settings = { "textSize": 1, "offsetKeyboard": 0, "oneToOne": 1,
// "speedScaling": 15, "loopAround": 0 /*, "releaseToSelect": 0*/};
print(settings);
// state
const R = Bangle.appRect;
var kbx = 0, kby = 0, kbdx = 0, kbdy = 0, kbShift = false, flashToggle = false;
const PX=12, PY=16, DRAGSCALE=24;
var xoff = 3, yoff = g.getHeight()-PY*4;
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");
@ -88,9 +104,9 @@ function draw() {
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("6x8:4").wrapString(text+(flashToggle?"_":" "), R.w-8);
if (l.length>2) l=l.slice(-2);
g.drawString(l.join("\n"),R.x+4,R.y+4);
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();
}
@ -104,24 +120,49 @@ function draw() {
return new Promise((resolve,reject) => {
Bangle.setUI({mode:"custom", drag:e=>{
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) {
kbx = (kbx+dx+15)%15;
kby = (kby+dy+4)%4;
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)) , 4) , 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:()=>{
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();
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();

View File

@ -1,6 +1,6 @@
{ "id": "kbtouch",
"name": "Touch keyboard",
"version":"0.01",
"version":"0.02",
"description": "A library for text input via onscreen keyboard",
"icon": "app.png",
"type":"textinput",
@ -9,6 +9,7 @@
"screenshots": [{"url":"screenshot.png"}],
"readme": "README.md",
"storage": [
{"name":"textinput","url":"lib.js"}
{"name":"textinput","url":"lib.js"},
{"name":"kbtouch.settings.js","url":"settings.js"}
]
}

59
apps/kbtouch/settings.js Normal file
View File

@ -0,0 +1,59 @@
(function(back) {
function settings() {
let settings = require('Storage').readJSON("kbtouch.settings.json", true) || {};
if (settings.textSize===undefined) settings.textSize=1;
if (settings.offsetKeyboard===undefined) settings.offsetKeyboard=0;
if (settings.loopAround===undefined) settings.loopAround=1;
if (settings.oneToOne===undefined) settings.oneToOne=0;
if (settings.speedScaling===undefined) settings.speedScaling=24;
return settings;
}
function updateSetting(setting, value) {
let settings = require('Storage').readJSON("kbtouch.settings.json", true) || {};
settings[setting] = value;
require('Storage').writeJSON("kbtouch.settings.json", settings);
}
var mainmenu = {
"" : { "title" : /*LANG*/"Touch Keyboard" },
"< Back" : back,
/*LANG*/'Text size': {
value: settings().textSize,
min: 0, max: 1,
format: v => [/*LANG*/"Small",/*LANG*/"Big"][v],
onchange: v => updateSetting("textSize", v)
},
/*LANG*/'Offset keyboard': {
value: settings().offsetKeyboard,
min: 0, max: 1,
format: v => [/*LANG*/"No",/*LANG*/"Yes"][v],
onchange: v => updateSetting("offsetKeyboard", v)
},
/*LANG*/'Loop around': {
value: settings().loopAround,
min: 0, max: 1,
format: v => [/*LANG*/"No",/*LANG*/"Yes"][v],
onchange: v => updateSetting("loopAround", v)
},
/*LANG*/'One-to-one input and release to select': {
value: settings().oneToOne,
min: 0, max: 1,
format: v => [/*LANG*/"No",/*LANG*/"Yes"][v],
onchange: v => updateSetting("oneToOne", v)
},
/*LANG*/'Speed scaling': {
value: settings().speedScaling,
min: 1, max: 24, step : 1,
format: v => v,
onchange: v => updateSetting("speedScaling", v)
}
///*LANG*/'Release to select': {
// value: 1|settings().fontSize,
// min: 0, max: 1,
// format: v => [/*LANG*/"No",/*LANG*/"Yes"][v],
// onchange: v => updateSetting("releaseToSelect", v)
//}
};
E.showMenu(mainmenu);
})