From e67264fa4670c84ddd9103430bfe39ee55d82cbb Mon Sep 17 00:00:00 2001 From: lauzonhomeschool <85599144+lauzonhomeschool@users.noreply.github.com> Date: Sat, 4 Mar 2023 12:35:13 -0500 Subject: [PATCH] [draguboard] Create draguboard app from dragboard --- apps/draguboard/ChangeLog | 1 + apps/draguboard/README.md | 8 ++ apps/draguboard/app.png | Bin 0 -> 9180 bytes apps/draguboard/lib.js | 147 +++++++++++++++++++++++++++++++++ apps/draguboard/metadata.json | 15 ++++ apps/draguboard/screenshot.png | Bin 0 -> 16421 bytes apps/draguboard/settings.js | 44 ++++++++++ 7 files changed, 215 insertions(+) create mode 100644 apps/draguboard/ChangeLog create mode 100644 apps/draguboard/README.md create mode 100644 apps/draguboard/app.png create mode 100644 apps/draguboard/lib.js create mode 100644 apps/draguboard/metadata.json create mode 100644 apps/draguboard/screenshot.png create mode 100644 apps/draguboard/settings.js diff --git a/apps/draguboard/ChangeLog b/apps/draguboard/ChangeLog new file mode 100644 index 000000000..a228aab54 --- /dev/null +++ b/apps/draguboard/ChangeLog @@ -0,0 +1 @@ +0.01: New App based on dragboard, but with a U shaped drag area diff --git a/apps/draguboard/README.md b/apps/draguboard/README.md new file mode 100644 index 000000000..2386c7658 --- /dev/null +++ b/apps/draguboard/README.md @@ -0,0 +1,8 @@ +Swipe along the drag bars and release to select a letter, number or punctuation. + +Tap on left for backspace or right for space. + +Settings: +- ABC Color: color of the characters row +- Num Color: color of the digits and symbols row +- Highlight Color: color of the currently shown character diff --git a/apps/draguboard/app.png b/apps/draguboard/app.png new file mode 100644 index 0000000000000000000000000000000000000000..ae7262b47746c2bc8db95e4067eec233a15a8702 GIT binary patch literal 9180 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 g.toColor(`#${settings[param].toString(16).padStart(3,0)}`); + var BGCOLOR = g.theme.bg; + var HLCOLOR = settings.Highlight ? paramToColor("Highlight") : g.theme.fg; + var ABCCOLOR = settings.ABC ? paramToColor("ABC") : g.toColor(1,0,0);//'#FF0000'; + var NUMCOLOR = settings.Num ? paramToColor("Num") : g.toColor(0,1,0);//'#00FF00'; + var BIGFONT = '6x8:3'; + var SMALLFONT = '6x8:1'; + + var LEFT = "IJKLMNOPQ"; + var MIDDLE = "ABCDEFGH"; + var RIGHT = "RSTUVWXYZ"; + var MIDPADDING = 35; + + var NUM = ' 1234567890!?,.-@'; + var NUMPADDING = ((R.x2)-6*NUM.length)/2; + var showCharY = (R.y2)/3; + var rectHeight = 40; + var vLength = LEFT.length; + var middleWidth; + var middleStart; + var topStart = R.y+12; + + g.setFontAlign(-1, -1, 0); + + function drawAbcRow() { + g.clear(); + try { // Draw widgets if they are present in the current app. + if (WIDGETS) Bangle.drawWidgets(); + } catch (_) {} + g.setColor(ABCCOLOR); + g.setFont('6x8:2x1'); + g.drawString(RIGHT.split("").join("\n\n"), R.x2-28, topStart); + g.drawString(LEFT.split("").join("\n\n"), 22, topStart); + g.setFont('6x8:1x2'); + var spaced = MIDDLE.split("").join(" "); + middleWidth = g.stringWidth(spaced); + middleStart = (R.x2-middleWidth)/2; + g.drawString(spaced, (R.x2-middleWidth)/2, (R.y2)/2); + g.fillRect(MIDPADDING, (R.y2)-26, (R.x2-MIDPADDING), (R.y2)); + g.fillRect(0, R.y, 12, R.y2); + g.fillRect(R.x2, R.y, R.x2-12, R.y2); + } + + function drawNumRow() { + g.setFont('6x8:1x2'); + g.setColor(NUMCOLOR); + g.drawString(NUM, NUMPADDING, (R.y2)/4); + g.drawString("<-", NUMPADDING+10, showCharY+5); + g.drawString("->", R.x2-(NUMPADDING+20), showCharY+5); + + g.fillRect(NUMPADDING, (R.y2)-rectHeight*4/3, (R.x2)-NUMPADDING, (R.y2)-rectHeight*2/3); + } + + function updateTopString() { + g.setFont(SMALLFONT); + g.setColor(BGCOLOR); + g.fillRect(0,4+20,176,13+20); + var rectLen = text.length<27? text.length*6:27*6; + g.setColor(0.7,0,0); + //cursor position + g.fillRect(rectLen+5,4+20,rectLen+10,13+20); + g.setColor(HLCOLOR); + g.drawString(text.length<=27? text.substr(-27, 27) : '<- '+text.substr(-24,24), 5, 5+20); + } + + var charPos; + var char; + var prevChar; + + function showChars(char) { + "ram"; + + // clear large character + g.setColor(BGCOLOR); + g.fillRect(65,showCharY,R.y2-65,showCharY+28); + + // show new large character + g.setColor(HLCOLOR); + g.setFont(BIGFONT); + g.drawString(char, (R.x2)/2 - g.stringWidth(char)/2, showCharY +4); + } + + function moveCharPos(list, select, posPixels) { + charPos = Math.min(list.length-1, Math.max(0, Math.floor(posPixels))); + char = list.charAt(charPos); + + if (char != prevChar) showChars(char); + prevChar = char; + + if (select) { + text += char; + updateTopString(); + } + } + + drawAbcRow(); + drawNumRow(); + updateTopString(); + + return new Promise((resolve,reject) => { + // Interpret touch input + Bangle.setUI({ + mode: 'custom', + back: ()=>{ + Bangle.setUI(); + g.clearRect(Bangle.appRect); + resolve(text); + }, + drag: function(event) { + "ram"; + + // drag on middle bottom rectangle + if (event.x > MIDPADDING - 2 && event.x < (R.x2-MIDPADDING + 2) && event.y >= ( (R.y2) - 12 )) { + moveCharPos(MIDDLE, event.b == 0, (event.x-middleStart)/(middleWidth/MIDDLE.length)); + } + // drag on left or right rectangle + else if (event.y > R.y && (event.x < MIDPADDING-2 || event.x > (R.x2-MIDPADDING + 2))) { + moveCharPos(event.x ( (R.y2) - 52 ))) { + moveCharPos(NUM, event.b == 0, (event.x-NUMPADDING)/6); + } + // Make a space or backspace by tapping right or left on screen above green rectangle + else if (event.y > R.y && event.b == 0) { + if (event.x < (R.x2)/2) { + showChars('<-'); + text = text.slice(0, -1); + } else { + //show space sign + showChars('->'); + text += ' '; + } + prevChar = null; + updateTopString(); + } + } + }); + }); + }; diff --git a/apps/draguboard/metadata.json b/apps/draguboard/metadata.json new file mode 100644 index 000000000..926e36807 --- /dev/null +++ b/apps/draguboard/metadata.json @@ -0,0 +1,15 @@ +{ "id": "draguboard", + "name": "DragUboard", + "version":"0.01", + "description": "A library for text input via swiping U-shaped keyboard.", + "icon": "app.png", + "type":"textinput", + "tags": "keyboard", + "supports" : ["BANGLEJS2"], + "screenshots": [{"url":"screenshot.png"}], + "readme": "README.md", + "storage": [ + {"name":"textinput","url":"lib.js"}, + {"name":"draguboard.settings.js","url":"settings.js"} + ] +} diff --git a/apps/draguboard/screenshot.png b/apps/draguboard/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..f2cb91717924b3fa94afa9a81de13c122b91b320 GIT binary patch literal 16421 zcmeHubx>SQ_vXOh?!kk*!{F}j4#5YP!3plcT@u{godgIFoZu4No!}lMOWx0Gw`%KG zwfo;UbMKw$)8{;W&eNxRZr|#OR8^KiMIuB3005|RvXbhrpLKsu1i060ZR?H^0Kl;3 zt*Ps#Zt6(}adEP=u?Lg6y@!Cwz+N_%0D#w0ah8<_Rclh%Z*yEH#B)o&y8Z8HmJe6& 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 require('Storage').write('draguboard.json', settings); + function colorMenu(key) { + let menu = {'': {title: key}, '< Back': () => E.showMenu(appMenu)}; + Object.keys(colors).forEach(color => { + var label = colors[color]; + menu[label] = { + value: settings[key] == color, + onchange: () => { + if (color >= 0) { + settings[key] = color; + } else { + delete settings[key]; + } + save(); + setTimeout(E.showMenu, 10, appMenu); + } + }; + }); + return menu; + } + + const appMenu = { + '': {title: 'draguboard'}, '< Back': back, + /*LANG*/'ABC Color': () => E.showMenu(colorMenu("ABC")), + /*LANG*/'Num Color': () => E.showMenu(colorMenu("Num")), + /*LANG*/'Highlight Color': () => E.showMenu(colorMenu("Highlight")) + }; + + E.showMenu(appMenu); +}); \ No newline at end of file