(&mut self, frame: &mut Frame, area: Rect)
| 474 | } |
| 475 | |
| 476 | fn render_messages(&mut self, frame: &mut Frame, area: Rect) { |
| 477 | if area.height == 0 || area.width == 0 { |
| 478 | self.last_messages_area = None; |
| 479 | self.rendered_line_count = 0; |
| 480 | self.messages_viewport_height = 0; |
| 481 | self.line_to_message.clear(); |
| 482 | self.message_first_lines.clear(); |
| 483 | return; |
| 484 | } |
| 485 | |
| 486 | let was_near_bottom = self.is_near_bottom(2); |
| 487 | let theme = self.context.theme.read(); |
| 488 | let user_bg = message_palette::user_message_bg(&theme); |
| 489 | let thinking_bg = message_palette::thinking_message_bg(&theme); |
| 490 | let assistant_border = message_palette::assistant_border_color(&theme); |
| 491 | let thinking_border = message_palette::thinking_border_color(&theme); |
| 492 | let show_scrollbar = *self.context.show_scrollbar.read() && area.width > 3; |
| 493 | let messages_area = if show_scrollbar { |
| 494 | Rect { |
| 495 | x: area.x, |
| 496 | y: area.y, |
| 497 | width: area.width.saturating_sub(1), |
| 498 | height: area.height, |
| 499 | } |
| 500 | } else { |
| 501 | area |
| 502 | }; |
| 503 | let scrollbar_area = show_scrollbar.then_some(Rect { |
| 504 | x: area.x + area.width.saturating_sub(1), |
| 505 | y: area.y, |
| 506 | width: 1, |
| 507 | height: area.height, |
| 508 | }); |
| 509 | let content_width = usize::from(messages_area.width.saturating_sub(1)); |
| 510 | let session_ctx = self.context.session.read(); |
| 511 | let show_thinking = *self.context.show_thinking.read(); |
| 512 | let show_timestamps = *self.context.show_timestamps.read(); |
| 513 | let show_tool_details = *self.context.show_tool_details.read(); |
| 514 | let semantic_hl = *self.context.semantic_highlight.read(); |
| 515 | let fallback_model = self.context.current_model.read().clone(); |
| 516 | |
| 517 | let messages = session_ctx |
| 518 | .messages |
| 519 | .get(&self.session_id) |
| 520 | .cloned() |
| 521 | .unwrap_or_default(); |
| 522 | let revert_info = session_ctx.revert.get(&self.session_id).cloned(); |
| 523 | let last_assistant_idx = messages |
| 524 | .iter() |
| 525 | .rposition(|m| matches!(m.role, MessageRole::Assistant)); |
| 526 | |
| 527 | let message_gap_lines = 1usize; |
| 528 | |
| 529 | self.last_messages_area = Some(messages_area); |
| 530 | self.thinking_toggle_hits.clear(); |
| 531 | let mut visible_reasoning_ids = HashSet::new(); |
| 532 | |
| 533 | let mut lines = Vec::new(); |
no test coverage detected