ratatui_toolkit/widgets/code_diff/widget/methods/helpers/
render_diff_content.rs1use ratatui::buffer::Buffer;
4use ratatui::layout::Rect;
5use ratatui::style::Style;
6use ratatui::widgets::{Block, BorderType, Borders, Widget};
7
8use crate::widgets::code_diff::code_diff::methods::helpers::{render_header, render_side_by_side};
9use crate::widgets::code_diff::code_diff::CodeDiff;
10use crate::widgets::code_diff::enums::DiffStyle;
11
12pub fn render_diff_content(diff: &CodeDiff, area: Rect, buf: &mut Buffer, show_border: bool) {
21 if area.width < 3 || area.height < 3 {
22 return;
23 }
24
25 let theme = &diff.theme;
26
27 let content_area = if show_border {
28 let border_style = if !diff.sidebar_focused && diff.config.sidebar_enabled {
30 Style::default().fg(theme.border_active)
31 } else {
32 Style::default().fg(theme.border)
33 };
34
35 let title = diff
36 .file_path
37 .as_ref()
38 .map(|p| format!(" {} ", p))
39 .unwrap_or_else(|| " Diff ".to_string());
40
41 let block = Block::default()
42 .borders(Borders::ALL)
43 .border_type(BorderType::Rounded)
44 .border_style(border_style)
45 .title(title);
46
47 let inner_area = block.inner(area);
48 block.render(area, buf);
49 inner_area
50 } else {
51 area
52 };
53
54 if content_area.width == 0 || content_area.height == 0 {
55 return;
56 }
57
58 let header_height = render_header(diff, content_area, buf);
60
61 let diff_area = Rect {
63 x: content_area.x,
64 y: content_area.y + header_height,
65 width: content_area.width,
66 height: content_area.height.saturating_sub(header_height),
67 };
68
69 if diff_area.height == 0 {
70 return;
71 }
72
73 match diff.config.style {
75 DiffStyle::SideBySide => {
76 render_side_by_side(diff, diff_area, buf);
77 }
78 DiffStyle::Unified | DiffStyle::Inline => {
79 render_side_by_side(diff, diff_area, buf);
81 }
82 }
83}