Skip to content

Commit e969d83

Browse files
authored
Merge pull request #3734 from tonykakuuu/master
New app: txtreader
2 parents f0ee2be + 13505ad commit e969d83

File tree

8 files changed

+126
-0
lines changed

8 files changed

+126
-0
lines changed

apps/txtreader/ChangeLog

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
0.01: New App!

apps/txtreader/README.md

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
# txtreader
2+
3+
Very basic text reader with an integrated file selector.
4+
5+
## Features
6+
7+
- select files from storage (.txt)
8+
- display their contents
9+
- browse pages
10+
11+
## Controls
12+
13+
Bangle.js 2
14+
- tap the right side of the screen to flip to the next page
15+
- tap the left side of the screen to flip to the previous page
16+
- exit by pressing the physical button
17+
18+
## Creator
19+
20+
<https://topkekker.rip/>

apps/txtreader/app-icon.js

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

apps/txtreader/app.js

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
function showFileSelector() {
2+
let files = require("Storage").list().filter(f => f.endsWith('.txt'));
3+
4+
let menuItems = {};
5+
files.forEach(file => {
6+
menuItems[file] = () => {
7+
E.showPrompt(`Select ${file}?`).then(confirm => {
8+
if (confirm) {
9+
onFileSelected(file);
10+
} else {
11+
showFileSelector();
12+
}
13+
});
14+
};
15+
});
16+
17+
menuItems['< Back'] = () => { load(); };
18+
E.showMenu(menuItems);
19+
}
20+
21+
function onFileSelected(file) {
22+
const chunkSize = 1024;
23+
let currentOffset = 0;
24+
let currentPage = 1;
25+
let history = [];
26+
27+
function displayText(offset, pageNumber) {
28+
g.clear();
29+
g.setFont("6x8", 1);
30+
g.setColor(g.theme.fg);
31+
g.drawString("Page " + pageNumber, 10, 2);
32+
//g.drawString("Offset " + offset, 60, 2);
33+
g.drawString(file, g.getWidth() - file.length * 6, 2);
34+
35+
var text = require("Storage").read(file, offset, chunkSize);
36+
var lines = text.split("\n");
37+
var y = 15; // Text start, top row reserved for page number
38+
var linesDisplayed = 0; // Lines per page
39+
var totalCharsDisplayed = 0; // Total characters per page
40+
41+
for (var i = 0; i < lines.length; i++) {
42+
var wrappedLines = g.wrapString(lines[i], g.getWidth() - 20);
43+
for (var j = 0; j < wrappedLines.length; j++) {
44+
g.drawString(wrappedLines[j], 10, y);
45+
y += 10; // Move down for the next line
46+
linesDisplayed++;
47+
totalCharsDisplayed += wrappedLines[j].length + (j < wrappedLines.length - 1 ? 0 : 1); // Add newline character for the last wrapped line
48+
if (y >= g.getHeight() - 10) {
49+
// If we run out of space, stop drawing
50+
return { nextOffset: offset + totalCharsDisplayed, linesDisplayed: linesDisplayed };
51+
}
52+
}
53+
}
54+
return null; // No more lines to display
55+
}
56+
57+
// Initial display
58+
var result = displayText(currentOffset, currentPage);
59+
history.push({ offset: currentOffset, linesDisplayed: result.linesDisplayed });
60+
61+
// Handle touch events
62+
Bangle.on('touch', function(button) {
63+
if (button === 2) { // Right side of the screen (next page)
64+
var nextOffset = displayText(currentOffset, currentPage + 1);
65+
if (nextOffset !== null) {
66+
currentOffset = nextOffset.nextOffset;
67+
currentPage++;
68+
history.push({ offset: currentOffset, linesDisplayed: nextOffset.linesDisplayed });
69+
displayText(currentOffset, currentPage);
70+
} else {
71+
currentOffset = 0;
72+
currentPage = 1;
73+
history = [{ offset: currentOffset, linesDisplayed: result.linesDisplayed }];
74+
displayText(currentOffset, currentPage);
75+
}
76+
} else if (button === 1) { // Left side of the screen (previous page)
77+
if (currentPage > 1) {
78+
history.pop(); // Remove current page from history
79+
var previousPage = history[history.length - 1];
80+
currentOffset = previousPage.offset;
81+
currentPage--;
82+
displayText(currentOffset, currentPage);
83+
}
84+
}
85+
});
86+
}
87+
88+
showFileSelector();

apps/txtreader/metadata.json

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
{
2+
"id": "txtreader",
3+
"name": "txtreader",
4+
"shortName": "txtreader",
5+
"version": "0.01",
6+
"description": "Basic text reader with pages and a file selector.",
7+
"icon": "txtreader.png",
8+
"screenshots": [{"url":"screenshot_txtreader.png"}],
9+
"tags": "app,tool",
10+
"supports": ["BANGLEJS2"],
11+
"readme": "README.md",
12+
"storage": [
13+
{"name":"txtreader.app.js","url":"app.js"},
14+
{"name":"txtreader.img","url":"app-icon.js","evaluate":true}
15+
]
16+
}
7 KB
Loading

apps/txtreader/txtreader.png

1.51 KB
Loading
1.51 KB
Loading

0 commit comments

Comments
 (0)