summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/history.rs9
-rw-r--r--src/state.rs17
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<usize>,
) -> 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(())