Skip to content

Commit

Permalink
Avoid asking for terminal size on each rendering
Browse files Browse the repository at this point in the history
  • Loading branch information
mo8it committed Sep 5, 2024
1 parent bcc2a13 commit 9faa5d3
Show file tree
Hide file tree
Showing 3 changed files with 27 additions and 11 deletions.
8 changes: 5 additions & 3 deletions src/watch.rs
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ mod terminal_event;
enum WatchEvent {
Input(InputEvent),
FileChange { exercise_ind: usize },
TerminalResize,
TerminalResize { width: u16 },
NotifyErr(notify::Error),
TerminalEventErr(io::Error),
}
Expand Down Expand Up @@ -72,7 +72,7 @@ fn run_watch(
None
};

let mut watch_state = WatchState::new(app_state, manual_run);
let mut watch_state = WatchState::build(app_state, manual_run)?;

let mut stdout = io::stdout().lock();
watch_state.run_current_exercise(&mut stdout)?;
Expand All @@ -96,7 +96,9 @@ fn run_watch(
WatchEvent::FileChange { exercise_ind } => {
watch_state.handle_file_change(exercise_ind, &mut stdout)?;
}
WatchEvent::TerminalResize => watch_state.render(&mut stdout)?,
WatchEvent::TerminalResize { width } => {
watch_state.update_term_width(width, &mut stdout)?;
}
WatchEvent::NotifyErr(e) => return Err(Error::from(e).context(NOTIFY_ERR)),
WatchEvent::TerminalEventErr(e) => {
return Err(Error::from(e).context("Terminal event listener failed"));
Expand Down
26 changes: 20 additions & 6 deletions src/watch/state.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
use anyhow::Result;
use anyhow::{Context, Result};
use crossterm::{
style::{
Attribute, Attributes, Color, ResetColor, SetAttribute, SetAttributes, SetForegroundColor,
Expand Down Expand Up @@ -27,17 +27,23 @@ pub struct WatchState<'a> {
show_hint: bool,
done_status: DoneStatus,
manual_run: bool,
term_width: u16,
}

impl<'a> WatchState<'a> {
pub fn new(app_state: &'a mut AppState, manual_run: bool) -> Self {
Self {
pub fn build(app_state: &'a mut AppState, manual_run: bool) -> Result<Self> {
let term_width = terminal::size()
.context("Failed to get the terminal size")?
.0;

Ok(Self {
app_state,
output: Vec::with_capacity(OUTPUT_CAPACITY),
show_hint: false,
done_status: DoneStatus::Pending,
manual_run,
}
term_width,
})
}

pub fn run_current_exercise(&mut self, stdout: &mut StdoutLock) -> Result<()> {
Expand Down Expand Up @@ -175,12 +181,11 @@ impl<'a> WatchState<'a> {
)?;
}

let line_width = terminal::size()?.0;
progress_bar(
stdout,
self.app_state.n_done(),
self.app_state.exercises().len() as u16,
line_width,
self.term_width,
)?;

stdout.write_all(b"\nCurrent exercise: ")?;
Expand All @@ -202,4 +207,13 @@ impl<'a> WatchState<'a> {

Ok(())
}

pub fn update_term_width(&mut self, width: u16, stdout: &mut StdoutLock) -> io::Result<()> {
if self.term_width != width {
self.term_width = width;
self.render(stdout)?;
}

Ok(())
}
}
4 changes: 2 additions & 2 deletions src/watch/terminal_event.rs
Original file line number Diff line number Diff line change
Expand Up @@ -43,8 +43,8 @@ pub fn terminal_event_handler(tx: Sender<WatchEvent>, manual_run: bool) {
return;
}
}
Event::Resize(_, _) => {
if tx.send(WatchEvent::TerminalResize).is_err() {
Event::Resize(width, _) => {
if tx.send(WatchEvent::TerminalResize { width }).is_err() {
return;
}
}
Expand Down

0 comments on commit 9faa5d3

Please sign in to comment.