2022-04-05 15:49:19 +00:00
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;
/ * I f a c h a r i n t h e k e y m a p i s > = 1 2 8 ,
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
] ;
2022-05-01 23:36:24 +00:00
var settings = Object . assign ( {
// default values
textSize : 1 ,
offsetKeyboard : 0 ,
loopAround : 1 ,
oneToOne : 0 ,
speedScaling : 24
} , require ( 'Storage' ) . readJSON ( "kbtouch.settings.json" , true ) || { } ) ;
2022-04-05 15:49:19 +00:00
// state
const R = Bangle . appRect ;
var kbx = 0 , kby = 0 , kbdx = 0 , kbdy = 0 , kbShift = false , flashToggle = false ;
2022-05-01 23:36:24 +00:00
const PX = 12 , PY = 16 , DRAGSCALE = settings . speedScaling ;
var xoff = 3 , yoff = g . getHeight ( ) - PY * ( 4 + 5 * settings . offsetKeyboard ) ;
2022-04-05 15:49:19 +00:00
function draw ( ) {
2022-05-01 23:36:24 +00:00
"ram" ;
2022-04-05 15:49:19 +00:00
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 ) ;
2022-05-01 23:36:24 +00:00
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 ) ;
2022-04-05 15:49:19 +00:00
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 => {
2022-05-01 23:36:24 +00:00
if ( settings . oneToOne ) {
kbx = Math . max ( Math . min ( Math . floor ( ( e . x - 16 ) / ( 6 * 2 ) ) , 13 ) , 0 ) ;
2022-05-02 00:11:27 +00:00
kby = Math . max ( Math . min ( Math . floor ( ( e . y - 120 ) / ( 8 * 2 ) ) , 3 ) , 0 ) ;
2022-05-01 23:36:24 +00:00
//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 ) ;
2022-04-05 15:49:19 +00:00
draw ( ) ;
}
} , touch : ( ) => {
2022-05-01 23:36:24 +00:00
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 ( ) ;
}
2022-04-05 15:49:19 +00:00
} , back : ( ) => {
clearInterval ( flashInterval ) ;
Bangle . setUI ( ) ;
2023-08-01 22:41:36 +00:00
Bangle . prependListener && Bangle . removeListener ( 'swipe' , catchSwipe ) ; // Remove swipe lister if it was added with `Bangle.prependListener()` (fw2v19 and up).
2022-04-05 15:49:19 +00:00
g . clearRect ( Bangle . appRect ) ;
resolve ( text ) ;
} } ) ;
2023-08-01 22:41:36 +00:00
let catchSwipe = ( ) => { E . stopEventPropagation && E . stopEventPropagation ( ) ; } ;
Bangle . prependListener && Bangle . prependListener ( 'swipe' , catchSwipe ) ; // Intercept swipes on fw2v19 and later. Should not break on older firmwares.
2022-04-05 15:49:19 +00:00
} ) ;
} ;