aboutsummaryrefslogtreecommitdiffstats
path: root/src/tui/ui.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/tui/ui.rs')
-rw-r--r--src/tui/ui.rs24
1 files changed, 6 insertions, 18 deletions
diff --git a/src/tui/ui.rs b/src/tui/ui.rs
index a38834a..4a243ad 100644
--- a/src/tui/ui.rs
+++ b/src/tui/ui.rs
@@ -90,37 +90,25 @@ fn draw_center(f: &mut Frame, area: Rect, state: &AppState) {
}
fn draw_chat_log(f: &mut Frame, area: Rect, state: &AppState) {
- let inner_height = area.height.saturating_sub(2) as usize; // subtract borders
-
- // Build all rendered lines first so we can scroll from the bottom
let lines: Vec<Line> = state
.messages
.iter()
.map(|msg| render_chat_line(msg))
.collect();
- // Apply scroll offset
- // scroll=0 means pinned to bottom (newest). scroll=N means N lines back from bottom.
- let total = lines.len();
- let max_scroll = total.saturating_sub(inner_height);
- let scroll = state.scroll.min(max_scroll);
- let visible_start = total.saturating_sub(inner_height + scroll);
- let visible: Vec<Line> = lines
- .into_iter()
- .skip(visible_start)
- .take(inner_height)
- .collect();
-
let block = Block::default()
.borders(Borders::ALL)
.border_type(BorderType::Plain)
.border_style(Style::default().fg(ORANGE))
.style(Style::default().bg(BG));
+ let inner_height = area.height.saturating_sub(2) as usize;
+ let scroll = lines.len().saturating_sub(inner_height);
f.render_widget(
- Paragraph::new(Text::from(visible))
+ Paragraph::new(Text::from(lines))
.block(block)
- .wrap(Wrap { trim: false }),
+ .wrap(Wrap { trim: false })
+ .scroll((scroll as u16, 0)),
area,
);
}
@@ -232,7 +220,7 @@ fn draw_statusbar(f: &mut Frame, area: Rect, state: &AppState) {
Span::styled(" │ ", Style::default().fg(FG)),
Span::styled(&state.status, Style::default().fg(FG)),
Span::styled(" │ ", Style::default().fg(FG)),
- Span::styled("PgUp/Dn scroll Ctrl-C quit", Style::default().fg(FG)),
+ Span::styled("Ctrl-C quit", Style::default().fg(FG)),
]);
f.render_widget(Paragraph::new(line).style(Style::default()), area);