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 ( 1 ) ;
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 ( ) ;
0 commit comments