codetether_agent/tui/ui/chat_view/
lines.rs1use ratatui::text::Line;
7
8use crate::tui::app::state::App;
9use crate::tui::color_palette::ColorPalette;
10use crate::tui::message_formatter::MessageFormatter;
11use crate::tui::ui::tool_panel::build_render_entries;
12
13use super::empty::push_empty_placeholder;
14use super::entries::append_entries;
15use super::streaming::push_streaming_preview;
16
17pub fn build_chat_lines(
28 app: &mut App,
29 max_width: usize,
30 content_width: usize,
31 formatter: &MessageFormatter,
32 palette: &ColorPalette,
33) -> Vec<Line<'static>> {
34 if let Some(cached) = app.state.get_or_build_message_lines(max_width) {
35 return cached;
36 }
37 let separator_width = content_width.saturating_sub(2).min(60);
38 let panel_width = content_width.saturating_sub(4);
39
40 if let Some(mut lines) = app.state.clone_frozen_prefix(max_width) {
43 let frozen_len = lines.len();
44 push_streaming_preview(&mut lines, &app.state, separator_width, formatter);
45 app.state
46 .store_message_lines_with_frozen(lines.clone(), max_width, frozen_len);
47 return lines;
48 }
49
50 let mut lines = Vec::new();
51 let entries = build_render_entries(&app.state.messages);
52 if entries.is_empty() {
53 push_empty_placeholder(&mut lines);
54 app.state.set_tool_preview_max_scroll(0);
55 } else {
56 let result = append_entries(
57 &mut lines,
58 &entries,
59 separator_width,
60 panel_width,
61 app.state.tool_preview_scroll,
62 formatter,
63 palette,
64 );
65 app.state
66 .set_tool_preview_max_scroll(result.tool_preview_max_scroll);
67 }
68 let frozen_len = lines.len();
69 push_streaming_preview(&mut lines, &app.state, separator_width, formatter);
70 app.state
71 .store_message_lines_with_frozen(lines.clone(), max_width, frozen_len);
72 lines
73}