From 24634330a50a64c07e9e1f7f6dafb70e9883bb44 Mon Sep 17 00:00:00 2001 From: thyttan <97237430+thyttan@users.noreply.github.com> Date: Wed, 11 May 2022 17:56:36 +0200 Subject: [PATCH 01/28] Update ChangeLog --- apps/kbmulti/ChangeLog | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/kbmulti/ChangeLog b/apps/kbmulti/ChangeLog index 04b2430bb..894a609ec 100644 --- a/apps/kbmulti/ChangeLog +++ b/apps/kbmulti/ChangeLog @@ -1 +1,2 @@ 0.01: New keyboard +0.02: Introduce setting "Show help button". Remove the firstLaunch setting from settings.js. From da2aaaf16dd963d23d8be211bb8b55931f5c05b4 Mon Sep 17 00:00:00 2001 From: thyttan <97237430+thyttan@users.noreply.github.com> Date: Wed, 11 May 2022 18:21:20 +0200 Subject: [PATCH 02/28] Update settings.js --- apps/kbmulti/settings.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/kbmulti/settings.js b/apps/kbmulti/settings.js index d3148eca7..c698aca8a 100644 --- a/apps/kbmulti/settings.js +++ b/apps/kbmulti/settings.js @@ -21,11 +21,11 @@ format: v => v, onchange: v => updateSetting("charTimeout", v), }, - /*LANG*/'Show help on first launch': { - value: !!settings().firstLaunch, + /*LANG*/'Show help button': { + value: !!settings().showHelpBtn, format: v => v?"Yes":"No", - onchange: v => updateSetting("firstLaunch", v) + onchange: v => updateSetting("showHelpBtn", v) } }; E.showMenu(mainmenu); - }) \ No newline at end of file + }) From 824ab9859ec524be2ebc4c7a7fc1021199938b54 Mon Sep 17 00:00:00 2001 From: thyttan <97237430+thyttan@users.noreply.github.com> Date: Wed, 11 May 2022 18:21:47 +0200 Subject: [PATCH 03/28] Update metadata.json --- apps/kbmulti/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/kbmulti/metadata.json b/apps/kbmulti/metadata.json index 6c813e321..1efdb8847 100644 --- a/apps/kbmulti/metadata.json +++ b/apps/kbmulti/metadata.json @@ -1,6 +1,6 @@ { "id": "kbmulti", "name": "Multitap keyboard", - "version":"0.01", + "version":"0.02", "description": "A library for text input via multitap/T9 style keypad", "icon": "app.png", "type":"textinput", From 87756ece9ef8fec132409303756d0ab3e0d371c2 Mon Sep 17 00:00:00 2001 From: thyttan <97237430+thyttan@users.noreply.github.com> Date: Wed, 11 May 2022 18:23:31 +0200 Subject: [PATCH 04/28] Update lib.js --- apps/kbmulti/lib.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/apps/kbmulti/lib.js b/apps/kbmulti/lib.js index 79c2d861a..ff987c2cc 100644 --- a/apps/kbmulti/lib.js +++ b/apps/kbmulti/lib.js @@ -6,8 +6,9 @@ exports.input = function(options) { if ("string"!=typeof text) text=""; var settings = require('Storage').readJSON("kbmulti.settings.json", true) || {}; - if (settings.firstLaunch===undefined) { settings.firstLaunch = true; } + //if (settings.firstLaunch===undefined) { settings.firstLaunch = true; } if (settings.charTimeout===undefined) { settings.charTimeout = 500; } + if (settings.showHelpBtn===undefined) { settings.showHelpBtn = true; } var fontSize = "6x15"; var Layout = require("Layout"); @@ -104,7 +105,7 @@ exports.input = function(options) { type:"v", c: [ {type:"h", c: [ {type:"txt", font:"12x20", label:text.slice(-12), id:"text", fillx:1}, - {type:"btn", font:'6x8', label:'?', cb: l=>onHelp(resolve,reject), filly:1 }, + (settings.showHelpBtn ? {type:"btn", font:'6x8', label:'?', cb: l=>onHelp(resolve,reject), filly:1 } : {}), ]}, {type:"h", c: [ {type:"btn", font:fontSize, label:letters[1], cb: l=>onKeyPad(1), id:'1', fillx:1, filly:1 }, @@ -132,7 +133,7 @@ exports.input = function(options) { return new Promise((resolve,reject) => { g.clearRect(Bangle.appRect); - if (settings.firstLaunch) { + if (!settings.firstLaunch) { onHelp(resolve,reject); settings.firstLaunch = false; require('Storage').writeJSON("kbmulti.settings.json", settings); From d6db4e6be355486fbee91a6ae0b83e81b285e6df Mon Sep 17 00:00:00 2001 From: thyttan <97237430+thyttan@users.noreply.github.com> Date: Wed, 11 May 2022 19:49:40 +0200 Subject: [PATCH 05/28] Update lib.js --- apps/kbmulti/lib.js | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/apps/kbmulti/lib.js b/apps/kbmulti/lib.js index ff987c2cc..052fd86a1 100644 --- a/apps/kbmulti/lib.js +++ b/apps/kbmulti/lib.js @@ -1,14 +1,14 @@ //Multitap logic originally from here: http://www.espruino.com/Morse+Code+Texting exports.input = function(options) { - options = options||{}; + var options = options||{}; var text = options.text; if ("string"!=typeof text) text=""; var settings = require('Storage').readJSON("kbmulti.settings.json", true) || {}; //if (settings.firstLaunch===undefined) { settings.firstLaunch = true; } if (settings.charTimeout===undefined) { settings.charTimeout = 500; } - if (settings.showHelpBtn===undefined) { settings.showHelpBtn = true; } + if (settings.showHelpBtn===undefined) { settings.showHelpBtn = false; } var fontSize = "6x15"; var Layout = require("Layout"); @@ -25,9 +25,9 @@ exports.input = function(options) { var caps = true; var layout; - function displayText() { + function displayText(charTimeout) { layout.clear(layout.text); - layout.text.label = text.slice(-12); + layout.text.label = text.slice(settings.showHelpBtn ? -12 : -13) + (charTimeout ? " " : "_"); layout.render(layout.text); } @@ -70,12 +70,12 @@ exports.input = function(options) { } var newLetter = letters[charCurrent][charIndex]; text += (caps ? newLetter.toUpperCase() : newLetter.toLowerCase()); - displayText(); // set a timeout charTimeout = setTimeout(function() { charTimeout = undefined; newCharacter(); }, settings.charTimeout); + displayText(charTimeout); } function onSwipe(dirLeftRight, dirUpDown) { @@ -139,6 +139,7 @@ exports.input = function(options) { require('Storage').writeJSON("kbmulti.settings.json", settings); } else { generateLayout(resolve,reject); + displayText(false); Bangle.on('swipe', onSwipe); layout.render(); } From b34a3415b9b9e1a85a1fb25d5a156d80310e00e1 Mon Sep 17 00:00:00 2001 From: thyttan <97237430+thyttan@users.noreply.github.com> Date: Wed, 11 May 2022 19:54:37 +0200 Subject: [PATCH 06/28] Update ChangeLog --- apps/kbmulti/ChangeLog | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/kbmulti/ChangeLog b/apps/kbmulti/ChangeLog index 894a609ec..191517b30 100644 --- a/apps/kbmulti/ChangeLog +++ b/apps/kbmulti/ChangeLog @@ -1,2 +1,2 @@ 0.01: New keyboard -0.02: Introduce setting "Show help button". Remove the firstLaunch setting from settings.js. +0.02: Introduce setting "Show help button". Make setting firstLaunch invisible by removing corresponding code from settings.js. Add marker that shows when character selection timeout has run out. From 7b1bcd8b76dbc1da8b8db937546d46a021bdd0ca Mon Sep 17 00:00:00 2001 From: thyttan <97237430+thyttan@users.noreply.github.com> Date: Wed, 11 May 2022 20:01:49 +0200 Subject: [PATCH 07/28] Update lib.js --- apps/kbmulti/lib.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/kbmulti/lib.js b/apps/kbmulti/lib.js index 052fd86a1..d578a81b0 100644 --- a/apps/kbmulti/lib.js +++ b/apps/kbmulti/lib.js @@ -6,7 +6,7 @@ exports.input = function(options) { if ("string"!=typeof text) text=""; var settings = require('Storage').readJSON("kbmulti.settings.json", true) || {}; - //if (settings.firstLaunch===undefined) { settings.firstLaunch = true; } + if (settings.firstLaunch===undefined) { settings.firstLaunch = true; } if (settings.charTimeout===undefined) { settings.charTimeout = 500; } if (settings.showHelpBtn===undefined) { settings.showHelpBtn = false; } @@ -133,13 +133,13 @@ exports.input = function(options) { return new Promise((resolve,reject) => { g.clearRect(Bangle.appRect); - if (!settings.firstLaunch) { + if (settings.firstLaunch==true) { onHelp(resolve,reject); settings.firstLaunch = false; require('Storage').writeJSON("kbmulti.settings.json", settings); } else { generateLayout(resolve,reject); - displayText(false); + displayText(true); Bangle.on('swipe', onSwipe); layout.render(); } From 8eefdaa706eb560a4cfd9a12d97080ec45a4fbc6 Mon Sep 17 00:00:00 2001 From: thyttan <97237430+thyttan@users.noreply.github.com> Date: Wed, 11 May 2022 20:11:08 +0200 Subject: [PATCH 08/28] Update lib.js --- apps/kbmulti/lib.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/kbmulti/lib.js b/apps/kbmulti/lib.js index d578a81b0..8dd92d6f3 100644 --- a/apps/kbmulti/lib.js +++ b/apps/kbmulti/lib.js @@ -1,7 +1,7 @@ //Multitap logic originally from here: http://www.espruino.com/Morse+Code+Texting exports.input = function(options) { - var options = options||{}; + options = options||{}; var text = options.text; if ("string"!=typeof text) text=""; From ad63cafec6dfb12a69dddb6397b93ef77a0bfff3 Mon Sep 17 00:00:00 2001 From: thyttan <97237430+thyttan@users.noreply.github.com> Date: Wed, 11 May 2022 20:14:37 +0200 Subject: [PATCH 09/28] Update lib.js --- apps/kbmulti/lib.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/kbmulti/lib.js b/apps/kbmulti/lib.js index 8dd92d6f3..54d600fcb 100644 --- a/apps/kbmulti/lib.js +++ b/apps/kbmulti/lib.js @@ -6,7 +6,7 @@ exports.input = function(options) { if ("string"!=typeof text) text=""; var settings = require('Storage').readJSON("kbmulti.settings.json", true) || {}; - if (settings.firstLaunch===undefined) { settings.firstLaunch = true; } + //if (settings.firstLaunch===undefined) { settings.firstLaunch = true; } if (settings.charTimeout===undefined) { settings.charTimeout = 500; } if (settings.showHelpBtn===undefined) { settings.showHelpBtn = false; } @@ -133,7 +133,7 @@ exports.input = function(options) { return new Promise((resolve,reject) => { g.clearRect(Bangle.appRect); - if (settings.firstLaunch==true) { + if (!settings.firstLaunch) { onHelp(resolve,reject); settings.firstLaunch = false; require('Storage').writeJSON("kbmulti.settings.json", settings); From 8dec7e503be0a22ef2c2f66e99e86b1ec9e5ce97 Mon Sep 17 00:00:00 2001 From: thyttan <97237430+thyttan@users.noreply.github.com> Date: Wed, 11 May 2022 20:17:15 +0200 Subject: [PATCH 10/28] Update lib.js --- apps/kbmulti/lib.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/kbmulti/lib.js b/apps/kbmulti/lib.js index 54d600fcb..b0d6ae3eb 100644 --- a/apps/kbmulti/lib.js +++ b/apps/kbmulti/lib.js @@ -8,7 +8,7 @@ exports.input = function(options) { var settings = require('Storage').readJSON("kbmulti.settings.json", true) || {}; //if (settings.firstLaunch===undefined) { settings.firstLaunch = true; } if (settings.charTimeout===undefined) { settings.charTimeout = 500; } - if (settings.showHelpBtn===undefined) { settings.showHelpBtn = false; } + if (settings.showHelpBtn===undefined) { settings.showHelpBtn = true; } var fontSize = "6x15"; var Layout = require("Layout"); From c8b1d166973aa47c3c1f46e497181261a4b511c6 Mon Sep 17 00:00:00 2001 From: thyttan <97237430+thyttan@users.noreply.github.com> Date: Wed, 11 May 2022 20:18:09 +0200 Subject: [PATCH 11/28] Update lib.js --- apps/kbmulti/lib.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/kbmulti/lib.js b/apps/kbmulti/lib.js index b0d6ae3eb..da3894f0b 100644 --- a/apps/kbmulti/lib.js +++ b/apps/kbmulti/lib.js @@ -27,7 +27,7 @@ exports.input = function(options) { function displayText(charTimeout) { layout.clear(layout.text); - layout.text.label = text.slice(settings.showHelpBtn ? -12 : -13) + (charTimeout ? " " : "_"); + layout.text.label = text.slice(settings.showHelpBtn ? -11 : -13) + (charTimeout ? " " : "_"); layout.render(layout.text); } From efa1254673a84231f5a997dfc1a74609777aaed8 Mon Sep 17 00:00:00 2001 From: thyttan <97237430+thyttan@users.noreply.github.com> Date: Wed, 11 May 2022 20:24:30 +0200 Subject: [PATCH 12/28] Update lib.js --- apps/kbmulti/lib.js | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/kbmulti/lib.js b/apps/kbmulti/lib.js index da3894f0b..f1f706216 100644 --- a/apps/kbmulti/lib.js +++ b/apps/kbmulti/lib.js @@ -124,6 +124,7 @@ exports.input = function(options) { ]}, ] },{back: ()=>{ + charTimeout = undefined; Bangle.setUI(); Bangle.removeListener("swipe", onSwipe); g.clearRect(Bangle.appRect); From 7c747889ab718731b4c2bc7edd14e56df9bfbab4 Mon Sep 17 00:00:00 2001 From: thyttan <97237430+thyttan@users.noreply.github.com> Date: Wed, 11 May 2022 20:38:41 +0200 Subject: [PATCH 13/28] Update lib.js --- apps/kbmulti/lib.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/kbmulti/lib.js b/apps/kbmulti/lib.js index f1f706216..0d5b73d5f 100644 --- a/apps/kbmulti/lib.js +++ b/apps/kbmulti/lib.js @@ -6,7 +6,7 @@ exports.input = function(options) { if ("string"!=typeof text) text=""; var settings = require('Storage').readJSON("kbmulti.settings.json", true) || {}; - //if (settings.firstLaunch===undefined) { settings.firstLaunch = true; } + //if (settings.firstLaunch===undefined) { settings.firstLaunch = true; } // Unnecessary if doing if(!settings.firstLaunch) down inside the promise. But maybe it's good to keep it as in v0.01 for readability? if (settings.charTimeout===undefined) { settings.charTimeout = 500; } if (settings.showHelpBtn===undefined) { settings.showHelpBtn = true; } @@ -27,7 +27,7 @@ exports.input = function(options) { function displayText(charTimeout) { layout.clear(layout.text); - layout.text.label = text.slice(settings.showHelpBtn ? -11 : -13) + (charTimeout ? " " : "_"); + layout.text.label = text.slice(settings.showHelpBtn ? -11 : -13) + (charTimeout ? " " : "_"); // Implemented marker here. layout.render(layout.text); } @@ -124,7 +124,7 @@ exports.input = function(options) { ]}, ] },{back: ()=>{ - charTimeout = undefined; + // charTimeout = undefined; // Tried this to see if it would stop the text from being drawn after closing keyboard when doing it too soon after pressing a key. It didn't help. This problem goes back to how I've implemented the marker above. Bangle.setUI(); Bangle.removeListener("swipe", onSwipe); g.clearRect(Bangle.appRect); From c4647bfc68c45ef9e3627785c2673cd3041cf320 Mon Sep 17 00:00:00 2001 From: thyttan <97237430+thyttan@users.noreply.github.com> Date: Wed, 11 May 2022 20:43:01 +0200 Subject: [PATCH 14/28] Update settings.js --- apps/kbmulti/settings.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/kbmulti/settings.js b/apps/kbmulti/settings.js index c698aca8a..4fad8a428 100644 --- a/apps/kbmulti/settings.js +++ b/apps/kbmulti/settings.js @@ -1,7 +1,7 @@ (function(back) { function settings() { var settings = require('Storage').readJSON("kbmulti.settings.json", true) || {}; - if (settings.firstLaunch===undefined) { settings.firstLaunch = true; } + if (settings.showHelpBtn===undefined) { settings.firstLaunch = true; } if (settings.charTimeout===undefined) { settings.charTimeout = 500; } return settings; } From cb6d46d9c8aa787296e21c07c1055ad322ab498d Mon Sep 17 00:00:00 2001 From: thyttan <97237430+thyttan@users.noreply.github.com> Date: Wed, 11 May 2022 20:50:02 +0200 Subject: [PATCH 15/28] Update lib.js --- apps/kbmulti/lib.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/kbmulti/lib.js b/apps/kbmulti/lib.js index 0d5b73d5f..2d38539e8 100644 --- a/apps/kbmulti/lib.js +++ b/apps/kbmulti/lib.js @@ -6,7 +6,7 @@ exports.input = function(options) { if ("string"!=typeof text) text=""; var settings = require('Storage').readJSON("kbmulti.settings.json", true) || {}; - //if (settings.firstLaunch===undefined) { settings.firstLaunch = true; } // Unnecessary if doing if(!settings.firstLaunch) down inside the promise. But maybe it's good to keep it as in v0.01 for readability? + if (settings.firstLaunch===undefined) { settings.firstLaunch = true; } if (settings.charTimeout===undefined) { settings.charTimeout = 500; } if (settings.showHelpBtn===undefined) { settings.showHelpBtn = true; } @@ -134,7 +134,7 @@ exports.input = function(options) { return new Promise((resolve,reject) => { g.clearRect(Bangle.appRect); - if (!settings.firstLaunch) { + if (settings.firstLaunch) { onHelp(resolve,reject); settings.firstLaunch = false; require('Storage').writeJSON("kbmulti.settings.json", settings); From 04679ba3243b2686be809a7d9af1525cbbb42636 Mon Sep 17 00:00:00 2001 From: thyttan <97237430+thyttan@users.noreply.github.com> Date: Wed, 11 May 2022 20:55:11 +0200 Subject: [PATCH 16/28] Update settings.js --- apps/kbmulti/settings.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/kbmulti/settings.js b/apps/kbmulti/settings.js index 4fad8a428..ab0e26806 100644 --- a/apps/kbmulti/settings.js +++ b/apps/kbmulti/settings.js @@ -1,7 +1,7 @@ (function(back) { function settings() { var settings = require('Storage').readJSON("kbmulti.settings.json", true) || {}; - if (settings.showHelpBtn===undefined) { settings.firstLaunch = true; } + if (settings.showHelpBtn===undefined) { settings.showHelpBtn = true; } if (settings.charTimeout===undefined) { settings.charTimeout = 500; } return settings; } From 28c6103242a0ad6a168cf43de5314b6c2b82fb03 Mon Sep 17 00:00:00 2001 From: thyttan <97237430+thyttan@users.noreply.github.com> Date: Wed, 11 May 2022 20:55:54 +0200 Subject: [PATCH 17/28] Update settings.js --- apps/kbmulti/settings.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/kbmulti/settings.js b/apps/kbmulti/settings.js index ab0e26806..8a66cd8f0 100644 --- a/apps/kbmulti/settings.js +++ b/apps/kbmulti/settings.js @@ -21,7 +21,7 @@ format: v => v, onchange: v => updateSetting("charTimeout", v), }, - /*LANG*/'Show help button': { + /*LANG*/'Show help button?': { value: !!settings().showHelpBtn, format: v => v?"Yes":"No", onchange: v => updateSetting("showHelpBtn", v) From 4f296ac43438e8ca744b3556e262e55b75bc9788 Mon Sep 17 00:00:00 2001 From: thyttan <97237430+thyttan@users.noreply.github.com> Date: Wed, 11 May 2022 20:59:49 +0200 Subject: [PATCH 18/28] Update ChangeLog --- apps/kbmulti/ChangeLog | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/kbmulti/ChangeLog b/apps/kbmulti/ChangeLog index 191517b30..4d2380bfa 100644 --- a/apps/kbmulti/ChangeLog +++ b/apps/kbmulti/ChangeLog @@ -1,2 +1,2 @@ 0.01: New keyboard -0.02: Introduce setting "Show help button". Make setting firstLaunch invisible by removing corresponding code from settings.js. Add marker that shows when character selection timeout has run out. +0.02: Introduce setting "Show help button". Make setting firstLaunch invisible by removing corresponding code from settings.js. Add marker that shows when character selection timeout has run out. Display opened text on launch when editing existing text string. From 8fae68bccc2271c2c9c1e77e6e647631874fabd3 Mon Sep 17 00:00:00 2001 From: thyttan <97237430+thyttan@users.noreply.github.com> Date: Wed, 11 May 2022 21:19:09 +0200 Subject: [PATCH 19/28] Update ChangeLog --- apps/kbmulti/ChangeLog | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/kbmulti/ChangeLog b/apps/kbmulti/ChangeLog index 4d2380bfa..c6c606bff 100644 --- a/apps/kbmulti/ChangeLog +++ b/apps/kbmulti/ChangeLog @@ -1,2 +1,2 @@ 0.01: New keyboard -0.02: Introduce setting "Show help button". Make setting firstLaunch invisible by removing corresponding code from settings.js. Add marker that shows when character selection timeout has run out. Display opened text on launch when editing existing text string. +0.02: Introduce setting "Show help button?". Make setting firstLaunch invisible by removing corresponding code from settings.js. Add marker that shows when character selection timeout has run out. Display opened text on launch when editing existing text string. From 1b993fb09987043f6e124f794fa50c264d3a5b4c Mon Sep 17 00:00:00 2001 From: thyttan <97237430+thyttan@users.noreply.github.com> Date: Sun, 15 May 2022 00:24:18 +0200 Subject: [PATCH 20/28] Update lib.js --- apps/kbmulti/lib.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/kbmulti/lib.js b/apps/kbmulti/lib.js index 2d38539e8..d06e2bb7d 100644 --- a/apps/kbmulti/lib.js +++ b/apps/kbmulti/lib.js @@ -17,7 +17,7 @@ exports.input = function(options) { "4":"GHI4","5":"JKL5","6":"MNO6", "7":"PQRS7","8":"TUV80","9":"WXYZ9", }; - var helpMessage = 'swipe:\nRight: Space\nLeft:Backspace\nUp/Down: Caps lock\n'; + var helpMessage = 'Swipe:\nRight: Space\nLeft:Backspace\nUp/Down: Caps lock\n'; var charTimeout; // timeout after a key is pressed var charCurrent; // current character (index in letters) From 4415325703bdc111848d4e734169f37caa363a0c Mon Sep 17 00:00:00 2001 From: thyttan <97237430+thyttan@users.noreply.github.com> Date: Sun, 15 May 2022 11:52:07 +0200 Subject: [PATCH 21/28] Update lib.js --- apps/kbmulti/lib.js | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/apps/kbmulti/lib.js b/apps/kbmulti/lib.js index d06e2bb7d..db18948b8 100644 --- a/apps/kbmulti/lib.js +++ b/apps/kbmulti/lib.js @@ -25,18 +25,21 @@ exports.input = function(options) { var caps = true; var layout; - function displayText(charTimeout) { + function displayText(hideMarker) { layout.clear(layout.text); - layout.text.label = text.slice(settings.showHelpBtn ? -11 : -13) + (charTimeout ? " " : "_"); // Implemented marker here. + layout.text.label = text.slice(settings.showHelpBtn ? -11 : -13) + (!hideMarker ? "_" : " "); layout.render(layout.text); } - function backspace() { - // remove the timeout if we had one + function deactivateTimeout(charTimeout) { if (charTimeout!==undefined) { clearTimeout(charTimeout); charTimeout = undefined; } + } + + function backspace() { + deactivateTimeout(charTimeout); text = text.slice(0, -1); newCharacter(); } @@ -56,11 +59,7 @@ exports.input = function(options) { } function onKeyPad(key) { - // remove the timeout if we had one - if (charTimeout!==undefined) { - clearTimeout(charTimeout); - charTimeout = undefined; - } + deactivateTimeout(charTimeout); // work out which char was pressed if (key==charCurrent) { charIndex = (charIndex+1) % letters[charCurrent].length; @@ -124,7 +123,7 @@ exports.input = function(options) { ]}, ] },{back: ()=>{ - // charTimeout = undefined; // Tried this to see if it would stop the text from being drawn after closing keyboard when doing it too soon after pressing a key. It didn't help. This problem goes back to how I've implemented the marker above. + deactivateTimeout(charTimeout); Bangle.setUI(); Bangle.removeListener("swipe", onSwipe); g.clearRect(Bangle.appRect); @@ -134,13 +133,13 @@ exports.input = function(options) { return new Promise((resolve,reject) => { g.clearRect(Bangle.appRect); - if (settings.firstLaunch) { - onHelp(resolve,reject); + if (settings.firstLaunch) { + onHelp(resolve,reject); settings.firstLaunch = false; require('Storage').writeJSON("kbmulti.settings.json", settings); } else { generateLayout(resolve,reject); - displayText(true); + displayText(false); Bangle.on('swipe', onSwipe); layout.render(); } From 29be42c6063ecfc505c55bb8e987597d2ba24748 Mon Sep 17 00:00:00 2001 From: thyttan <97237430+thyttan@users.noreply.github.com> Date: Sun, 15 May 2022 11:53:51 +0200 Subject: [PATCH 22/28] Update lib.js --- apps/kbmulti/lib.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/kbmulti/lib.js b/apps/kbmulti/lib.js index db18948b8..c8abf98b4 100644 --- a/apps/kbmulti/lib.js +++ b/apps/kbmulti/lib.js @@ -27,7 +27,7 @@ exports.input = function(options) { function displayText(hideMarker) { layout.clear(layout.text); - layout.text.label = text.slice(settings.showHelpBtn ? -11 : -13) + (!hideMarker ? "_" : " "); + layout.text.label = text.slice(settings.showHelpBtn ? -11 : -13) + (hideMarker ? " " : "_"); layout.render(layout.text); } From 134a9e2369c0a5f82abed9208c58ef3ca3a21992 Mon Sep 17 00:00:00 2001 From: thyttan <97237430+thyttan@users.noreply.github.com> Date: Sun, 15 May 2022 12:19:29 +0200 Subject: [PATCH 23/28] Update README.md --- apps/kbmulti/README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/kbmulti/README.md b/apps/kbmulti/README.md index d40b2dd07..4c83d378e 100644 --- a/apps/kbmulti/README.md +++ b/apps/kbmulti/README.md @@ -10,7 +10,8 @@ Uses the multitap keypad logic originally from here: http://www.espruino.com/Mor ![](screenshot_1.png) ![](screenshot_2.png) +![](screenshot_3.png) Written by: [Sir Indy](https://github.com/sir-indy) and [Thyttan](https://github.com/thyttan) -For support and discussion please post in the [Bangle JS Forum](http://forum.espruino.com/microcosms/1424/) \ No newline at end of file +For support and discussion please post in the [Bangle JS Forum](http://forum.espruino.com/microcosms/1424/) From 5e564db73186325732b1a92859d8a6a6599641b8 Mon Sep 17 00:00:00 2001 From: thyttan <97237430+thyttan@users.noreply.github.com> Date: Sun, 15 May 2022 12:23:29 +0200 Subject: [PATCH 24/28] Add files via upload --- apps/kbmulti/screenshot_3.png | Bin 0 -> 3674 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/kbmulti/screenshot_3.png diff --git a/apps/kbmulti/screenshot_3.png b/apps/kbmulti/screenshot_3.png new file mode 100644 index 0000000000000000000000000000000000000000..e0da184baa34c29285e7cd5b76d93638450a6cf4 GIT binary patch literal 3674 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 literal 0 HcmV?d00001 From 275f6a87d5e043a37baafb1644e96f3c9e33b318 Mon Sep 17 00:00:00 2001 From: thyttan <97237430+thyttan@users.noreply.github.com> Date: Mon, 16 May 2022 11:51:59 +0200 Subject: [PATCH 25/28] add fixed and equal button width for all buttons replaced fillx:1 with width:btnWidth --- apps/kbmulti/lib.js | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/apps/kbmulti/lib.js b/apps/kbmulti/lib.js index c8abf98b4..b099603cb 100644 --- a/apps/kbmulti/lib.js +++ b/apps/kbmulti/lib.js @@ -24,6 +24,7 @@ exports.input = function(options) { var charIndex; // index in letters[charCurrent] var caps = true; var layout; + var btnWidth = g.getWidth()/3 function displayText(hideMarker) { layout.clear(layout.text); @@ -107,19 +108,19 @@ exports.input = function(options) { (settings.showHelpBtn ? {type:"btn", font:'6x8', label:'?', cb: l=>onHelp(resolve,reject), filly:1 } : {}), ]}, {type:"h", c: [ - {type:"btn", font:fontSize, label:letters[1], cb: l=>onKeyPad(1), id:'1', fillx:1, filly:1 }, - {type:"btn", font:fontSize, label:letters[2], cb: l=>onKeyPad(2), id:'2', fillx:1, filly:1 }, - {type:"btn", font:fontSize, label:letters[3], cb: l=>onKeyPad(3), id:'3', fillx:1, filly:1 }, + {type:"btn", font:fontSize, label:letters[1], cb: l=>onKeyPad(1), id:'1', width:btnWidth, filly:1 }, + {type:"btn", font:fontSize, label:letters[2], cb: l=>onKeyPad(2), id:'2', width:btnWidth, filly:1 }, + {type:"btn", font:fontSize, label:letters[3], cb: l=>onKeyPad(3), id:'3', width:btnWidth, filly:1 }, ]}, {type:"h", filly:1, c: [ - {type:"btn", font:fontSize, label:letters[4], cb: l=>onKeyPad(4), id:'4', fillx:1, filly:1 }, - {type:"btn", font:fontSize, label:letters[5], cb: l=>onKeyPad(5), id:'5', fillx:1, filly:1 }, - {type:"btn", font:fontSize, label:letters[6], cb: l=>onKeyPad(6), id:'6', fillx:1, filly:1 }, + {type:"btn", font:fontSize, label:letters[4], cb: l=>onKeyPad(4), id:'4', width:btnWidth, filly:1 }, + {type:"btn", font:fontSize, label:letters[5], cb: l=>onKeyPad(5), id:'5', width:btnWidth, filly:1 }, + {type:"btn", font:fontSize, label:letters[6], cb: l=>onKeyPad(6), id:'6', width:btnWidth, filly:1 }, ]}, {type:"h", filly:1, c: [ - {type:"btn", font:fontSize, label:letters[7], cb: l=>onKeyPad(7), id:'7', fillx:1, filly:1 }, - {type:"btn", font:fontSize, label:letters[8], cb: l=>onKeyPad(8), id:'8', fillx:1, filly:1 }, - {type:"btn", font:fontSize, label:letters[9], cb: l=>onKeyPad(9), id:'9', fillx:1, filly:1 }, + {type:"btn", font:fontSize, label:letters[7], cb: l=>onKeyPad(7), id:'7', width:btnWidth, filly:1 }, + {type:"btn", font:fontSize, label:letters[8], cb: l=>onKeyPad(8), id:'8', width:btnWidth, filly:1 }, + {type:"btn", font:fontSize, label:letters[9], cb: l=>onKeyPad(9), id:'9', width:btnWidth, filly:1 }, ]}, ] },{back: ()=>{ From 9a98a518dea0f8ce6a36f37f632eb07d5e8000fb Mon Sep 17 00:00:00 2001 From: thyttan <97237430+thyttan@users.noreply.github.com> Date: Mon, 16 May 2022 11:52:59 +0200 Subject: [PATCH 26/28] Update lib.js --- apps/kbmulti/lib.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/kbmulti/lib.js b/apps/kbmulti/lib.js index b099603cb..5ccab4204 100644 --- a/apps/kbmulti/lib.js +++ b/apps/kbmulti/lib.js @@ -115,7 +115,7 @@ exports.input = function(options) { {type:"h", filly:1, c: [ {type:"btn", font:fontSize, label:letters[4], cb: l=>onKeyPad(4), id:'4', width:btnWidth, filly:1 }, {type:"btn", font:fontSize, label:letters[5], cb: l=>onKeyPad(5), id:'5', width:btnWidth, filly:1 }, - {type:"btn", font:fontSize, label:letters[6], cb: l=>onKeyPad(6), id:'6', width:btnWidth, filly:1 }, + {type:"btn", font:fontSize, label:letters[6], cb: l=>onKeyPad(6), id:'6', width:btnWidth, filly:1 }, ]}, {type:"h", filly:1, c: [ {type:"btn", font:fontSize, label:letters[7], cb: l=>onKeyPad(7), id:'7', width:btnWidth, filly:1 }, From fd35af1bd67cae273d1278961328e16db80346be Mon Sep 17 00:00:00 2001 From: thyttan <97237430+thyttan@users.noreply.github.com> Date: Mon, 16 May 2022 12:34:46 +0200 Subject: [PATCH 27/28] Update ChangeLog --- apps/kbmulti/ChangeLog | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/kbmulti/ChangeLog b/apps/kbmulti/ChangeLog index c6c606bff..709aa3203 100644 --- a/apps/kbmulti/ChangeLog +++ b/apps/kbmulti/ChangeLog @@ -1,2 +1,2 @@ 0.01: New keyboard -0.02: Introduce setting "Show help button?". Make setting firstLaunch invisible by removing corresponding code from settings.js. Add marker that shows when character selection timeout has run out. Display opened text on launch when editing existing text string. +0.02: Introduce setting "Show help button?". Make setting firstLaunch invisible by removing corresponding code from settings.js. Add marker that shows when character selection timeout has run out. Display opened text on launch when editing existing text string. Perfect horizontal alignment of buttons. Tweak help message letter casing. From b4b6d424ecc18b85554cf84b88f23a341ac4fc86 Mon Sep 17 00:00:00 2001 From: thyttan <97237430+thyttan@users.noreply.github.com> Date: Mon, 16 May 2022 12:42:07 +0200 Subject: [PATCH 28/28] perfect horizontal button alignment --- apps/kbmulti/screenshot_3.png | Bin 3674 -> 3503 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/apps/kbmulti/screenshot_3.png b/apps/kbmulti/screenshot_3.png index e0da184baa34c29285e7cd5b76d93638450a6cf4..882ea73862fe0c46c8a984fbc9b6c63afe1dc4a9 100644 GIT binary patch delta 3489 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