From 3681fd3c92b33f8d0fede2d686fd4703fd695c63 Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Thu, 5 May 2022 21:16:06 +0100 Subject: [PATCH] New keyboard app --- apps/kbmulti/ChangeLog | 1 + apps/kbmulti/README.md | 8 +++ apps/kbmulti/app.png | Bin 0 -> 685 bytes apps/kbmulti/lib.js | 110 ++++++++++++++++++++++++++++++++++++ apps/kbmulti/metadata.json | 14 +++++ apps/kbmulti/screenshot.png | Bin 0 -> 3823 bytes 6 files changed, 133 insertions(+) create mode 100644 apps/kbmulti/ChangeLog create mode 100644 apps/kbmulti/README.md create mode 100644 apps/kbmulti/app.png create mode 100644 apps/kbmulti/lib.js create mode 100644 apps/kbmulti/metadata.json create mode 100644 apps/kbmulti/screenshot.png diff --git a/apps/kbmulti/ChangeLog b/apps/kbmulti/ChangeLog new file mode 100644 index 000000000..04b2430bb --- /dev/null +++ b/apps/kbmulti/ChangeLog @@ -0,0 +1 @@ +0.01: New keyboard diff --git a/apps/kbmulti/README.md b/apps/kbmulti/README.md new file mode 100644 index 000000000..0c4d0ef73 --- /dev/null +++ b/apps/kbmulti/README.md @@ -0,0 +1,8 @@ +# Multitap Keyboard + +A library that provides the ability to input text in a style familiar to anyone who had a mobile phone before they went all touchscreen. + +Uses the multitap keypad logic originally from here: http://www.espruino.com/Morse+Code+Texting + +![](screenshot.png) + diff --git a/apps/kbmulti/app.png b/apps/kbmulti/app.png new file mode 100644 index 0000000000000000000000000000000000000000..5607a05537364094c048af0704b7098e3a0f3e60 GIT binary patch literal 685 zcmV;e0#f~nP)LGTp<*=JZt zo5QJOES+g~A7&Q=0&G*XB~tYAGfRQr`J)w+q*G;W)e7CxpOavA|?9*~j#HJ+xXa zDJBR4Os7-QJO@10iA*{HC5MXwfa5rDT~~@Z6#o#@Znw$vm_Sb8a8aEttr!!?2?!zn zYD+7|1abn)|F`Ft+ff*_E@Jlt>UJSJ$*Y%mxox5IH9R4NrPw#%J!jwp)g3lrz@ zJWr`LsR}6(LSVDmP={qU4>^J3or~ibQ4~p6CasuE66p8)Xf~UYEeu2WzMp!G3FMEs z(P*65j)kNZV}k7iD%(Z(0acAR=>zA)m_Y6Wd77ZV(OSaW&h1qPj|7}v^ z-)*;ed3!6xd@B}lT`rUKkgrg!Ry(mBCuCCNUmS@CaFUP-`Sk(S+*C2h=p#1j1FCUn ztaaAA&~g0^!%&JbsqtS*B}uRV@VQi?%1P`48vqsZjM=d9Jnxyxk#qvH1m9zGqjMzv z!EpuPcP4UZtQlihI;S=P-}k?B&R+xg1c3f_`0qpjCXBH+qtWPR4(nSi7K;IQsHnE% TMy#|e00000NkvXXu0mjf@3S-M literal 0 HcmV?d00001 diff --git a/apps/kbmulti/lib.js b/apps/kbmulti/lib.js new file mode 100644 index 000000000..ea7bf9ec3 --- /dev/null +++ b/apps/kbmulti/lib.js @@ -0,0 +1,110 @@ +//Multitap logic originally from here: http://www.espruino.com/Morse+Code+Texting + +exports.input = function(options) { + options = options||{}; + var text = options.text; + if ("string"!=typeof text) text=""; + + var fontSize = "6x15"; + var Layout = require("Layout"); + var letters = { + "1":".,!?1","2":"ABC2","3":"DEF3", + "4":"GHI4","5":"JKL5","6":"MNO6", + "7":"PQRS7","8":"TUV8","9":"WXYZ9", + "0":"_@:/0" + }; + + var charTimeout; // timeout after a key is pressed + var charCurrent; // current character (index in letters) + var charIndex; // index in letters[charCurrent] + var caps = true; + var layout; + //var text = ""; + + function displayText() { + layout.clear(layout.text); + layout.text.label = text; + layout.render(layout.text); + } + + function backspace() { + // remove the timeout if we had one + if (charTimeout!==undefined) { + clearTimeout(charTimeout); + charTimeout = undefined; + } + text = text.slice(0, -1); + newCharacter(); + } + + function setCaps() { + caps = !caps; + for (var key in letters) { + layout[key].label = caps ? letters[key].toUpperCase() : letters[key].toLowerCase(); + } + layout.render(); + } + + function newCharacter(ch) { + text = text.replace("_", " "); + displayText(); + charCurrent = ch; + charIndex = 0; + } + + function onKeyPad(key) { + // remove the timeout if we had one + if (charTimeout!==undefined) { + clearTimeout(charTimeout); + charTimeout = undefined; + } + // work out which char was pressed + if (key==charCurrent) { + charIndex = (charIndex+1) % letters[charCurrent].length; + text = text.slice(0, -1); + } else { + newCharacter(key); + } + var newLetter = letters[charCurrent][charIndex]; + text += (caps ? newLetter.toUpperCase() : newLetter.toLowerCase()); + displayText(); + // set a timeout + charTimeout = setTimeout(function() { + charTimeout = undefined; + newCharacter(); + }, 750); + } + return new Promise((resolve,reject) => { + layout = new Layout( { + type:"v", c: [ + {type:"txt", font:"10%", label:"", id:"text", filly:1, fillx:1}, + {type:"h", c: [ + {type:"btn", font:fontSize, label:letters[1], cb: l=>onKeyPad(1), id:'1', fillx:1 }, + {type:"btn", font:fontSize, label:letters[2], cb: l=>onKeyPad(2), id:'2', fillx:1 }, + {type:"btn", font:fontSize, label:letters[3], cb: l=>onKeyPad(3), id:'3', fillx:1 }, + ]}, + {type:"h", c: [ + {type:"btn", font:fontSize, label:letters[4], cb: l=>onKeyPad(4), id:'4', fillx:1 }, + {type:"btn", font:fontSize, label:letters[5], cb: l=>onKeyPad(5), id:'5', fillx:1 }, + {type:"btn", font:fontSize, label:letters[6], cb: l=>onKeyPad(6), id:'6', fillx:1 }, + ]}, + {type:"h", c: [ + {type:"btn", font:fontSize, label:letters[7], cb: l=>onKeyPad(7), id:'7', fillx:1 }, + {type:"btn", font:fontSize, label:letters[8], cb: l=>onKeyPad(8), id:'8', fillx:1 }, + {type:"btn", font:fontSize, label:letters[9], cb: l=>onKeyPad(9), id:'9', fillx:1 }, + ]}, + {type:"h", c: [ + {type:"btn", font:fontSize, label:letters[0], cb: l=>onKeyPad(0), id:'0', fillx:1 }, + {type:"btn", font:fontSize, label:"^", cb: l=>setCaps(), id:'caps', fillx:1}, + {type:"btn", font:fontSize, label:"<", cb: l=>backspace(), fillx:1 }, + ]}, + ] + },{back: ()=>{ + Bangle.setUI(); + g.clearRect(Bangle.appRect); + resolve(text); + }}); + g.clearRect(Bangle.appRect); + layout.render(); + }); +}; \ No newline at end of file diff --git a/apps/kbmulti/metadata.json b/apps/kbmulti/metadata.json new file mode 100644 index 000000000..419824578 --- /dev/null +++ b/apps/kbmulti/metadata.json @@ -0,0 +1,14 @@ +{ "id": "kbmulti", + "name": "Multitap keyboard", + "version":"0.04", + "description": "A library for text input via multitap/T9 style keypad", + "icon": "app.png", + "type":"textinput", + "tags": "keyboard", + "supports" : ["BANGLEJS2"], + "screenshots": [{"url":"screenshot.png"}], + "readme": "README.md", + "storage": [ + {"name":"textinput","url":"lib.js"} + ] +} diff --git a/apps/kbmulti/screenshot.png b/apps/kbmulti/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..11788ad8793bfd0b93113f038a1d08bcaa67860b GIT binary patch literal 3823 zcmai1X*|>m)c(&FL$*Yg>V{=j;bQ_^aEu^a&%A{(H3 zbl-&qWb`mh`qT1aW8&iCIF~swF=(?Bw%13(#kSe2X77?7a0(i>W5c-A+QxP+!2SY| zkrqXW#D{f?w2b@RMlpmN!7h#Pbxq0VJp1LJ5>p@j%bMb6g%fJx5k2$%#lCU|pxJ)P zhKM_|4G{`oQ|}4=;*~NNl)nE&xME!+cBtM+1TfG~8B#+wTCZ1$GKKzIhvw4w zf3)>kC?^AVmK2CGL1O4`vGakXzyzrF)|cE!ffs5IcqdhR%3~tz8+>e?()`D=LqRyC z@E2p>`GGv`nvjQ)Y7Z{dt>%Aq0>-T+hw`)&vN)auyyZ0m(?;LJFpuyPw8r$u6J}lv z4^4}I$e>%7$z76D?RkQ4!`9!6L_mXkxWu{XyMOe+RO94nXz^j|xevD%V@T1t3t-1q z60U&nyjssqi@LT{dk35Ei`ZJWGBXxW`L!-7ehrVZJwaNpyoQ|}w;|T@%z#lYPRzVZ zEZ1ab5o8a%w*T2N_hCi}h_y#6{jhsT{jsW~MrG3@VS#x<_E`^3*{}iuvpbpZM&WV` zddVRA_{M@$9z?%#BhzJRLo?Rp254t*wS~2}u)s&H`y&%VUs7A(oE^d|+Racd9qREW zVg{svajmp)%s1|7{k1FZGiORVa+59!SYZeY#>KRR5E&gTt-nKL2l}c>!=I2PT_J6b z5ZcTHwqrBzzZCUA(AWxt`I?5})YuMGgjjVgZCa#wyE9V##`C4bl!3HXN!mAdcAo9W z-g`B)0epz^$(m2YcN`#OdwxZou?vn1r8?qMcK!t!(7y*9+!xmbp7cA*o^(&2Qbi2e z_??-MUc+}10tcs`YesIRw5B9M#NdGVi12rRLTRxS&K|nsh8P8FG7!b6Y6-uu&!9N~ zetVr8K6a&Hqt>z1u1qkWprK78`wq~jr`Xtz-mPogL3jd#6ZbTyBHq97isOM?fN?Lh zhX|^^J1}VE%sp0drm_Y7zEIRKT@<_+u9nB+geOez0k>u*t1D@sc=^a%Zp7lE%2h+P z`F0}zkjpXpTvonIuf;|g6Vs)Sm5pt~cQXD`*!w}C{{xM9X?8;*S&c*;c)9|U9&fLr zER5t>?XUALkHIwJOGW6VIi7Q$4OKczhA*i6RBn}SZ!L-ev-p(mSo4y@rj;xD!~Xnf z+Zf5UH3#xe+iSIRHx*7Fsc?XoP9%N=ZA~td)hbj_VW&>}VAc+#5_$(2olwGWAFLZH z>@a+;?J8P9^fAiwxV)n9sXOW73cFj*rK69=$J^IGG2BnL9&`WMe;PsApWI_SYCs~q zp}%;7%L^hz_q;P|A&yslr|E<+PVM1!DtWrb!*_e>bOy!dpf=J1ate7L*es5x0 za$Oc=pPX&Gbwd`k@Aj$&A$^_9h4NIsp0!GWB0|ofy)wmoKxT?qkx5ajgtBBC>Jaj?!RHt?ymSYS6yGg zqh)3?t17A0sJquXML^&-5HI!!@sQTm0cK^^S)Ni+d?h8QtSe=a8|-y0@8=g8_t3D| zD0I4|C+SZvN7FSIP;)_pGv`~Rp>!d@r3>8Ik+kU>ZdULbRiT9smx&IYu(fuvx2TC* z)&~mOLDB~#Vqcfz8c4(KAv9(1;kuri z{l|u;*a2$uU?F|Fk<0WHIccr!H!(pNADUIjPRPSltQ-?ew z7E^k$PoG91!V)4#Z4GY&;A7P{&-b-D`gs8NqYjjv<}tPx%!qzCzq#xlQr+3zEJ}dK z=Yb7X8wt*1(M#idtH!>Sm7*QG*K1O_iSpQZb8-HW-k!mYl>{fw1FM6UVJd&q##I{p zmwu>d%Z{hF8>3jmlN4*0nTTUhhdoMS;w}i@N2G z)lnl(2AgvSaU%1V1kbu&>PZ&7)KwwU-T%zHutyxZZXiPEbywGeB`5co()Ho963+8@O?X|_ z4mbTwUTKO~wS9Ma^P&9yfZ>IcQZj_pRz}>PXzWS70(dfJh1=a6viO!NKEZ54``Okv z`*cK&XX!}BT|#-(v1GfgLO}F68Ieih5?wdNFmLSk*a35Qvg@Es^2Aql6h~^I2h{`V0}Bi2_q7firTIB9%c zbITi>)8alun)z3&$azd2th&589B7)BH)$N$s7_5Z07MBtq{%H>l{on!7XmvV8@ip@qHHRsfEpf0_K2M0>PQy3u0NxiofR&rr8g1+gomf5CAZ$ktF^t5$j6U|gg!UC^#blUT+0z!Z z&RN;ZdR%fQLU$OOUccbM=YpwV_^;u`kF&zFp0mEN6SJiwIh{(h_q1W2Gc>c8>Iv_p z-9Pp9XSdaCImB(c9=b%$bT@S5eX=AtAoe#?8yEK!;lW_?S$B|j@J1Ra+fD7XR1&uC zmCUuD+pBy23-xQM`wejR`lF@Uske2^n)&0mS`R)RcmtFbwpeCvJ=&MLkr~OVC|G2{ z1Ws&Y8}XZ*{1$HGP z1y~g^Se585+f18_bVg|?=$>OP*-hL&RSYQbk|er$JYQcWt2fI#V^@!(LP9>#YW98? zPO^jM+F)dGHmtj<#F3r*spXr2xcmL(5gt~|_FEn|&+t|7FI9U@5}BfqhiPKkp?ldA zbSG5?i5oPj*m@W@n(0^m-SgraD?)t-A**_~{vc{Capy{J(b+1TMjm&dT$$mLUiY~z z|5r}LuWL$>$*P^@-w1RW^Tc`d0rlb{4;lLMt9i2P{o}}EdTy03d|!Mv9qL8w<`7)J z=D0Ze&21hi>s*aKtApiKiE|c#TGmJ5S^iUci-FmL+x%_My$LjeX*q)jl3#etivXPmxYU_LdU$m5qMS&utt_%GFUya?bHqZV zopoX05d#BlDvFUuW?y?99rN~V2GDAr`;c-ZupP$i&BY2sFiX)(;;k`JiKf?{buW=; zal;X|4|p5!eB!&OifVYH?!H_Z#jY_X*b?Q$tM<~sbxbrN+BfJ7%!=uo45oDoZz$EBbrM1Nv6v6;a(F~ z_K0{x6Jt@o2|cw)n+T+CQy=8TuR-A~An5q7S0_yEFk4^GspM@7XXMUoEn>P-z2VYY zhw;n;((t@W5TSj!GerCN3!~?N9{0X~*MgU{^{hVb%||cIXMiLux-gK7F05_svSOnn zM)toQxNnrUpTv*2t6#i9{XuhiPQOizgk`7c|F^VUi#KJI0b|BgSu=e(3?bhpO8vYT z%|!UMd_a>$MAL_cQbM!K1U!pV`bf Q`d|Tb6RRr}WB2&~0e-$dDgXcg literal 0 HcmV?d00001