From 98fb9ff01840be004b502c0c8f760cfd0227e863 Mon Sep 17 00:00:00 2001 From: v-crispadvice Date: Fri, 14 Jul 2023 13:16:56 +0300 Subject: [PATCH] Fix fast-loading support --- apps/flashcards/ChangeLog | 9 +- apps/flashcards/README.md | 2 +- apps/flashcards/app.js | 333 +++++++++++------------ apps/flashcards/flashcards.settings.json | 2 +- apps/flashcards/metadata.json | 2 +- apps/flashcards/settings.js | 4 +- 6 files changed, 176 insertions(+), 176 deletions(-) diff --git a/apps/flashcards/ChangeLog b/apps/flashcards/ChangeLog index 21b246bda..6f9ed7196 100644 --- a/apps/flashcards/ChangeLog +++ b/apps/flashcards/ChangeLog @@ -1,4 +1,5 @@ -1.0: Local cards data -1.1: Download cards data from Trello public board -1.2: Configuration instructions added and card layout optimized -1.3: Font size can be changed in Settings +1.00: Local cards data +1.10: Download cards data from Trello public board +1.20: Configuration instructions added and card layout optimized +1.30: Font size can be changed in Settings +1.31: Fix for fast-loading support \ No newline at end of file diff --git a/apps/flashcards/README.md b/apps/flashcards/README.md index b053c25ac..484d1102f 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,"cardWidth":9,"swipeGesture":0} +{"listId":"65942f7b27z68000996ddc00","fontSize":1,"cardWidth":9,"swipeGesture":1} 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 5fa2e6de7..d2118f8cb 100644 --- a/apps/flashcards/app.js +++ b/apps/flashcards/app.js @@ -2,186 +2,185 @@ * Copyright 2023 Crisp Advice * We believe in Finnish */ +{ + // Modules + let Layout = require("Layout"); + let locale = require("locale"); + let storage = require("Storage"); -// Modules -var Layout = require("Layout"); -var locale = require("locale"); -var storage = require("Storage"); + // Global variables + const SWAP_SIDE_BUZZ_MILLISECONDS = 50; + const CARD_DATA_FILE = "flashcards.data.json"; + const CARD_SETTINGS_FILE = "flashcards.settings.json"; + const CARD_EMPTY = "no cards found"; + + let cards = []; + let cardIndex = 0; + let backSide = false; + let drawTimeout; + let fontSizes = ["15%","20%","25%"]; + let lastDragX = 0; + let lastDragY = 0; -// Global variables -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; -let fontSizes = ["15%","20%","25%"]; -let lastDragX = 0; -let lastDragY = 0; + let settings = Object.assign({ + listId: "", + fontSize: 1, + cardWidth: 9, + swipeGesture: 1 + }, storage.readJSON(CARD_SETTINGS_FILE, true) || {}); -let settings = Object.assign({ - listId: "", - fontSize: 1, - cardWidth: 9, - swipeGesture: 0 -}, storage.readJSON(CARD_SETTINGS_FILE, true) || {}); - -// Cards data -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--) { - if (str.charAt(i)==' ') { - res = res + [str.slice(0, i), "\n"].join(''); - str = str.slice(i + 1); - found = true; - break; + // Cards data + let wordWrap = function (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--) { + 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); } } - // 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; } - return res + str; -} -function loadLocalCards() { - var cardsJSON = ""; - if (storage.read(CARD_DATA_FILE)) + let loadLocalCards = function() { + var cardsJSON = ""; + if (storage.read(CARD_DATA_FILE)) + { + cardsJSON = storage.readJSON(CARD_DATA_FILE, 1) || {}; + } + refreshCards(cardsJSON,false); + } + + let refreshCards = function(cardsJSON,showMsg) { - cardsJSON = storage.readJSON(CARD_DATA_FILE, 1) || {}; - } - refreshCards(cardsJSON,false); -} + cardIndex = 0; + backSide = false; + cards = []; -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 (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 queueDraw = function() { - let timeout = 60000; - if (drawTimeout) clearTimeout(drawTimeout); - drawTimeout = setTimeout(function() { - drawTimeout = undefined; - draw(); - }, timeout - (Date.now() % timeout)); -}; - -let cardLayout = new Layout( { - type:"v", c: [ - {type:"txt", font:"6x8:3", label:"", id:"widgets", fillx:1 }, - {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}); - -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(); -} - -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; - drawCard(); - Bangle.buzz(SWAP_SIDE_BUZZ_MILLISECONDS); -} - -// Handle a stroke event: cycle cards -function handleStroke(event) { - let first_x = event.xy[0]; - let last_x = event.xy[event.xy.length - 2]; - 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); + if (!cards.length) { + cards.push([ wordWrap(CARD_EMPTY), wordWrap(CARD_EMPTY) ]); + drawMessage("e: cards not found"); + } else if (showMsg) { + drawMessage("i: cards refreshed"); } } - else { - lastDragX = event.dx; - lastDragY = event.dy; + + // Drawing a card + let queueDraw = function() { + let timeout = 60000; + if (drawTimeout) clearTimeout(drawTimeout); + drawTimeout = setTimeout(function() { + drawTimeout = undefined; + draw(); + }, timeout - (Date.now() % timeout)); + }; + + let cardLayout = new Layout( { + type:"v", c: [ + {type:"txt", font:"6x8:3", label:"", id:"widgets", fillx:1 }, + {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}); + + let drawCard = function() { + cardLayout.card.label = cards[cardIndex][backSide ? 1 : 0]; + cardLayout.clock.label = locale.time(new Date(),1); + cardLayout.render(); } + + let drawMessage = function(msg) { + cardLayout.card.label = wordWrap(msg); + cardLayout.render(); + console.log(msg); + } + + let draw = function() { + drawCard(); + Bangle.drawWidgets(); + queueDraw(); + } + + let swipeCard = function(forward) + { + if(forward) { + cardIndex = (cardIndex + 1) % cards.length; + } + else if(--cardIndex < 0) { + cardIndex = cards.length - 1; + } + drawCard(); + } + + // Handle a touch: swap card side + let handleTouch = function(zone, event) { + backSide = !backSide; + drawCard(); + Bangle.buzz(SWAP_SIDE_BUZZ_MILLISECONDS); + } + + // Handle a stroke event: cycle cards + let handleStroke = function(event) { + let first_x = event.xy[0]; + let last_x = event.xy[event.xy.length - 2]; + swipeCard((last_x - first_x) > 0); + } + + // Handle a drag event: cycle cards + let handleDrag = function(event) { + let isFingerReleased = (event.b === 0); + if(isFingerReleased) { + let isHorizontalDrag = (Math.abs(lastDragX) >= Math.abs(lastDragY)) && + (lastDragX !== 0); + if(isHorizontalDrag) { + swipeCard(lastDragX > 0); + } + } + else { + lastDragX = event.dx; + lastDragY = event.dy; + } + } + + // Ensure pressing the button goes to the launcher (by making this seem like a clock?) + Bangle.setUI({mode:"clock", remove:function() { + if (drawTimeout) clearTimeout(drawTimeout); + drawTimeout = undefined; + Bangle.removeListener("touch", handleTouch); + if (settings.swipeGesture) { Bangle.removeListener("drag", handleDrag);} else { Bangle.removeListener("stroke", handleStroke); } + }}); + + // initialize + cardLayout.update(); + Bangle.loadWidgets(); + loadLocalCards(); + + Bangle.on("touch", handleTouch); + if (settings.swipeGesture) { Bangle.on("drag", handleDrag); } else { Bangle.on("stroke", handleStroke); } + + // On start: display the first card + g.clear(); + draw(); } -// Ensure pressing the button goes to the launcher (by making this seem like a clock?) -Bangle.setUI({mode:"clock"/*, remove:function() { - // Code to enable fast load. NOTE: this doesn't work on this app because all - // functions and vars are declared global: https://www.espruino.com/Bangle.js+Fast+Load - if (drawTimeout) clearTimeout(drawTimeout); - drawTimeout = undefined; - Bangle.removeListener("touch", handleTouch); - if (settings.swipeGesture) { Bangle.removeListener("drag", handleDrag);} else { Bangle.removeListener("stroke", handleStroke); } -}*/}); - -// initialize -cardLayout.update(); -Bangle.loadWidgets(); -loadLocalCards(); - -Bangle.on("touch", handleTouch); -if (settings.swipeGesture) { Bangle.on("drag", handleDrag); } else { Bangle.on("stroke", handleStroke); } - -// On start: display the first card -g.clear(); -draw(); - - diff --git a/apps/flashcards/flashcards.settings.json b/apps/flashcards/flashcards.settings.json index 1bb8fcf22..7c8ef545b 100644 --- a/apps/flashcards/flashcards.settings.json +++ b/apps/flashcards/flashcards.settings.json @@ -1 +1 @@ -{"listId":"","fontSize":1,"cardWidth":9,"swipeGesture":0} +{"listId":"","fontSize":1,"cardWidth":9,"swipeGesture":1} diff --git a/apps/flashcards/metadata.json b/apps/flashcards/metadata.json index 89bb72109..096e7e918 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.3", + "version": "1.31", "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 a6df1db4c..cc03349b4 100644 --- a/apps/flashcards/settings.js +++ b/apps/flashcards/settings.js @@ -10,7 +10,7 @@ listId: "", fontSize: 1, cardWidth: 9, - swipeGesture: 0 + swipeGesture: 1 }, storage.readJSON(settingsFile, true) || {}); function writeSettings() { @@ -24,7 +24,7 @@ "< Back" : () => back(), /*LANG*/"Get from Trello": () => { if (!storage.read(settingsFile)) { writeSettings();} - E.showPrompt("Download cards?").then((v) => { + E.showPrompt(/*LANG*/"Download cards?").then((v) => { let delay = 500; if (v) { if (Bangle.http)