diff --git a/codex-rs/tui/src/pager_overlay.rs b/codex-rs/tui/src/pager_overlay.rs index 9395fb71..84c325b6 100644 --- a/codex-rs/tui/src/pager_overlay.rs +++ b/codex-rs/tui/src/pager_overlay.rs @@ -26,6 +26,7 @@ use ratatui::widgets::Clear; use ratatui::widgets::Paragraph; use ratatui::widgets::Widget; use ratatui::widgets::WidgetRef; +use ratatui::widgets::Wrap; pub(crate) enum Overlay { Transcript(TranscriptOverlay), @@ -329,9 +330,9 @@ struct CachedRenderable { } impl CachedRenderable { - fn new(renderable: Box) -> Self { + fn new(renderable: impl Into>) -> Self { Self { - renderable, + renderable: renderable.into(), height: std::cell::Cell::new(None), last_width: std::cell::Cell::new(None), } @@ -400,19 +401,19 @@ impl TranscriptOverlay { .flat_map(|(i, c)| { let mut v: Vec> = Vec::new(); let mut cell_renderable = if c.as_any().is::() { - Box::new(CachedRenderable::new(Box::new(CellRenderable { + Box::new(CachedRenderable::new(CellRenderable { cell: c.clone(), style: if highlight_cell == Some(i) { user_message_style().reversed() } else { user_message_style() }, - }))) as Box + })) as Box } else { - Box::new(CachedRenderable::new(Box::new(CellRenderable { + Box::new(CachedRenderable::new(CellRenderable { cell: c.clone(), style: Style::default(), - }))) as Box + })) as Box }; if !c.is_stream_continuation() && i > 0 { cell_renderable = Box::new(InsetRenderable::new( @@ -496,12 +497,8 @@ pub(crate) struct StaticOverlay { impl StaticOverlay { pub(crate) fn with_title(lines: Vec>, title: String) -> Self { - Self::with_renderables( - vec![Box::new(CachedRenderable::new(Box::new(Paragraph::new( - Text::from(lines), - ))))], - title, - ) + let paragraph = Paragraph::new(Text::from(lines)).wrap(Wrap { trim: false }); + Self::with_renderables(vec![Box::new(CachedRenderable::new(paragraph))], title) } pub(crate) fn with_renderables(renderables: Vec>, title: String) -> Self { @@ -812,6 +809,18 @@ mod tests { assert_snapshot!(term.backend()); } + #[test] + fn static_overlay_wraps_long_lines() { + let mut overlay = StaticOverlay::with_title( + vec!["a very long line that should wrap when rendered within a narrow pager overlay width".into()], + "S T A T I C".to_string(), + ); + let mut term = Terminal::new(TestBackend::new(24, 8)).expect("term"); + term.draw(|f| overlay.render(f.area(), f.buffer_mut())) + .expect("draw"); + assert_snapshot!(term.backend()); + } + #[test] fn pager_view_content_height_counts_renderables() { let pv = PagerView::new( diff --git a/codex-rs/tui/src/snapshots/codex_tui__pager_overlay__tests__static_overlay_wraps_long_lines.snap b/codex-rs/tui/src/snapshots/codex_tui__pager_overlay__tests__static_overlay_wraps_long_lines.snap new file mode 100644 index 00000000..2dfab2aa --- /dev/null +++ b/codex-rs/tui/src/snapshots/codex_tui__pager_overlay__tests__static_overlay_wraps_long_lines.snap @@ -0,0 +1,13 @@ +--- +source: tui/src/pager_overlay.rs +assertion_line: 798 +expression: term.backend() +--- +"/ S T A T I C / / / / / " +"a very long line that " +"should wrap when " +"rendered within a narrow" +"─────────────────── 0% ─" +" ↑/↓ to scroll pgup/pg" +" q to quit " +" "