diff --git a/apps/txtreader/ChangeLog b/apps/txtreader/ChangeLog new file mode 100644 index 000000000..5560f00bc --- /dev/null +++ b/apps/txtreader/ChangeLog @@ -0,0 +1 @@ +0.01: New App! diff --git a/apps/txtreader/README.md b/apps/txtreader/README.md new file mode 100644 index 000000000..1cede764c --- /dev/null +++ b/apps/txtreader/README.md @@ -0,0 +1,20 @@ +# txtreader + +Very basic text reader with an integrated file selector. + +## Features + +- select files from storage (.txt) +- display their contents +- browse pages + +## Controls + +Bangle.js 2 +- tap the right side of the screen to flip to the next page +- tap the left side of the screen to flip to the previous page +- exit by pressing the physical button + +## Creator + + diff --git a/apps/txtreader/app-icon.js b/apps/txtreader/app-icon.js new file mode 100644 index 000000000..a8c210baf --- /dev/null +++ b/apps/txtreader/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwwkCkQA/AH4A/AAcosd2m9jw04AQlyC5WL1e63YCG3lUC5WPj/x/8f+H/h4CBj/3jYXLv/3/4CCt4FC/IXM/4AI/YXk/WZzOfCgWfAoIXN/F3u9/C4V/AoIvUI6H3F4p3oC6/73e734XTR4wXQ/vd7vfC6f85gAG55HQAAppBC5n5xAAGz4vmzIAGF/33F49/C5v6F4+vC5rrFd6JHCv4XTI4WfF6lms1vF6mq1WvC6Z3WxfdABHVugXKlFUogAHoVCC5QA/AH4A6A")) \ No newline at end of file diff --git a/apps/txtreader/app.js b/apps/txtreader/app.js new file mode 100644 index 000000000..890b4254c --- /dev/null +++ b/apps/txtreader/app.js @@ -0,0 +1,88 @@ +function showFileSelector() { + let files = require("Storage").list().filter(f => f.endsWith('.txt')); + + let menuItems = {}; + files.forEach(file => { + menuItems[file] = () => { + E.showPrompt(`Select ${file}?`).then(confirm => { + if (confirm) { + onFileSelected(file); + } else { + showFileSelector(); + } + }); + }; + }); + + menuItems['< Back'] = () => { load(); }; // Go back to the launcher or previous screen + E.showMenu(menuItems); +} + +function onFileSelected(file) { + + var text = require("Storage").read(file); + + function displayText(text, startLine, pageNumber) { + g.clear(); + g.setFont("6x8", 1); + g.setColor(1); + g.drawString("Page " + pageNumber, 10, 2); + g.drawString(file, g.getWidth()-file.length*6, 2); + + var lines = text.split("\n"); + var y = 15; // Text start, top row reserved for page number + var currentLine = startLine || 0; + var linesDisplayed = 0; //Per page + + for (var i = currentLine; i < lines.length; i++) { + var wrappedLines = g.wrapString(lines[i], g.getWidth() - 20); + for (var j = 0; j < wrappedLines.length; j++) { + g.drawString(wrappedLines[j], 10, y); + y += 10; // Move down for the next line + linesDisplayed++; + if (y >= g.getHeight() - 10) { + // If we run out of space, stop drawing + return { nextStartLine: i , linesDisplayed: linesDisplayed }; + } + } + } + return null; // No more lines to display + } + + var currentStartLine = 0; + var currentPage = 1; + var history = []; // Track the start line and lines displayed for each page + + // Initial display + var result = displayText(text, currentStartLine, currentPage); + history.push({ startLine: currentStartLine, linesDisplayed: result.linesDisplayed }); + + // Handle touch events + Bangle.on('touch', function(button) { + if (button === 2) { // Right side of the screen (next page) + var nextStartLine = displayText(text, currentStartLine, currentPage + 1); + if (nextStartLine !== null) { + currentStartLine = nextStartLine.nextStartLine; + currentPage++; + history.push({ startLine: currentStartLine, linesDisplayed: nextStartLine.linesDisplayed }); + displayText(text, currentStartLine, currentPage); + } else { + currentStartLine = 0; + currentPage = 1; + history = [{ startLine: currentStartLine, linesDisplayed: result.linesDisplayed }]; + displayText(text, currentStartLine, currentPage); + } + } else if (button === 1) { // Left side of the screen (previous page) + if (currentPage > 1) { + // Go back to the previous page + history.pop(); // Remove the current page from history + var previousPage = history[history.length - 1]; + currentStartLine = previousPage.startLine; + currentPage--; + displayText(text, currentStartLine, currentPage); + } + } + }); +} + +showFileSelector(); \ No newline at end of file diff --git a/apps/txtreader/metadata.json b/apps/txtreader/metadata.json new file mode 100644 index 000000000..985b8e5ea --- /dev/null +++ b/apps/txtreader/metadata.json @@ -0,0 +1,16 @@ +{ + "id": "txtreader", + "name": "txtreader", + "shortName": "txtreader", + "version": "0.01", + "description": "Basic text reader with pages and a file selector.", + "icon": "txtreader.png", + "screenshots": [{"url":"screenshot_txtreader.png"}], + "tags": "app,tool", + "supports": ["BANGLEJS2"], + "readme": "README.md", + "storage": [ + {"name":"txtreader.app.js","url":"app.js"}, + {"name":"txtreader.img","url":"app-icon.js","evaluate":true} + ] +} diff --git a/apps/txtreader/screenshot_txtreader.png b/apps/txtreader/screenshot_txtreader.png new file mode 100644 index 000000000..1b565024a Binary files /dev/null and b/apps/txtreader/screenshot_txtreader.png differ diff --git a/apps/txtreader/txtreader.png b/apps/txtreader/txtreader.png new file mode 100644 index 000000000..a60ee8647 Binary files /dev/null and b/apps/txtreader/txtreader.png differ diff --git a/apps/txtreader/txtreader_transparent.png b/apps/txtreader/txtreader_transparent.png new file mode 100644 index 000000000..a60ee8647 Binary files /dev/null and b/apps/txtreader/txtreader_transparent.png differ