From d3d6a845ff1fdf41545ceeba487d03ddd7deeebc Mon Sep 17 00:00:00 2001 From: enricorov Date: Tue, 7 Dec 2021 17:48:39 +0000 Subject: [PATCH 1/8] Added scribble app, icon and params. --- apps/scribble/ChangeLog | 1 + apps/scribble/README.md | 25 ++ apps/scribble/add_to_apps.json | 14 + apps/scribble/app-icon.js | 1 + apps/scribble/app.png | Bin 0 -> 1162 bytes apps/scribble/scribble.js | 469 +++++++++++++++++++++++++++++++++ 6 files changed, 510 insertions(+) create mode 100644 apps/scribble/ChangeLog create mode 100644 apps/scribble/README.md create mode 100644 apps/scribble/add_to_apps.json create mode 100644 apps/scribble/app-icon.js create mode 100644 apps/scribble/app.png create mode 100644 apps/scribble/scribble.js diff --git a/apps/scribble/ChangeLog b/apps/scribble/ChangeLog new file mode 100644 index 000000000..af7f83942 --- /dev/null +++ b/apps/scribble/ChangeLog @@ -0,0 +1 @@ +0.01: Initial release diff --git a/apps/scribble/README.md b/apps/scribble/README.md new file mode 100644 index 000000000..dc139bc9a --- /dev/null +++ b/apps/scribble/README.md @@ -0,0 +1,25 @@ +# App Name + +Describe the app... + +Add screen shots (if possible) to the app folder and link then into this file with ![](.png) + +## Usage + +Describe how to use it + +## Features + +Name the function + +## Controls + +Name the buttons and what they are used for + +## Requests + +Name who should be contacted for support/update requests + +## Creator + +Your name diff --git a/apps/scribble/add_to_apps.json b/apps/scribble/add_to_apps.json new file mode 100644 index 000000000..054f35d55 --- /dev/null +++ b/apps/scribble/add_to_apps.json @@ -0,0 +1,14 @@ +{ "id": "scribble", + "name": "Scribble", + "shortName":"Scribble", + "version":"0.01", + "description": "A keyboard on your wrist!", + "icon": "app.png", + "tags": "keyboard, text, scribble", + "supports" : ["BANGLEJS2"], + "readme": "README.md", + "storage": [ + {"name":"scribble.app.js","url":"app.js"}, + {"name":"scribble.img","url":"app-icon.js","evaluate":true} + ] +} diff --git a/apps/scribble/app-icon.js b/apps/scribble/app-icon.js new file mode 100644 index 000000000..b77fc9a4f --- /dev/null +++ b/apps/scribble/app-icon.js @@ -0,0 +1 @@ +var img = require("heatshrink").decompress(atob("mEwwMB/4A2/IFE+IFE+YFE84FE44FE54SEz/jAocfDAk/54EC/1/x4FC/l/z4FDCQJGD/wFD+IYBIwYSBIwf4IwhfEIwuPIwkPIwMAj//g/P/gFCkOP/AEB/8wj5+Dn0/Aoc8n/4JAU4v/8gYFBaYWAJ4MHAoPwEgMPOgUfLogJCBYQFE+AFD8BHB/EAAAV/AoYyCB4IKBc6QA==")) \ No newline at end of file diff --git a/apps/scribble/app.png b/apps/scribble/app.png new file mode 100644 index 0000000000000000000000000000000000000000..01a6acb72d8d7fe7774e993726f28dd5d6b20927 GIT binary patch literal 1162 zcmV;51aPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D1RqI6K~!i%?U`w) zjd>i$@7N7vUk9Zu#grvt#yWXLwnSM{2u&el5?;v*qIrQNioy$qY#EW1t(2*;lx;Bf zE&CWVCj0jJxaXOU<9W_;?!Cw3=6vhZIrrRqp6B`f{=e=2zXf^al~-PQeby?Qcr8iQ zgdd<9+=Hi3YE%h^!yoV)d=EKQnZ#>J=nH5LL!llVNKk6@70iGKum@^EsZwXS4i}&= zMCF%;)_{^+{bH*T?1H;67wSNm%E2gbrP}+!r=aRE5%m0a=m_RRs`PkII1Z;^AjGbU zFaS=&N$3Yrq4PCt0?X}G-?`{;8)=rh&>0a`9Hx!_#JFu zVbW0h!9n;7MnGkVU0uLfHui@=lt&GfrEmw9Ky8R!4PXQKQ1cT%hsn?x2CmRH_zq&1 zb=-LV8}@-K5mt5ltPLE2D`4mtcCpGNHJ;DIO|X1MRh_D^5nh0+<#-XhY*;?jGguE5 zAWRzdBN$>D+YM}DvC8G20zTAXXbDlF(*yQ{VKxa|jo76ZErpk0G^A@-i$OzeSoI-x zSqhiKZLlP!t2!p@MK}f~c;YAv$eII>;5nRw@sPS%(NOonH{eg`15p(!kl%4Soef*T zu5Qx5PD9qR^sNQG@55gMW7`Q-@46a#>s#0j4s|oZ5j&mS6L_t#hfK$N%Cy8*lzGq# zmVx;&0SqbY`%X9uy?23ak#^EEmgdGMiiO+H_E|A?Df7kkvlg3tA&HlE-B%R^ePVQ=s=e`oF(!~TOq`8QT7 z2f$#u4Bop%wOK|Th$U+W*gP#N8I` 200 ? 2 : 1; +const rowN = 7; +const colN = 7; +const headerH = maxY / 7; +const rowH = (maxY - headerH) / rowN; +const colW = maxX / colN; + +function getRndInteger(min, max) { + return Math.floor(Math.random() * (max - min)) + min; +} + +class Window { + constructor(label, bgCol) { + this.label = "win_" + this.label += (typeof label !== "undefined") ? label : "Unset"; + console.log(`Constructing Window ${this.label}, args: ${arguments}`) + + this.bgCol = bgCol; + this.layers = []; + } + + push(layer) { + layer.label=`${this.layers.length}_${layer.label}`; + this.layers.push(layer); + } + pop() { + this.layers.pop(); + } + + top_layer() { + return this.layers[this.layers.length - 1]; + } + + render() { + + if (this.bgCol !== transp) { + console.log(`${this.label}: filling bg in ${this.bgCol}`); + g.setColor(this.bgCol); + g.fillRect(0, 0, g.getWidth(), g.getHeight()); + } + + + let i = 0; + this.layers.forEach((lyr) => { + // console.log(`Rendering Layer ${i} ${lyr.label}`) + i++; + lyr.render(); + }); + } +} + +class Layer { + constructor(label) { + + this.label = "lyr_" + + this.label += (typeof label !== "undefined") ? label : "Unset"; + console.log(`Constructing Layer ${this.label}, args: ${arguments}`) + this.items = []; + // console.log(`bg is ${bg} type ${typeof bg}`) + + } + + push(button) { + this.items.push(button); + } + + setLabel(label) { + this.label = label; + } + + parseTaps(xy) { + this.items.forEach(item => { + // // print(item) + if (item.was_tapped(xy)) { + // pass parent layer to the tapped button + item.callback(this); + } + }); + } + + render() { + + this.items.forEach((item) => { + + item.render(); + }); + } +} + +class BTN_layer extends Layer { + + constructor(label, layout) { + + Layer.call(this, label) + + this.alphabet = (uppercase) ? abc.toUpperCase() : abc; + console.log(`Constructing BTN_Layer ${this.label}, layout ${this.layout}`) + + if (layout in points) { + + this.create_layout(layout); + + } + else { + throw `Invalid layout passed ->[${layout}]`; + } + + // // print(this); + + } + + render() { + + Layer.prototype.render.call(this); + } + + create_layout(layout) { + + console.log(`Creating layout ${layout}`); + + let start_p = 0; + + this.items = this.push_buttons(points[layout], this.alphabet, start_p, chunk_size) + + } + + push_buttons(points, in_string, start_p) { + + items = []; + spacer = "" // char interposed b/w the two halves of text per button + + for (let i = 0; i < points.length; i++) { + substr = `${in_string.substring( + start_p, + start_p + chunk_size / 2 + )}${spacer}${in_string.substring(start_p + chunk_size / 2, start_p + chunk_size)}`; + + btn_label = + uppercase === 1 + ? substr.toUpperCase() + : substr; + + start_p += chunk_size; + + items.push( + new Button( + i, // ID of button + points[i].x, // left + points[i].y, // top + btn_label, // text to render in the button + box_size.w, // width + box_size.h, // height + g.theme.bg, // box bg + white, // box fill + black // text col + ) + ); + } + + return items; + } + + update_labels(in_string, start_p, chk_size) { + // print(`Updating labels | in_string ${in_string} start_p ${start_p} chk_size ${chk_size}`); + in_string.replace('\n', ''); // remove newlines just in case + + spacer = "" // char interposed b/w the two halves of text per button + + for (let i = 0; i < this.items.length; i++) { + + item = this.items[i]; + substr = (chk_size < 3) + ? in_string.substring(start_p + chk_size * i, start_p + (chk_size * (i + 1))) + : `${in_string.substring( + start_p + chk_size * i, + start_p + chk_size * i + chk_size / 2 + )}${spacer}${in_string.substring(start_p + chk_size * i + chk_size / 2, start_p + chk_size * i + chk_size)}`; + // // print(`(chk_size > 3): ${(chk_size > 3)}`) + // print(`Label ${i} -> ${substr}`); + item.setLabel(substr); + } + + } + + zoom_in(id) { + let start_p = id * chunk_size; + // print(`Zooming in | start_p ${start_p}`) + if (chunk_size % this.items.length !== 0) { + throw `Chunk size [${chunk_size}] does not fit #btns [${this.items.length}]` + } + subchunk_size = chunk_size / this.items.length; + + substr = this.alphabet.substring(start_p, start_p + chunk_size); + // print(`substr ${substr}`); + // print(`subchunk_size ${subchunk_size}`); + this.update_labels(substr, 0, subchunk_size); + + } + +} + +class Button { + constructor(id, x, y, text, w, h, col, bgCol, txtCol, font) { + this.id = id; + this.label = `btn_${this.id}`; + + this.text = text; + this.x1 = x; + this.y1 = y; + this.w = w; + this.h = h; + this.col = typeof col !== "undefined" ? col : black; + this.bgCol = typeof bgCol !== "undefined" ? bgCol : gray2; + this.txtCol = typeof txtCol !== "undefined" ? txtCol : black; + // this.font = font; + + this.x2 = this.x1 + this.w; + this.y2 = this.y1 + this.h; + this.center = { + x: (this.x1 + this.x2) / 2, + y: (this.y1 + this.y2) / 2, + }; + + + console.log(`Constructed button `) + // // print(this); + } + + render() { + // console.log( + // `Button ${this.text} -> P1: (${this.x1}, ${this.y1}) | P2: (${this.x2}, ${this.y2})` + // ); + + g.setColor(this.bgCol); + g.fillRect(this.x1, this.y1, this.x2, this.y2); + g.setColor(this.col); + g.drawRect(this.x1, this.y1, this.x2, this.y2); + g.setColor(this.txtCol); + + g.setFontAlign(0, 0).setFont(global_font, font_height); + g.drawString(this.text, this.center.x, this.center.y); + } + + // short tap callback func + callback(parent_layer) { + // print(`Tapped button ${this.id}`); + + // this.highlight(); // TODO set up highlighting + if (last_layer) { + l_text.items[0].text += this.text; + // print(`Updated buffer to ${l_text.items[0].text}`) + parent_layer.update_labels(parent_layer.alphabet, 0, chunk_size); + last_layer = false; + } + else { + parent_layer.zoom_in(this.id); + last_layer = true; + } + } + + was_tapped(xy) { + var x = xy.x; + var y = xy.y; + + if ((x > this.x1 && x < this.x2) && (y > this.y1 && y < this.y2)) { + return true; + } + else { + return false; + } + } + + setLabel(lbl) { + // // print(`Button ${this.id}, updating label ${this.text} with ${lbl}`); + this.text = lbl; + } + + getLabel(lbl) { + + return this.label; + } + + highlight() { + + g.setColor(g.theme.bgH); + g.fillRect(this.x1, this.y1, this.x2, this.y2); + g.setColor(g.theme.fgH); + g.drawRect(this.x1, this.y1, this.x2, this.y2); + g.setColor(this.fg); + + g.setFontAlign(0, 0).setFont(global_font, font_height); + g.drawString(this.text, this.center.x, this.center.y); + + } + +} + +class TextBox { + + constructor(x, y, text, col) { + + // x and y are the center points + this.x = x; + this.y = y; + this.text = (typeof text !== undefined) ? text : "Default"; + this.col = (typeof col !== undefined) ? col : red; + + // console.log(`Constr TextBox ${this.text} -> Center: (${this.x}, ${this.y}) | Col ${this.col}`); + } + + render() { + // console.log(`Rendering TextBox`) + + var align_center = (0, 1); + var align_right = (0, 0); + alignment = (g.stringWidth(this.text) < g.getWidth()) ? align_center : align_right; + // coords = (g.stringWidth(this.text) < g.getWidth()- 20) ? {x:this.x, y:this.y} : {x:g.getWidth()-border, y:this.y} + coords = { x: this.x, y: this.y }; + g.setColor(this.col); + g.setFontAlign(0, 0).setFont(global_font, font_height); + g.drawString(this.text, coords.x, coords.y); + + } +} + +/* Screen refresh *************************************/ + +function draw(obj) { + console.log("draw()"); + obj.render(); +} + +let tickTimer; + +function clearTickTimer() { + if (tickTimer) { + clearTimeout(tickTimer); + tickTimer = undefined; + } +} + +function queueNextTick() { + clearTickTimer(); + tickTimer = setTimeout(tick, 5000); +} + +function tick() { + console.log("tick"); + draw(window); + // queueNextTick(); +} + +/* Init **********************************************/ + +var window = new Window("abc", red); + +var l_btns = new BTN_layer("btns", "3x2"); + +var l_text = new Layer("text"); // black + +var box = new TextBox( + _screen_mid, + 12, + editable_buf, + white +); + +l_text.push(box); + +window.push(l_text); +window.push(l_btns); + +// Set up callbacks for touches + +Bangle.on('touch', function (button, xy) { + + window.top_layer().parseTaps(xy); + window.render(); + +}); + +Bangle.on('swipe', function (direction) { + + console.log(`Swipe dir ${direction}`); + + if (direction === -1) { // left + + l_text.items[0].text = l_text.items[0].text.slice(0, -1); + + } else if (direction == 1) { // right + + l_text.items[0].text += ' '; + + } + window.render(); + +}); + +// Clear the screen once, at startup +g.clear(); + +// Start ticking +tick(); \ No newline at end of file From 5674014334fb999c08a8ff313a1441a9885447fd Mon Sep 17 00:00:00 2001 From: enricorov Date: Tue, 7 Dec 2021 17:59:18 +0000 Subject: [PATCH 2/8] Add scribble to apps.json --- apps.json | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/apps.json b/apps.json index 13bb5892d..a0e024300 100644 --- a/apps.json +++ b/apps.json @@ -4780,5 +4780,21 @@ {"name": "flow.app.js", "url": "app.js" }, {"name": "flow.img", "url": "app-icon.js","evaluate": true } ] + }, + { "id": "scribble", + "name": "Scribble", + "shortName":"Scribble", + "version":"0.01", + "description": "A keyboard on your wrist! Swipe right for space, left for delete.", + "icon": "app.png", + "allow_emulator": true, + "tags": "tools, keyboard, text, scribble", + "supports" : ["BANGLEJS2"], + "readme": "README.md", + "storage": [ + {"name":"scribble.app.js","url":"app.js"}, + {"name":"scribble.img","url":"app-icon.js","evaluate":true} + ] } + ] From 186913c088dcf3c9ffcbc5e66a794558aa414d65 Mon Sep 17 00:00:00 2001 From: enricorov Date: Tue, 7 Dec 2021 18:04:11 +0000 Subject: [PATCH 3/8] Add scribble type --- apps.json | 1 + 1 file changed, 1 insertion(+) diff --git a/apps.json b/apps.json index a0e024300..b2f809904 100644 --- a/apps.json +++ b/apps.json @@ -4785,6 +4785,7 @@ "name": "Scribble", "shortName":"Scribble", "version":"0.01", + "type": "app", "description": "A keyboard on your wrist! Swipe right for space, left for delete.", "icon": "app.png", "allow_emulator": true, From f46810aa65fef333516bde2686491dd32fc799e1 Mon Sep 17 00:00:00 2001 From: enricorov Date: Tue, 7 Dec 2021 18:04:27 +0000 Subject: [PATCH 4/8] renamed scribble.js to app.js --- apps/scribble/{scribble.js => app.js} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename apps/scribble/{scribble.js => app.js} (100%) diff --git a/apps/scribble/scribble.js b/apps/scribble/app.js similarity index 100% rename from apps/scribble/scribble.js rename to apps/scribble/app.js From 254ba37a87673083b4ece4cc9d122d4043ca9769 Mon Sep 17 00:00:00 2001 From: enricorov Date: Tue, 7 Dec 2021 18:07:30 +0000 Subject: [PATCH 5/8] Fixed app icon --- apps/scribble/app-icon.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/scribble/app-icon.js b/apps/scribble/app-icon.js index b77fc9a4f..740706094 100644 --- a/apps/scribble/app-icon.js +++ b/apps/scribble/app-icon.js @@ -1 +1 @@ -var img = require("heatshrink").decompress(atob("mEwwMB/4A2/IFE+IFE+YFE84FE44FE54SEz/jAocfDAk/54EC/1/x4FC/l/z4FDCQJGD/wFD+IYBIwYSBIwf4IwhfEIwuPIwkPIwMAj//g/P/gFCkOP/AEB/8wj5+Dn0/Aoc8n/4JAU4v/8gYFBaYWAJ4MHAoPwEgMPOgUfLogJCBYQFE+AFD8BHB/EAAAV/AoYyCB4IKBc6QA==")) \ No newline at end of file +require("heatshrink").decompress(atob("mEwwMB/4A2/IFE+IFE+YFE84FE44FE54SEz/jAocfDAk/54EC/1/x4FC/l/z4FDCQJGD/wFD+IYBIwYSBIwf4IwhfEIwuPIwkPIwMAj//g/P/gFCkOP/AEB/8wj5+Dn0/Aoc8n/4JAU4v/8gYFBaYWAJ4MHAoPwEgMPOgUfLogJCBYQFE+AFD8BHB/EAAAV/AoYyCB4IKBc6QA==")) \ No newline at end of file From afa4f1d2419ebc9caa0033a9b6ce24b51f65d791 Mon Sep 17 00:00:00 2001 From: enricorov Date: Tue, 7 Dec 2021 18:49:11 +0000 Subject: [PATCH 6/8] Adjusted button size --- apps/scribble/app.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/scribble/app.js b/apps/scribble/app.js index e8fb9e4c2..3d05f68c5 100644 --- a/apps/scribble/app.js +++ b/apps/scribble/app.js @@ -19,15 +19,15 @@ const font_height = 2; const global_font = "Dennis8"; require("FontDennis8").add(Graphics); -const editable_buf = "hello"; +const editable_buf = "Scribble"; -const left = 4; +const left = 3; const _screen_mid = g.getWidth() / 2; const right = 176 - 4; const box_size = { w: _screen_mid - 6, - h: 45, + h: 46, }; const spacing = 4; From 97338ff66414d9c7e4651334594cb94726d4b2c0 Mon Sep 17 00:00:00 2001 From: enricorov Date: Tue, 7 Dec 2021 18:49:23 +0000 Subject: [PATCH 7/8] Added screenshots --- apps.json | 3 +++ apps/scribble/screenshot.png | Bin 0 -> 2797 bytes 2 files changed, 3 insertions(+) create mode 100644 apps/scribble/screenshot.png diff --git a/apps.json b/apps.json index b2f809904..dbb2eb972 100644 --- a/apps.json +++ b/apps.json @@ -4795,6 +4795,9 @@ "storage": [ {"name":"scribble.app.js","url":"app.js"}, {"name":"scribble.img","url":"app-icon.js","evaluate":true} + ], + "screenshots":[ + { "url":"screenshot.png" } ] } diff --git a/apps/scribble/screenshot.png b/apps/scribble/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..a3dc0cff25bd99db84b3d6dd1c764d9b8a5c7742 GIT binary patch literal 2797 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 Date: Tue, 7 Dec 2021 18:49:29 +0000 Subject: [PATCH 8/8] Added scribble readme --- apps/scribble/README.md | 24 +++++++----------------- 1 file changed, 7 insertions(+), 17 deletions(-) diff --git a/apps/scribble/README.md b/apps/scribble/README.md index dc139bc9a..651ecfbf1 100644 --- a/apps/scribble/README.md +++ b/apps/scribble/README.md @@ -1,25 +1,15 @@ -# App Name +# Scribble -Describe the app... +A tree-based keyboard, inspired by Tertiary Text on Pebble. -Add screen shots (if possible) to the app folder and link then into this file with ![](.png) +![](screenshot.png) ## Usage -Describe how to use it - -## Features - -Name the function - -## Controls - -Name the buttons and what they are used for - -## Requests - -Name who should be contacted for support/update requests +Tap a button to select text. +Swipe left to right for enter space. +Swipe right to left to delete. ## Creator -Your name +enricorov