@@ -10,7 +10,10 @@ use std::{
10
10
io:: { self , StdoutLock , Write } ,
11
11
} ;
12
12
13
- use crate :: { app_state:: AppState , term:: progress_bar, MAX_EXERCISE_NAME_LEN } ;
13
+ use crate :: { app_state:: AppState , exercise:: Exercise , term:: progress_bar, MAX_EXERCISE_NAME_LEN } ;
14
+
15
+ // +1 for padding.
16
+ const SPACE : & [ u8 ] = & [ b' ' ; MAX_EXERCISE_NAME_LEN + 1 ] ;
14
17
15
18
fn next_ln < const CLEAR_LAST_CHAR : bool > ( stdout : & mut StdoutLock ) -> io:: Result < ( ) > {
16
19
if CLEAR_LAST_CHAR {
@@ -74,46 +77,24 @@ impl<'a> ListState<'a> {
74
77
separator : "─" . as_bytes ( ) . repeat ( term_width as usize ) ,
75
78
} ;
76
79
77
- slf. redraw ( stdout) ?;
80
+ slf. draw ( stdout) ?;
78
81
79
82
Ok ( slf)
80
83
}
81
84
82
- pub fn redraw ( & mut self , stdout : & mut StdoutLock ) -> io:: Result < ( ) > {
83
- if self . term_height == 0 {
84
- return Ok ( ( ) ) ;
85
- }
86
-
87
- stdout. queue ( BeginSynchronizedUpdate ) ?. queue ( MoveTo ( 0 , 0 ) ) ?;
88
-
89
- // +1 for padding.
90
- const SPACE : & [ u8 ] = & [ b' ' ; MAX_EXERCISE_NAME_LEN + 1 ] ;
91
- stdout. write_all ( b" Current State Name" ) ?;
92
- stdout. write_all ( & SPACE [ ..self . name_col_width - 2 ] ) ?;
93
- stdout. write_all ( b"Path" ) ?;
94
- next_ln :: < true > ( stdout) ?;
95
-
96
- let narrow = self . term_width < 95 ;
97
- let show_footer = self . term_height > 6 ;
98
- let max_n_rows_to_display =
99
- ( self . term_height - 1 - u16:: from ( show_footer) * ( 4 + u16:: from ( narrow) ) ) as usize ;
100
-
101
- let displayed_exercises = self
102
- . app_state
103
- . exercises ( )
104
- . iter ( )
105
- . enumerate ( )
106
- . filter ( |( _, exercise) | match self . filter {
107
- Filter :: Done => exercise. done ,
108
- Filter :: Pending => !exercise. done ,
109
- Filter :: None => true ,
110
- } )
111
- . skip ( self . offset )
112
- . take ( max_n_rows_to_display) ;
113
-
85
+ fn draw_rows (
86
+ & self ,
87
+ stdout : & mut StdoutLock ,
88
+ max_n_rows_to_display : usize ,
89
+ filtered_exercises : impl Iterator < Item = ( usize , & ' a Exercise ) > ,
90
+ ) -> io:: Result < usize > {
114
91
let current_exercise_ind = self . app_state . current_exercise_ind ( ) ;
115
92
let mut n_displayed_rows = 0 ;
116
- for ( exercise_ind, exercise) in displayed_exercises {
93
+
94
+ for ( exercise_ind, exercise) in filtered_exercises
95
+ . skip ( self . offset )
96
+ . take ( max_n_rows_to_display)
97
+ {
117
98
if self . selected == Some ( n_displayed_rows) {
118
99
stdout. queue ( SetBackgroundColor ( Color :: Rgb {
119
100
r : 50 ,
@@ -152,6 +133,43 @@ impl<'a> ListState<'a> {
152
133
n_displayed_rows += 1 ;
153
134
}
154
135
136
+ Ok ( n_displayed_rows)
137
+ }
138
+
139
+ pub fn draw ( & mut self , stdout : & mut StdoutLock ) -> io:: Result < ( ) > {
140
+ if self . term_height == 0 {
141
+ return Ok ( ( ) ) ;
142
+ }
143
+
144
+ stdout. queue ( BeginSynchronizedUpdate ) ?. queue ( MoveTo ( 0 , 0 ) ) ?;
145
+
146
+ // Header
147
+ stdout. write_all ( b" Current State Name" ) ?;
148
+ stdout. write_all ( & SPACE [ ..self . name_col_width - 2 ] ) ?;
149
+ stdout. write_all ( b"Path" ) ?;
150
+ next_ln :: < true > ( stdout) ?;
151
+
152
+ let narrow = self . term_width < 95 ;
153
+ let show_footer = self . term_height > 6 ;
154
+ let max_n_rows_to_display =
155
+ ( self . term_height - 1 - u16:: from ( show_footer) * ( 4 + u16:: from ( narrow) ) ) as usize ;
156
+
157
+ // Rows
158
+ let iter = self . app_state . exercises ( ) . iter ( ) . enumerate ( ) ;
159
+ let n_displayed_rows = match self . filter {
160
+ Filter :: Done => self . draw_rows (
161
+ stdout,
162
+ max_n_rows_to_display,
163
+ iter. filter ( |( _, exercise) | exercise. done ) ,
164
+ ) ?,
165
+ Filter :: Pending => self . draw_rows (
166
+ stdout,
167
+ max_n_rows_to_display,
168
+ iter. filter ( |( _, exercise) | !exercise. done ) ,
169
+ ) ?,
170
+ Filter :: None => self . draw_rows ( stdout, max_n_rows_to_display, iter) ?,
171
+ } ;
172
+
155
173
for _ in 0 ..max_n_rows_to_display - n_displayed_rows {
156
174
next_ln :: < false > ( stdout) ?;
157
175
}
@@ -172,7 +190,7 @@ impl<'a> ListState<'a> {
172
190
next_ln :: < false > ( stdout) ?;
173
191
174
192
if self . message . is_empty ( ) {
175
- // Help footer.
193
+ // Help footer
176
194
stdout. write_all (
177
195
"↓/j ↑/k home/g end/G │ <c>ontinue at │ <r>eset exercise │" . as_bytes ( ) ,
178
196
) ?;
0 commit comments