From 7a411e269b59cb7754eadacaf29a18e02845040b Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Thu, 11 Nov 2021 04:36:09 -0500 Subject: handle the focused cursor being past the end of output --- src/history.rs | 9 ++++++++- src/state.rs | 17 ++++++++++------- 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/src/history.rs b/src/history.rs index e5ad161..348224b 100644 --- a/src/history.rs +++ b/src/history.rs @@ -127,10 +127,11 @@ impl History { &self, out: &mut textmode::Output, repl_lines: usize, + focus: Option, ) -> anyhow::Result<()> { let mut used_lines = repl_lines; let mut pos = None; - for entry in self.entries.iter().rev() { + for (idx, entry) in self.entries.iter().enumerate().rev() { let entry = entry.lock_arc().await; let screen = entry.vt.screen(); let mut last_row = 0; @@ -139,6 +140,12 @@ impl History { last_row = idx + 1; } } + if focus == Some(idx) { + last_row = std::cmp::max( + last_row, + screen.cursor_position().0 as usize + 1, + ); + } used_lines += 1 + std::cmp::min(6, last_row); if used_lines > 24 { break; diff --git a/src/state.rs b/src/state.rs index 5a1e1bd..854c306 100644 --- a/src/state.rs +++ b/src/state.rs @@ -25,13 +25,16 @@ impl State { pub async fn render(&mut self) -> anyhow::Result<()> { self.output.clear(); - if let Focus::Readline = self.focus { - self.history - .render(&mut self.output, self.readline.lines()) - .await?; - self.readline.render(&mut self.output).await?; - } else { - self.history.render(&mut self.output, 0).await?; + match self.focus { + Focus::Readline => { + self.history + .render(&mut self.output, self.readline.lines(), None) + .await?; + self.readline.render(&mut self.output).await?; + } + Focus::History(idx) => { + self.history.render(&mut self.output, 0, Some(idx)).await?; + } } self.output.refresh().await?; Ok(()) -- cgit v1.2.3-54-g00ecf