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