Skip to content

Commit fd2a8c0

Browse files
committed
Separate drawing rows
1 parent b6129ad commit fd2a8c0

File tree

2 files changed

+55
-37
lines changed

2 files changed

+55
-37
lines changed

src/list.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ fn handle_list(app_state: &mut AppState, stdout: &mut StdoutLock) -> Result<()>
8484
Event::FocusGained | Event::FocusLost => continue,
8585
}
8686

87-
list_state.redraw(stdout)?;
87+
list_state.draw(stdout)?;
8888
}
8989
}
9090

src/list/state.rs

Lines changed: 54 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,10 @@ use std::{
1010
io::{self, StdoutLock, Write},
1111
};
1212

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];
1417

1518
fn next_ln<const CLEAR_LAST_CHAR: bool>(stdout: &mut StdoutLock) -> io::Result<()> {
1619
if CLEAR_LAST_CHAR {
@@ -74,46 +77,24 @@ impl<'a> ListState<'a> {
7477
separator: "─".as_bytes().repeat(term_width as usize),
7578
};
7679

77-
slf.redraw(stdout)?;
80+
slf.draw(stdout)?;
7881

7982
Ok(slf)
8083
}
8184

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> {
11491
let current_exercise_ind = self.app_state.current_exercise_ind();
11592
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+
{
11798
if self.selected == Some(n_displayed_rows) {
11899
stdout.queue(SetBackgroundColor(Color::Rgb {
119100
r: 50,
@@ -152,6 +133,43 @@ impl<'a> ListState<'a> {
152133
n_displayed_rows += 1;
153134
}
154135

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+
155173
for _ in 0..max_n_rows_to_display - n_displayed_rows {
156174
next_ln::<false>(stdout)?;
157175
}
@@ -172,7 +190,7 @@ impl<'a> ListState<'a> {
172190
next_ln::<false>(stdout)?;
173191

174192
if self.message.is_empty() {
175-
// Help footer.
193+
// Help footer
176194
stdout.write_all(
177195
"↓/j ↑/k home/g end/G │ <c>ontinue at │ <r>eset exercise │".as_bytes(),
178196
)?;

0 commit comments

Comments
 (0)