From 597703cda9b4f27188e3d2fef3414a9bc877153c Mon Sep 17 00:00:00 2001 From: v-crispadvice Date: Fri, 7 Jul 2023 19:51:40 +0300 Subject: [PATCH 01/21] Add manual download from settings --- apps/flashcards/README.md | 3 + apps/flashcards/app-icon.js | 1 + apps/flashcards/app.js | 158 +++++++++++++++++++++++++++++++++ apps/flashcards/app.png | Bin 0 -> 640 bytes apps/flashcards/metadata.json | 21 +++++ apps/flashcards/screenshot.png | Bin 0 -> 10699 bytes apps/flashcards/settings.js | 56 ++++++++++++ 7 files changed, 239 insertions(+) create mode 100644 apps/flashcards/README.md create mode 100644 apps/flashcards/app-icon.js create mode 100644 apps/flashcards/app.js create mode 100644 apps/flashcards/app.png create mode 100644 apps/flashcards/metadata.json create mode 100644 apps/flashcards/screenshot.png create mode 100644 apps/flashcards/settings.js diff --git a/apps/flashcards/README.md b/apps/flashcards/README.md new file mode 100644 index 0000000000..948ee7a0ef --- /dev/null +++ b/apps/flashcards/README.md @@ -0,0 +1,3 @@ +A simple flash cards application based on Trello public board. + + diff --git a/apps/flashcards/app-icon.js b/apps/flashcards/app-icon.js new file mode 100644 index 0000000000..72371cac4f --- /dev/null +++ b/apps/flashcards/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwwhC/AH0iABQWKgQXLkAXhCxZIKFxgwKC68zABwWGgYXPmAX/C/4X/C/4X/C9ndACQX/C6dEAAQXS6gXDpovpR/4X/C8ENCyPQC4YA/AGo")) diff --git a/apps/flashcards/app.js b/apps/flashcards/app.js new file mode 100644 index 0000000000..7c689a6a82 --- /dev/null +++ b/apps/flashcards/app.js @@ -0,0 +1,158 @@ +/** + * Copyright 2023 SHOGEL + * We believe in Finnish + */ +var Layout = require("Layout"); +var locale = require("locale"); +var storage = require("Storage"); + +// Constants +let SWAP_SIDE_BUZZ_MILLISECONDS = 50; +let CARD_DATA_FILE = "flashcards.data.json"; +let CARD_EMPTY = "empty card"; +let CARD_LINE_LENGTH = 9; +let CARD_LINE_FONT = "20%"; + +// Global variables +let cards = []; + +let cardIndex = 0; +let backSide = false; +let lastDragX = 0; +let lastDragY = 0; + +// Cards data +function wordWrap(str, maxLength) { + if (maxLength == undefined) { + maxLength = CARD_LINE_LENGTH; + } + let res = ''; + while (str.length > maxLength) { + let found = false; + // Inserts new line at first whitespace of the line + for (i = maxLength - 1; i >= 0; i--) { + if (str.charAt(i)==' ') { + res = res + [str.slice(0, i), "\n"].join(''); + str = str.slice(i + 1); + found = true; + break; + } + } + // Inserts new line at MAX_LENGTH position, the word is too long to wrap + if (!found) { + res += [str.slice(0, maxLength), "\n"].join(''); + str = str.slice(maxLength); + } + } + return res + str; +} + +function loadLocalCards() { + if (storage.read(CARD_DATA_FILE)) + { + refreshCards(storage.readJSON(CARD_DATA_FILE, 1) || {},false); + } +} + +function refreshCards(cardsJSON,showMsg) +{ + cardIndex = 0; + backSide = false; + cards = []; + + if (cardsJSON && cardsJSON.length) { + cardsJSON.forEach(card => { + cards.push([ wordWrap(card.name), wordWrap(card.desc) ]); + }); + } + + if (!cards.length) { + cards.push([ wordWrap(CARD_EMPTY), wordWrap(CARD_EMPTY) ]); + drawMessage("e: cards not found"); + } else if (showMsg) { + drawMessage("i: cards refreshed"); + } +} + +// Drawing a card +let drawTimeout; +let queueDraw = function() { + let timeout = 60000; + if (drawTimeout) clearTimeout(drawTimeout); + drawTimeout = setTimeout(function() { + drawTimeout = undefined; + draw(); + }, timeout - (Date.now() % timeout)); +}; + +var cardLayout = new Layout( { + type:"v", c: [ + {type:"txt", font:"6x8:3", label:"", id:"widgets", fillx:1 }, + {type:"txt", font:CARD_LINE_FONT, label:"ABCDEFGHIJ KLMNOPQRST UVWXYZÅÄÖ", filly:1, id:"card" }, + {type:"txt", font:"6x8:2", label:"00:00", id:"clock", fillx:1, bgCol:g.theme.fg, col:g.theme.bg } + ] +}, {lazy:true}); + +function drawCard() { + cardLayout.card.label = cards[cardIndex][backSide ? 1 : 0]; + cardLayout.clock.label = locale.time(new Date(),1); + cardLayout.render(); +} + +function drawMessage(msg) { + cardLayout.card.label = wordWrap(msg); + cardLayout.render(); + console.log(msg); +} + +function draw() { + drawCard(); + Bangle.drawWidgets(); + queueDraw(); +} + +// Handle a touch: swap card side +function handleTouch(zone, event) { + backSide = !backSide; + drawCard(); + Bangle.buzz(SWAP_SIDE_BUZZ_MILLISECONDS); +} + +// Handle a drag event: cycle cards +function handleDrag(event) { + let first_x = event.xy[0]; + let last_x = event.xy[event.xy.length - 2]; + let xdiff = last_x - first_x; + /* + let first_y = event.xy[1]; + let last_y = event.xy[event.xy.length - 1]; + let ydiff = last_y - first_y; + */ + if(xdiff > 0) { + cardIndex = (cardIndex + 1) % cards.length; + } + else if(--cardIndex < 0) { + cardIndex = cards.length - 1; + } + drawCard(); +} + + +// initialize +loadLocalCards(); +cardLayout.update(); +Bangle.loadWidgets(); +Bangle.on("touch", handleTouch); +Bangle.on("stroke", handleDrag); + +// On start: display the first card +g.clear(); +draw(); + +// cleanup +Bangle.setUI({mode:"clock", remove:function() { + if (drawTimeout) clearTimeout(drawTimeout); + drawTimeout = undefined; + Bangle.removeListener("touch", handleTouch); + Bangle.removeListener("stroke", handleDrag); +}}); diff --git a/apps/flashcards/app.png b/apps/flashcards/app.png new file mode 100644 index 0000000000000000000000000000000000000000..e16b8a263e41685980201e0664cf9cca244dd540 GIT binary patch literal 640 zcmV-`0)PF9P)1RCt{2lub|KKp4m8#AnkFu*UU_-vGFBZ53ZJTDG+u_MpLR zG$?BnToDyEuDh76fC>!@23$2BHX-fpZTL^GX_(r_$OwO=6H`6$^QKK1~S0)bQsmgQ>*%XQ$AC2|BN zw`K5e%es9y_-g4+AzY}FAu#&w2*h9KAg0e@bo03T1Oj^%2p(K2eELy&wHJ>~SgtGK zxfB5-G__l7gjbo`DH?KKkl6xb@naCv7a9REeFAmZh`Um2?P(cqod^l#^ZVA9e<(#k>ZVlKT)txU}Pf)!q2}ggnt0{ z;;VHjUu#^SOZl2|_1YpZ^S#`1c$J0RzeaeKIqAxJfr+g`+u`S52*3J>-gz)oU}WP6 zX4@DY%xCEezW%vwDiF~*4{e184gtv^D!|bl0Afc-awGWCk6@wiW$-h}L$JW&$L8Tx z76%9xkUaW3a7gkFfCV5bz|kE5Izq2i_aEXJbZU1=P2o{zYJf5T0000x literal 0 HcmV?d00001 diff --git a/apps/flashcards/metadata.json b/apps/flashcards/metadata.json new file mode 100644 index 0000000000..bdba0b9b00 --- /dev/null +++ b/apps/flashcards/metadata.json @@ -0,0 +1,21 @@ +{ + "id": "flashcards", + "name": "Flash Cards", + "shortName": "Flash Cards", + "version": "1.1", + "description": "Flash cards based on public Trello board", + "screenshots" : [ { "url":"screenshot.png" }], + "icon": "app.png", + "tags": "flash cards", + "type": "clock", + "supports": ["BANGLEJS2"], + "storage": [ + {"name":"flashcards.app.js","url":"app.js"}, + {"name":"flashcards.settings.js","url":"settings.js"}, + {"name":"flashcards.img","url":"app-icon.js","evaluate":true} + ], + "data": [ + {"name":"flashcards.data.json"}, + {"name":"flashcards.settings.json"} + ] +} diff --git a/apps/flashcards/screenshot.png b/apps/flashcards/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..f9c5bcb6390187d7a6d117ef671186b7669cda8c GIT binary patch literal 10699 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 back(), + "Get from Trello": () => { + E.showPrompt("Download cards?").then((v) => { + let delay = 500; + if (v) { + if (Bangle.http) + { + if (settings.listId.length) + { + delay = delay + trelloTimeout; + E.showMessage('i: downloading'); + Bangle.http(trelloURL.replace("$cardsListId", settings.listId), + { + timeout : trelloTimeout, + method: "GET", + headers: { "Content-Type": "application/json" } + }).then(data=>{ + var cardsJSON = JSON.parse(data.resp); + storage.write(dataFile, JSON.stringify(result)); + E.showMessage('i: downloaded'); + }) + .catch((e) => { + E.showMessage("e: " + e); + }); + } else { + E.showMessage("e: list Id not found"); + } + } else { + E.showMessage("e: Gadgetbridge not found"); + } + } + setTimeout(() => E.showMenu(settingsMenu), delay); + }); + } + } + // Show the menu + E.showMenu(settingsMenu); +})(load) \ No newline at end of file From 5be8ef57f9e3f2e70419b2e4f6c6c9d8aa9ae64a Mon Sep 17 00:00:00 2001 From: v-crispadvice Date: Fri, 7 Jul 2023 20:28:59 +0300 Subject: [PATCH 02/21] Add default flash cards --- apps/flashcards/flashcards.data.json | 1 + apps/flashcards/flashcards.settings.json | 1 + apps/flashcards/settings.js | 5 +++++ 3 files changed, 7 insertions(+) create mode 100644 apps/flashcards/flashcards.data.json create mode 100644 apps/flashcards/flashcards.settings.json diff --git a/apps/flashcards/flashcards.data.json b/apps/flashcards/flashcards.data.json new file mode 100644 index 0000000000..2bda9fd547 --- /dev/null +++ b/apps/flashcards/flashcards.data.json @@ -0,0 +1 @@ +[{"id":"634fb1548fcbf401dcb49cf4","name":"monikeitin","desc":"multicooker"},{"id":"634fb18855a957017a5d03f7","name":"lihamylly","desc":"meat grinder"},{"id":"634fb2b50f1f1101890aa7f7","name":"uuni","desc":"oven"},{"id":"633988016d09b300c3770b6d","name":"riittää","desc":"is enough"},{"id":"634fb26ea0aef000ec78e481","name":"kahvinkeitin","desc":"coffee maker"},{"id":"634fb1f8e1378600b51bb317","name":"mehulinko","desc":"juicer"},{"id":"634fb307df637101f7f36b2d","name":"palovaroitin","desc":"smoke \nsensor"},{"id":"634fb29699f51701d79a2cbb","name":"tiskikone","desc":"dishwashing \nmachine"},{"id":"634fb2bbe01e1c0446179a40","name":"liesi","desc":"kitchen\nstove"},{"id":"63419634ce475100b444d577","name":"kohtalainen","desc":"moderate"}] diff --git a/apps/flashcards/flashcards.settings.json b/apps/flashcards/flashcards.settings.json new file mode 100644 index 0000000000..3b85f6bc46 --- /dev/null +++ b/apps/flashcards/flashcards.settings.json @@ -0,0 +1 @@ +{"listId":""} diff --git a/apps/flashcards/settings.js b/apps/flashcards/settings.js index de66488cc0..74339ef075 100644 --- a/apps/flashcards/settings.js +++ b/apps/flashcards/settings.js @@ -17,6 +17,11 @@ var settingsMenu = { "" : { "title" : "Flash Cards" }, "< Back" : () => back(), + "List ID": { + value: settings.listId, + onchange: v=> { settings.listId=v; writeSettings();} + } + , "Get from Trello": () => { E.showPrompt("Download cards?").then((v) => { let delay = 500; From 6a3c6c9a83649271493f995e663c6c13be0f7f98 Mon Sep 17 00:00:00 2001 From: v-crispadvice Date: Fri, 7 Jul 2023 20:43:16 +0300 Subject: [PATCH 03/21] Fix error when missing data file --- apps/flashcards/app.js | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/apps/flashcards/app.js b/apps/flashcards/app.js index 7c689a6a82..29497119b1 100644 --- a/apps/flashcards/app.js +++ b/apps/flashcards/app.js @@ -2,9 +2,6 @@ * Copyright 2023 SHOGEL * We believe in Finnish */ -var Layout = require("Layout"); -var locale = require("locale"); -var storage = require("Storage"); // Constants let SWAP_SIDE_BUZZ_MILLISECONDS = 50; @@ -13,13 +10,15 @@ let CARD_EMPTY = "empty card"; let CARD_LINE_LENGTH = 9; let CARD_LINE_FONT = "20%"; -// Global variables -let cards = []; +// Modules +var Layout = require("Layout"); +var locale = require("locale"); +var storage = require("Storage"); -let cardIndex = 0; -let backSide = false; -let lastDragX = 0; -let lastDragY = 0; +// Global variables +var cards = []; +var cardIndex = 0; +var backSide = false; // Cards data function wordWrap(str, maxLength) { @@ -48,10 +47,12 @@ function wordWrap(str, maxLength) { } function loadLocalCards() { + var cardsJSON = ""; if (storage.read(CARD_DATA_FILE)) { - refreshCards(storage.readJSON(CARD_DATA_FILE, 1) || {},false); + cardsJSON = storage.readJSON(CARD_DATA_FILE, 1) || {}; } + refreshCards(cardsJSON,false); } function refreshCards(cardsJSON,showMsg) @@ -88,7 +89,7 @@ let queueDraw = function() { var cardLayout = new Layout( { type:"v", c: [ {type:"txt", font:"6x8:3", label:"", id:"widgets", fillx:1 }, - {type:"txt", font:CARD_LINE_FONT, label:"ABCDEFGHIJ KLMNOPQRST UVWXYZÅÄÖ", filly:1, id:"card" }, + {type:"txt", font:CARD_LINE_FONT, label:"ABCDEFGHIJ KLMNOPQRST UVWXYZ���", filly:1, id:"card" }, {type:"txt", font:"6x8:2", label:"00:00", id:"clock", fillx:1, bgCol:g.theme.fg, col:g.theme.bg } ] }, {lazy:true}); From 18686d5ff555d72d66758c05c3a8ac6eb70a6b26 Mon Sep 17 00:00:00 2001 From: v-crispadvice Date: Fri, 7 Jul 2023 21:04:36 +0300 Subject: [PATCH 04/21] Fix issue with settings when missing list ID --- apps/flashcards/settings.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/apps/flashcards/settings.js b/apps/flashcards/settings.js index 74339ef075..19a1160db4 100644 --- a/apps/flashcards/settings.js +++ b/apps/flashcards/settings.js @@ -1,34 +1,34 @@ (function(back) { var storage = require("Storage"); - var settingsFILE = "flashcards.settings.json"; + var settingsFile = "flashcards.settings.json"; var dataFile = "flashcards.data.json"; var trelloTimeout = 3000; var trelloURL = "https://api.trello.com/1/lists/$cardsListId/cards/?fields=name%2Cdesc%2Clist"; var settings = Object.assign({ listId: "" - }, storage.readJSON(settingsFILE, true) || {}); + }, storage.readJSON(settingsFile, true) || {}); function writeSettings() { - storage.writeJSON(FILE, settings); + storage.writeJSON(settingsFile, settings); } var settingsMenu = { "" : { "title" : "Flash Cards" }, "< Back" : () => back(), - "List ID": { + /*"List ID": { value: settings.listId, onchange: v=> { settings.listId=v; writeSettings();} } - , + ,*/ "Get from Trello": () => { E.showPrompt("Download cards?").then((v) => { let delay = 500; if (v) { if (Bangle.http) { - if (settings.listId.length) + if (settings.listId) { delay = delay + trelloTimeout; E.showMessage('i: downloading'); @@ -58,4 +58,4 @@ } // Show the menu E.showMenu(settingsMenu); -})(load) \ No newline at end of file +})//(load) \ No newline at end of file From d469765f362a023b184800049f35caa8c8865cba Mon Sep 17 00:00:00 2001 From: v-crispadvice Date: Fri, 7 Jul 2023 21:11:45 +0300 Subject: [PATCH 05/21] Fix cards download --- apps/flashcards/settings.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/flashcards/settings.js b/apps/flashcards/settings.js index 19a1160db4..fe291e348f 100644 --- a/apps/flashcards/settings.js +++ b/apps/flashcards/settings.js @@ -39,7 +39,7 @@ headers: { "Content-Type": "application/json" } }).then(data=>{ var cardsJSON = JSON.parse(data.resp); - storage.write(dataFile, JSON.stringify(result)); + storage.write(dataFile, JSON.stringify(cardsJSON)); E.showMessage('i: downloaded'); }) .catch((e) => { From 9745e24c7b50fcc24906fb2b75ce95e0c5f99ae1 Mon Sep 17 00:00:00 2001 From: v-crispadvice Date: Fri, 7 Jul 2023 21:44:29 +0300 Subject: [PATCH 06/21] Add instructions and minor hotfixes --- apps/flashcards/ChangeLog | 3 +++ apps/flashcards/README.md | 17 ++++++++++++++++- apps/flashcards/app.js | 2 +- apps/flashcards/metadata.json | 2 +- apps/flashcards/settings.js | 1 + 5 files changed, 22 insertions(+), 3 deletions(-) create mode 100644 apps/flashcards/ChangeLog diff --git a/apps/flashcards/ChangeLog b/apps/flashcards/ChangeLog new file mode 100644 index 0000000000..aef6fca5e2 --- /dev/null +++ b/apps/flashcards/ChangeLog @@ -0,0 +1,3 @@ +1.0: Local cards data +1.1: Download cards data from Trello public board +1.2: Configuration instructions added and card layout optimized diff --git a/apps/flashcards/README.md b/apps/flashcards/README.md index 948ee7a0ef..733f412b57 100644 --- a/apps/flashcards/README.md +++ b/apps/flashcards/README.md @@ -1,3 +1,18 @@ -A simple flash cards application based on Trello public board. +A simple flash cards application based on Trello public board. +Configuration: + +1. Create public Trello board +2. Create new Trello list +3. Add Trello cards: +* card name will be flash card front text +* card description will be flash card back text +4. Add ".json" to the end of the Trello board URL and refresh page +5. Find your list ID +6. Save list ID to the "flashcards.settings.json" file on your watch, e.g.: +{"listId":"65942f7b27z68000996ddc00"} +7. On your watch go to Settings -> Apps -> Flash Cards -> Get from Trello +8. Start Flash Cards as watch app or set it as watch clock face +9. Swipe left/right to change card +10. Tap to switch card front/back text diff --git a/apps/flashcards/app.js b/apps/flashcards/app.js index 29497119b1..402bf3c841 100644 --- a/apps/flashcards/app.js +++ b/apps/flashcards/app.js @@ -7,7 +7,7 @@ let SWAP_SIDE_BUZZ_MILLISECONDS = 50; let CARD_DATA_FILE = "flashcards.data.json"; let CARD_EMPTY = "empty card"; -let CARD_LINE_LENGTH = 9; +let CARD_LINE_LENGTH = 8; let CARD_LINE_FONT = "20%"; // Modules diff --git a/apps/flashcards/metadata.json b/apps/flashcards/metadata.json index bdba0b9b00..2b330c09ff 100644 --- a/apps/flashcards/metadata.json +++ b/apps/flashcards/metadata.json @@ -2,7 +2,7 @@ "id": "flashcards", "name": "Flash Cards", "shortName": "Flash Cards", - "version": "1.1", + "version": "1.2", "description": "Flash cards based on public Trello board", "screenshots" : [ { "url":"screenshot.png" }], "icon": "app.png", diff --git a/apps/flashcards/settings.js b/apps/flashcards/settings.js index fe291e348f..67436dd022 100644 --- a/apps/flashcards/settings.js +++ b/apps/flashcards/settings.js @@ -23,6 +23,7 @@ } ,*/ "Get from Trello": () => { + if (!storage.read(settingsFile)) { writeSettings();} E.showPrompt("Download cards?").then((v) => { let delay = 500; if (v) { From 0c52665fd73dd693f454bfa09d070e964ab8d389 Mon Sep 17 00:00:00 2001 From: v-crispadvice Date: Fri, 7 Jul 2023 21:48:06 +0300 Subject: [PATCH 07/21] Fix card horizontal layout --- apps/flashcards/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/flashcards/app.js b/apps/flashcards/app.js index 402bf3c841..a3c775fdf6 100644 --- a/apps/flashcards/app.js +++ b/apps/flashcards/app.js @@ -89,7 +89,7 @@ let queueDraw = function() { var cardLayout = new Layout( { type:"v", c: [ {type:"txt", font:"6x8:3", label:"", id:"widgets", fillx:1 }, - {type:"txt", font:CARD_LINE_FONT, label:"ABCDEFGHIJ KLMNOPQRST UVWXYZ���", filly:1, id:"card" }, + {type:"txt", font:CARD_LINE_FONT, label:"ABCDEFGHIJ KLMNOPQRST UVWXYZÅÖÄ", filly:1, fillx:1, id:"card" }, {type:"txt", font:"6x8:2", label:"00:00", id:"clock", fillx:1, bgCol:g.theme.fg, col:g.theme.bg } ] }, {lazy:true}); From 37a7a9b3e41c71ccf4dc5ceb3fa735e57e54e58f Mon Sep 17 00:00:00 2001 From: v-crispadvice Date: Fri, 7 Jul 2023 22:02:39 +0300 Subject: [PATCH 08/21] Fix empty card layout --- apps/flashcards/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/flashcards/app.js b/apps/flashcards/app.js index a3c775fdf6..d1c25309f2 100644 --- a/apps/flashcards/app.js +++ b/apps/flashcards/app.js @@ -6,7 +6,7 @@ // Constants let SWAP_SIDE_BUZZ_MILLISECONDS = 50; let CARD_DATA_FILE = "flashcards.data.json"; -let CARD_EMPTY = "empty card"; +let CARD_EMPTY = "cards not found"; let CARD_LINE_LENGTH = 8; let CARD_LINE_FONT = "20%"; From 584e33c480f44ed4d3ca753642772ae49dfd8463 Mon Sep 17 00:00:00 2001 From: v-crispadvice Date: Fri, 7 Jul 2023 22:55:27 +0300 Subject: [PATCH 09/21] Fix empty card layout --- apps/flashcards/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/flashcards/app.js b/apps/flashcards/app.js index d1c25309f2..b255316c8e 100644 --- a/apps/flashcards/app.js +++ b/apps/flashcards/app.js @@ -6,7 +6,7 @@ // Constants let SWAP_SIDE_BUZZ_MILLISECONDS = 50; let CARD_DATA_FILE = "flashcards.data.json"; -let CARD_EMPTY = "cards not found"; +let CARD_EMPTY = "no cards found"; let CARD_LINE_LENGTH = 8; let CARD_LINE_FONT = "20%"; From 8e5d0f19d3ca2d57d1d82d08df4719537cecd224 Mon Sep 17 00:00:00 2001 From: v-crispadvice Date: Fri, 7 Jul 2023 23:11:31 +0300 Subject: [PATCH 10/21] Fix empty card layout --- apps/flashcards/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/flashcards/app.js b/apps/flashcards/app.js index b255316c8e..f94cc8ad28 100644 --- a/apps/flashcards/app.js +++ b/apps/flashcards/app.js @@ -6,7 +6,7 @@ // Constants let SWAP_SIDE_BUZZ_MILLISECONDS = 50; let CARD_DATA_FILE = "flashcards.data.json"; -let CARD_EMPTY = "no cards found"; +let CARD_EMPTY = "found no cards"; let CARD_LINE_LENGTH = 8; let CARD_LINE_FONT = "20%"; From 1db67bc5436cc3cbbd683bf17e7ad0bbbe482823 Mon Sep 17 00:00:00 2001 From: v-crispadvice Date: Fri, 7 Jul 2023 23:12:49 +0300 Subject: [PATCH 11/21] Fix empty card layout --- apps/flashcards/app.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/flashcards/app.js b/apps/flashcards/app.js index f94cc8ad28..405df38be0 100644 --- a/apps/flashcards/app.js +++ b/apps/flashcards/app.js @@ -140,9 +140,10 @@ function handleDrag(event) { // initialize -loadLocalCards(); cardLayout.update(); Bangle.loadWidgets(); +loadLocalCards(); + Bangle.on("touch", handleTouch); Bangle.on("stroke", handleDrag); From f6e7fb55258dceef83fb1c84f2dbb3ca70f41909 Mon Sep 17 00:00:00 2001 From: v-crispadvice Date: Fri, 7 Jul 2023 23:18:01 +0300 Subject: [PATCH 12/21] Update copyright message --- apps/flashcards/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/flashcards/app.js b/apps/flashcards/app.js index 405df38be0..3b3b6f67e1 100644 --- a/apps/flashcards/app.js +++ b/apps/flashcards/app.js @@ -1,5 +1,5 @@ /** - * Copyright 2023 SHOGEL + * Copyright 2023 Crisp Advice * We believe in Finnish */ From 05d25d778a002bd39c7d7de323d0021a505b8f8f Mon Sep 17 00:00:00 2001 From: v-crispadvice Date: Fri, 7 Jul 2023 23:22:54 +0300 Subject: [PATCH 13/21] Add readm.me to metadata --- apps/flashcards/metadata.json | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/flashcards/metadata.json b/apps/flashcards/metadata.json index 2b330c09ff..33d475c325 100644 --- a/apps/flashcards/metadata.json +++ b/apps/flashcards/metadata.json @@ -4,6 +4,7 @@ "shortName": "Flash Cards", "version": "1.2", "description": "Flash cards based on public Trello board", + "readme":"README.md", "screenshots" : [ { "url":"screenshot.png" }], "icon": "app.png", "tags": "flash cards", From c09ff6fa3606a2ec5f2dad5f0b4fe9ed18a039c6 Mon Sep 17 00:00:00 2001 From: v-crispadvice Date: Fri, 7 Jul 2023 23:28:18 +0300 Subject: [PATCH 14/21] Update instructions --- apps/flashcards/README.md | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/apps/flashcards/README.md b/apps/flashcards/README.md index 733f412b57..846871ed90 100644 --- a/apps/flashcards/README.md +++ b/apps/flashcards/README.md @@ -5,14 +5,15 @@ Configuration: 1. Create public Trello board 2. Create new Trello list 3. Add Trello cards: -* card name will be flash card front text -* card description will be flash card back text +- card name will be flash card front text +- card description will be flash card back text 4. Add ".json" to the end of the Trello board URL and refresh page 5. Find your list ID 6. Save list ID to the "flashcards.settings.json" file on your watch, e.g.: {"listId":"65942f7b27z68000996ddc00"} -7. On your watch go to Settings -> Apps -> Flash Cards -> Get from Trello -8. Start Flash Cards as watch app or set it as watch clock face -9. Swipe left/right to change card -10. Tap to switch card front/back text - +7. Connect phone with Gadgetbridge to the watch +8. Enable "Allow Internet Access" in Gadgetbridge +9. On the watch go to Settings -> Apps -> Flash Cards -> Get from Trello +10. Start Flash Cards as watch app or set it as watch clock face +11. Swipe left/right to change card +12. Tap to switch card front/back text \ No newline at end of file From 3da2306c816d8bf718496aa099018872bdaf14ef Mon Sep 17 00:00:00 2001 From: v-crispadvice Date: Sat, 8 Jul 2023 15:05:10 +0300 Subject: [PATCH 15/21] Add changing size through Settings --- apps/flashcards/ChangeLog | 3 ++- apps/flashcards/app.js | 27 +++++++++++++-------------- apps/flashcards/metadata.json | 2 +- apps/flashcards/settings.js | 22 +++++++++++++++------- 4 files changed, 31 insertions(+), 23 deletions(-) diff --git a/apps/flashcards/ChangeLog b/apps/flashcards/ChangeLog index aef6fca5e2..21b246bda2 100644 --- a/apps/flashcards/ChangeLog +++ b/apps/flashcards/ChangeLog @@ -1,3 +1,4 @@ 1.0: Local cards data 1.1: Download cards data from Trello public board -1.2: Configuration instructions added and card layout optimized +1.2: Configuration instructions added and card layout optimized +1.3: Font size can be changed in Settings diff --git a/apps/flashcards/app.js b/apps/flashcards/app.js index 3b3b6f67e1..04a7e40f7a 100644 --- a/apps/flashcards/app.js +++ b/apps/flashcards/app.js @@ -3,27 +3,27 @@ * We believe in Finnish */ -// Constants -let SWAP_SIDE_BUZZ_MILLISECONDS = 50; -let CARD_DATA_FILE = "flashcards.data.json"; -let CARD_EMPTY = "found no cards"; -let CARD_LINE_LENGTH = 8; -let CARD_LINE_FONT = "20%"; - // Modules var Layout = require("Layout"); var locale = require("locale"); var storage = require("Storage"); // Global variables -var cards = []; -var cardIndex = 0; -var backSide = false; +let SWAP_SIDE_BUZZ_MILLISECONDS = 50; +let CARD_DATA_FILE = "flashcards.data.json"; +let CARD_SETTINGS_FILE = "flashcards.settings.json"; +let CARD_EMPTY = "no cards found"; +let cards = []; +let cardIndex = 0; +let backSide = false; +let drawTimeout = undefined; + +let settings = storage.readJSON(CARD_SETTINGS_FILE,1) || { litsId: "", fontSize: "20%", textSize: 9 }; // Cards data function wordWrap(str, maxLength) { if (maxLength == undefined) { - maxLength = CARD_LINE_LENGTH; + maxLength = settings.textSize; } let res = ''; while (str.length > maxLength) { @@ -76,7 +76,6 @@ function refreshCards(cardsJSON,showMsg) } // Drawing a card -let drawTimeout; let queueDraw = function() { let timeout = 60000; if (drawTimeout) clearTimeout(drawTimeout); @@ -86,10 +85,10 @@ let queueDraw = function() { }, timeout - (Date.now() % timeout)); }; -var cardLayout = new Layout( { +let cardLayout = new Layout( { type:"v", c: [ {type:"txt", font:"6x8:3", label:"", id:"widgets", fillx:1 }, - {type:"txt", font:CARD_LINE_FONT, label:"ABCDEFGHIJ KLMNOPQRST UVWXYZÅÖÄ", filly:1, fillx:1, id:"card" }, + {type:"txt", font:settings.fontSize, label:"ABCDEFGHIJ KLMNOPQRST UVWXYZÅÖÄ", filly:1, fillx:1, id:"card" }, {type:"txt", font:"6x8:2", label:"00:00", id:"clock", fillx:1, bgCol:g.theme.fg, col:g.theme.bg } ] }, {lazy:true}); diff --git a/apps/flashcards/metadata.json b/apps/flashcards/metadata.json index 33d475c325..89bb721095 100644 --- a/apps/flashcards/metadata.json +++ b/apps/flashcards/metadata.json @@ -2,7 +2,7 @@ "id": "flashcards", "name": "Flash Cards", "shortName": "Flash Cards", - "version": "1.2", + "version": "1.3", "description": "Flash cards based on public Trello board", "readme":"README.md", "screenshots" : [ { "url":"screenshot.png" }], diff --git a/apps/flashcards/settings.js b/apps/flashcards/settings.js index 67436dd022..62dc98d138 100644 --- a/apps/flashcards/settings.js +++ b/apps/flashcards/settings.js @@ -7,7 +7,9 @@ var trelloURL = "https://api.trello.com/1/lists/$cardsListId/cards/?fields=name%2Cdesc%2Clist"; var settings = Object.assign({ - listId: "" + listId: "", + textSize: 9, + fontSize: "20%" }, storage.readJSON(settingsFile, true) || {}); function writeSettings() { @@ -17,12 +19,18 @@ var settingsMenu = { "" : { "title" : "Flash Cards" }, "< Back" : () => back(), - /*"List ID": { - value: settings.listId, - onchange: v=> { settings.listId=v; writeSettings();} - } - ,*/ - "Get from Trello": () => { + /*LANG*/"Font Size": { + value: settings.fontSize, + min: 0, max: 2, + format: v => ["15%","20%","25%"][v], + onchange: v => { settings.fontSize = v; writeSettings(); } + }, + /*LANG*/"Text Size": { + value: settings.textSize, + min: 4, max: 14, + onchange: v => { settings.textSize = v; writeSettings(); } + }, + /*LANG*/"Get from Trello": () => { if (!storage.read(settingsFile)) { writeSettings();} E.showPrompt("Download cards?").then((v) => { let delay = 500; From 958a834d1c32099640d8669801b41fb269d4930e Mon Sep 17 00:00:00 2001 From: v-crispadvice Date: Sat, 8 Jul 2023 15:40:55 +0300 Subject: [PATCH 16/21] Change card lint text length from settings --- apps/flashcards/app.js | 5 +++-- apps/flashcards/settings.js | 9 +++++---- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/apps/flashcards/app.js b/apps/flashcards/app.js index 04a7e40f7a..2272aca131 100644 --- a/apps/flashcards/app.js +++ b/apps/flashcards/app.js @@ -17,8 +17,9 @@ let cards = []; let cardIndex = 0; let backSide = false; let drawTimeout = undefined; +let fontSizes = ["15%","20%","25%"]; -let settings = storage.readJSON(CARD_SETTINGS_FILE,1) || { litsId: "", fontSize: "20%", textSize: 9 }; +let settings = storage.readJSON(CARD_SETTINGS_FILE,1) || { litsId: "", fontSize: fontSizes[1], textSize: 9 }; // Cards data function wordWrap(str, maxLength) { @@ -88,7 +89,7 @@ let queueDraw = function() { let cardLayout = new Layout( { type:"v", c: [ {type:"txt", font:"6x8:3", label:"", id:"widgets", fillx:1 }, - {type:"txt", font:settings.fontSize, label:"ABCDEFGHIJ KLMNOPQRST UVWXYZÅÖÄ", filly:1, fillx:1, id:"card" }, + {type:"txt", font:fontSizes[settings.fontSize], label:"ABCDEFGHIJ KLMNOPQRST UVWXYZÅÖÄ", filly:1, fillx:1, id:"card" }, {type:"txt", font:"6x8:2", label:"00:00", id:"clock", fillx:1, bgCol:g.theme.fg, col:g.theme.bg } ] }, {lazy:true}); diff --git a/apps/flashcards/settings.js b/apps/flashcards/settings.js index 62dc98d138..faa1d0a2b8 100644 --- a/apps/flashcards/settings.js +++ b/apps/flashcards/settings.js @@ -9,25 +9,26 @@ var settings = Object.assign({ listId: "", textSize: 9, - fontSize: "20%" + fontSize: 1 }, storage.readJSON(settingsFile, true) || {}); function writeSettings() { storage.writeJSON(settingsFile, settings); } + const fontSizes = ["15%","20%","25%"]; var settingsMenu = { "" : { "title" : "Flash Cards" }, "< Back" : () => back(), /*LANG*/"Font Size": { value: settings.fontSize, - min: 0, max: 2, - format: v => ["15%","20%","25%"][v], + min: 0, max: 2, wrap: true, + format: v => fontSizes[v], onchange: v => { settings.fontSize = v; writeSettings(); } }, /*LANG*/"Text Size": { value: settings.textSize, - min: 4, max: 14, + min: 5, max: 14, onchange: v => { settings.textSize = v; writeSettings(); } }, /*LANG*/"Get from Trello": () => { From 8d2c14f5b816f38a500e92bb8b9fc88465b31ab0 Mon Sep 17 00:00:00 2001 From: v-crispadvice Date: Sat, 8 Jul 2023 16:09:05 +0300 Subject: [PATCH 17/21] Fix default values for font and text size --- apps/flashcards/README.md | 2 +- apps/flashcards/app.js | 6 +++++- apps/flashcards/flashcards.settings.json | 2 +- apps/flashcards/settings.js | 4 ++-- 4 files changed, 9 insertions(+), 5 deletions(-) diff --git a/apps/flashcards/README.md b/apps/flashcards/README.md index 846871ed90..ddf199b4fd 100644 --- a/apps/flashcards/README.md +++ b/apps/flashcards/README.md @@ -10,7 +10,7 @@ Configuration: 4. Add ".json" to the end of the Trello board URL and refresh page 5. Find your list ID 6. Save list ID to the "flashcards.settings.json" file on your watch, e.g.: -{"listId":"65942f7b27z68000996ddc00"} +{"listId":"65942f7b27z68000996ddc00","fontSize":1,"textSize":9} 7. Connect phone with Gadgetbridge to the watch 8. Enable "Allow Internet Access" in Gadgetbridge 9. On the watch go to Settings -> Apps -> Flash Cards -> Get from Trello diff --git a/apps/flashcards/app.js b/apps/flashcards/app.js index 2272aca131..fc81cb65b5 100644 --- a/apps/flashcards/app.js +++ b/apps/flashcards/app.js @@ -19,7 +19,11 @@ let backSide = false; let drawTimeout = undefined; let fontSizes = ["15%","20%","25%"]; -let settings = storage.readJSON(CARD_SETTINGS_FILE,1) || { litsId: "", fontSize: fontSizes[1], textSize: 9 }; +let settings = Object.assign({ + listId: "", + fontSize: 1, + textSize: 9 +}, storage.readJSON(CARD_SETTINGS_FILE, true) || {}); // Cards data function wordWrap(str, maxLength) { diff --git a/apps/flashcards/flashcards.settings.json b/apps/flashcards/flashcards.settings.json index 3b85f6bc46..505738ce11 100644 --- a/apps/flashcards/flashcards.settings.json +++ b/apps/flashcards/flashcards.settings.json @@ -1 +1 @@ -{"listId":""} +{"listId":"","fontSize":1,"textSize":9} diff --git a/apps/flashcards/settings.js b/apps/flashcards/settings.js index faa1d0a2b8..4f2793e963 100644 --- a/apps/flashcards/settings.js +++ b/apps/flashcards/settings.js @@ -8,8 +8,8 @@ var settings = Object.assign({ listId: "", - textSize: 9, - fontSize: 1 + fontSize: 1, + textSize: 9 }, storage.readJSON(settingsFile, true) || {}); function writeSettings() { From 40c90ffb9de32ece1487d75bfac9c3ad601b8998 Mon Sep 17 00:00:00 2001 From: v-crispadvice Date: Sun, 9 Jul 2023 19:29:00 +0300 Subject: [PATCH 18/21] Add setting to select swipe guesture type --- apps/flashcards/README.md | 2 +- apps/flashcards/app.js | 52 ++++++++++++++++-------- apps/flashcards/flashcards.settings.json | 2 +- apps/flashcards/settings.js | 20 ++++++--- 4 files changed, 51 insertions(+), 25 deletions(-) diff --git a/apps/flashcards/README.md b/apps/flashcards/README.md index ddf199b4fd..b053c25acb 100644 --- a/apps/flashcards/README.md +++ b/apps/flashcards/README.md @@ -10,7 +10,7 @@ Configuration: 4. Add ".json" to the end of the Trello board URL and refresh page 5. Find your list ID 6. Save list ID to the "flashcards.settings.json" file on your watch, e.g.: -{"listId":"65942f7b27z68000996ddc00","fontSize":1,"textSize":9} +{"listId":"65942f7b27z68000996ddc00","fontSize":1,"cardWidth":9,"swipeGesture":0} 7. Connect phone with Gadgetbridge to the watch 8. Enable "Allow Internet Access" in Gadgetbridge 9. On the watch go to Settings -> Apps -> Flash Cards -> Get from Trello diff --git a/apps/flashcards/app.js b/apps/flashcards/app.js index fc81cb65b5..1d588b1a4c 100644 --- a/apps/flashcards/app.js +++ b/apps/flashcards/app.js @@ -18,17 +18,20 @@ let cardIndex = 0; let backSide = false; let drawTimeout = undefined; let fontSizes = ["15%","20%","25%"]; +let lastDragX = 0; +let lastDragY = 0; let settings = Object.assign({ listId: "", fontSize: 1, - textSize: 9 + cardWidth: 9, + swipeGesture: 0 }, storage.readJSON(CARD_SETTINGS_FILE, true) || {}); // Cards data function wordWrap(str, maxLength) { if (maxLength == undefined) { - maxLength = settings.textSize; + maxLength = settings.cardWidth; } let res = ''; while (str.length > maxLength) { @@ -116,6 +119,17 @@ function draw() { queueDraw(); } +function swipeCard(forward) +{ + if(forward) { + cardIndex = (cardIndex + 1) % cards.length; + } + else if(--cardIndex < 0) { + cardIndex = cards.length - 1; + } + drawCard(); +} + // Handle a touch: swap card side function handleTouch(zone, event) { backSide = !backSide; @@ -123,23 +137,27 @@ function handleTouch(zone, event) { Bangle.buzz(SWAP_SIDE_BUZZ_MILLISECONDS); } -// Handle a drag event: cycle cards -function handleDrag(event) { +// Handle a stroke event: cycle cards +function handleStroke(event) { let first_x = event.xy[0]; let last_x = event.xy[event.xy.length - 2]; - let xdiff = last_x - first_x; - /* - let first_y = event.xy[1]; - let last_y = event.xy[event.xy.length - 1]; - let ydiff = last_y - first_y; - */ - if(xdiff > 0) { - cardIndex = (cardIndex + 1) % cards.length; + swipeCard((last_x - first_x) > 0); +} + +// Handle a drag event: cycle cards +function handleDrag(event) { + let isFingerReleased = (event.b === 0); + if(isFingerReleased) { + let isHorizontalDrag = (Math.abs(lastDragX) >= Math.abs(lastDragY)) && + (lastDragX !== 0); + if(isHorizontalDrag) { + swipeCard(lastDragX > 0); + } } - else if(--cardIndex < 0) { - cardIndex = cards.length - 1; + else { + lastDragX = event.dx; + lastDragY = event.dy; } - drawCard(); } @@ -149,7 +167,7 @@ Bangle.loadWidgets(); loadLocalCards(); Bangle.on("touch", handleTouch); -Bangle.on("stroke", handleDrag); +if (settings.swipeGesture) { Bangle.on("drag", handleDrag); } else { Bangle.on("stroke", handleStroke); } // On start: display the first card g.clear(); @@ -160,5 +178,5 @@ Bangle.setUI({mode:"clock", remove:function() { if (drawTimeout) clearTimeout(drawTimeout); drawTimeout = undefined; Bangle.removeListener("touch", handleTouch); - Bangle.removeListener("stroke", handleDrag); + if (settings.swipeGesture) { Bangle.removeListener("drag", handleDrag);} else { Bangle.removeListener("stroke", handleStroke); } }}); diff --git a/apps/flashcards/flashcards.settings.json b/apps/flashcards/flashcards.settings.json index 505738ce11..1bb8fcf22e 100644 --- a/apps/flashcards/flashcards.settings.json +++ b/apps/flashcards/flashcards.settings.json @@ -1 +1 @@ -{"listId":"","fontSize":1,"textSize":9} +{"listId":"","fontSize":1,"cardWidth":9,"swipeGesture":0} diff --git a/apps/flashcards/settings.js b/apps/flashcards/settings.js index 4f2793e963..7d31aa1ee0 100644 --- a/apps/flashcards/settings.js +++ b/apps/flashcards/settings.js @@ -9,28 +9,36 @@ var settings = Object.assign({ listId: "", fontSize: 1, - textSize: 9 + cardWidth: 9, + swipeGesture: 0 }, storage.readJSON(settingsFile, true) || {}); function writeSettings() { storage.writeJSON(settingsFile, settings); } - const fontSizes = ["15%","20%","25%"]; + const fontSizes = [/*LANG*/"Small",/*LANG*/"Medium",/*LANG*/"Large"]; + const swipeGestures = [/*LANG*/"Stroke",/*LANG*/"Drag"]; var settingsMenu = { "" : { "title" : "Flash Cards" }, "< Back" : () => back(), - /*LANG*/"Font Size": { + /*LANG*/"Font size": { value: settings.fontSize, min: 0, max: 2, wrap: true, format: v => fontSizes[v], onchange: v => { settings.fontSize = v; writeSettings(); } }, - /*LANG*/"Text Size": { - value: settings.textSize, + /*LANG*/"Card width": { + value: settings.cardWidth, min: 5, max: 14, - onchange: v => { settings.textSize = v; writeSettings(); } + onchange: v => { settings.cardWidth = v; writeSettings(); } }, + /*LANG*/"Swipe gesture": { + value: settings.swipeGesture, + min: 0, max: 1, wrap: true, + format: v => swipeGestures[v], + onchange: v => { settings.swipeGesture = v; writeSettings(); } + }, /*LANG*/"Get from Trello": () => { if (!storage.read(settingsFile)) { writeSettings();} E.showPrompt("Download cards?").then((v) => { From f839fd5ccd087376014627e641ce7732205ea2d0 Mon Sep 17 00:00:00 2001 From: v-crispadvice Date: Sun, 9 Jul 2023 19:43:13 +0300 Subject: [PATCH 19/21] Set card width range to match font sizes --- apps/flashcards/settings.js | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/apps/flashcards/settings.js b/apps/flashcards/settings.js index 7d31aa1ee0..fa8802aa1d 100644 --- a/apps/flashcards/settings.js +++ b/apps/flashcards/settings.js @@ -21,24 +21,7 @@ const swipeGestures = [/*LANG*/"Stroke",/*LANG*/"Drag"]; var settingsMenu = { "" : { "title" : "Flash Cards" }, - "< Back" : () => back(), - /*LANG*/"Font size": { - value: settings.fontSize, - min: 0, max: 2, wrap: true, - format: v => fontSizes[v], - onchange: v => { settings.fontSize = v; writeSettings(); } - }, - /*LANG*/"Card width": { - value: settings.cardWidth, - min: 5, max: 14, - onchange: v => { settings.cardWidth = v; writeSettings(); } - }, - /*LANG*/"Swipe gesture": { - value: settings.swipeGesture, - min: 0, max: 1, wrap: true, - format: v => swipeGestures[v], - onchange: v => { settings.swipeGesture = v; writeSettings(); } - }, + "< Back" : () => back(), /*LANG*/"Get from Trello": () => { if (!storage.read(settingsFile)) { writeSettings();} E.showPrompt("Download cards?").then((v) => { @@ -72,6 +55,23 @@ } setTimeout(() => E.showMenu(settingsMenu), delay); }); + }, + /*LANG*/"Font size": { + value: settings.fontSize, + min: 0, max: 2, wrap: true, + format: v => fontSizes[v], + onchange: v => { settings.fontSize = v; writeSettings(); } + }, + /*LANG*/"Card width": { + value: settings.cardWidth, + min: 6, max: 12, + onchange: v => { settings.cardWidth = v; writeSettings(); } + }, + /*LANG*/"Swipe gesture": { + value: settings.swipeGesture, + min: 0, max: 1, wrap: true, + format: v => swipeGestures[v], + onchange: v => { settings.swipeGesture = v; writeSettings(); } } } // Show the menu From 85224c58e2ca8abcbe8e9c5a7fb28896166e31a5 Mon Sep 17 00:00:00 2001 From: v-crispadvice Date: Sun, 9 Jul 2023 19:53:23 +0300 Subject: [PATCH 20/21] Fix settings localization --- apps/flashcards/settings.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/apps/flashcards/settings.js b/apps/flashcards/settings.js index fa8802aa1d..a6df1db4c9 100644 --- a/apps/flashcards/settings.js +++ b/apps/flashcards/settings.js @@ -32,7 +32,7 @@ if (settings.listId) { delay = delay + trelloTimeout; - E.showMessage('i: downloading'); + E.showMessage(/*LANG*/"Downloading"); Bangle.http(trelloURL.replace("$cardsListId", settings.listId), { timeout : trelloTimeout, @@ -41,16 +41,16 @@ }).then(data=>{ var cardsJSON = JSON.parse(data.resp); storage.write(dataFile, JSON.stringify(cardsJSON)); - E.showMessage('i: downloaded'); + E.showMessage(/*LANG*/"Downloaded"); }) .catch((e) => { - E.showMessage("e: " + e); + E.showMessage(/*LANG*/"Error:" + e); }); } else { - E.showMessage("e: list Id not found"); + E.showMessage(/*LANG*/"List Id not found"); } } else { - E.showMessage("e: Gadgetbridge not found"); + E.showMessage(/*LANG*/"Gadgetbridge not found"); } } setTimeout(() => E.showMenu(settingsMenu), delay); From 38de2110fd9d9a8eb49b20f452de5c8ab00f03f3 Mon Sep 17 00:00:00 2001 From: v-crispadvice Date: Sun, 9 Jul 2023 21:15:09 +0300 Subject: [PATCH 21/21] Fix issue with word wrapping --- apps/flashcards/app.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/apps/flashcards/app.js b/apps/flashcards/app.js index 1d588b1a4c..badd6b49e7 100644 --- a/apps/flashcards/app.js +++ b/apps/flashcards/app.js @@ -16,7 +16,7 @@ let CARD_EMPTY = "no cards found"; let cards = []; let cardIndex = 0; let backSide = false; -let drawTimeout = undefined; +let drawTimeout; let fontSizes = ["15%","20%","25%"]; let lastDragX = 0; let lastDragY = 0; @@ -29,15 +29,16 @@ let settings = Object.assign({ }, storage.readJSON(CARD_SETTINGS_FILE, true) || {}); // Cards data -function wordWrap(str, maxLength) { +function wordWrap(textStr, maxLength) { if (maxLength == undefined) { maxLength = settings.cardWidth; } let res = ''; + let str = textStr.trim(); while (str.length > maxLength) { let found = false; // Inserts new line at first whitespace of the line - for (i = maxLength - 1; i >= 0; i--) { + for (i = maxLength - 1; i > 0; i--) { if (str.charAt(i)==' ') { res = res + [str.slice(0, i), "\n"].join(''); str = str.slice(i + 1);