88 lines
2.9 KiB
JavaScript
88 lines
2.9 KiB
JavaScript
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(); };
|
|
E.showMenu(menuItems);
|
|
}
|
|
|
|
function onFileSelected(file) {
|
|
const chunkSize = 1024;
|
|
let currentOffset = 0;
|
|
let currentPage = 1;
|
|
let history = [];
|
|
|
|
function displayText(offset, pageNumber) {
|
|
g.clear();
|
|
g.setFont("6x8", 1);
|
|
g.setColor(g.theme.fg);
|
|
g.drawString("Page " + pageNumber, 10, 2);
|
|
//g.drawString("Offset " + offset, 60, 2);
|
|
g.drawString(file, g.getWidth() - file.length * 6, 2);
|
|
|
|
var text = require("Storage").read(file, offset, chunkSize);
|
|
var lines = text.split("\n");
|
|
var y = 15; // Text start, top row reserved for page number
|
|
var linesDisplayed = 0; // Lines per page
|
|
var totalCharsDisplayed = 0; // Total characters per page
|
|
|
|
for (var i = 0; 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++;
|
|
totalCharsDisplayed += wrappedLines[j].length + (j < wrappedLines.length - 1 ? 0 : 1); // Add newline character for the last wrapped line
|
|
if (y >= g.getHeight() - 10) {
|
|
// If we run out of space, stop drawing
|
|
return { nextOffset: offset + totalCharsDisplayed, linesDisplayed: linesDisplayed };
|
|
}
|
|
}
|
|
}
|
|
return null; // No more lines to display
|
|
}
|
|
|
|
// Initial display
|
|
var result = displayText(currentOffset, currentPage);
|
|
history.push({ offset: currentOffset, linesDisplayed: result.linesDisplayed });
|
|
|
|
// Handle touch events
|
|
Bangle.on('touch', function(button) {
|
|
if (button === 2) { // Right side of the screen (next page)
|
|
var nextOffset = displayText(currentOffset, currentPage + 1);
|
|
if (nextOffset !== null) {
|
|
currentOffset = nextOffset.nextOffset;
|
|
currentPage++;
|
|
history.push({ offset: currentOffset, linesDisplayed: nextOffset.linesDisplayed });
|
|
displayText(currentOffset, currentPage);
|
|
} else {
|
|
currentOffset = 0;
|
|
currentPage = 1;
|
|
history = [{ offset: currentOffset, linesDisplayed: result.linesDisplayed }];
|
|
displayText(currentOffset, currentPage);
|
|
}
|
|
} else if (button === 1) { // Left side of the screen (previous page)
|
|
if (currentPage > 1) {
|
|
history.pop(); // Remove current page from history
|
|
var previousPage = history[history.length - 1];
|
|
currentOffset = previousPage.offset;
|
|
currentPage--;
|
|
displayText(currentOffset, currentPage);
|
|
}
|
|
}
|
|
});
|
|
}
|
|
|
|
showFileSelector(); |