ratatui_toolkit/widgets/code_diff/widget/methods/helpers/
render_diff_content.rs

1//! Helper function to render the diff content panel.
2
3use 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
12/// Renders the diff content panel with border.
13///
14/// # Arguments
15///
16/// * `diff` - The CodeDiff instance
17/// * `area` - The area to render the diff in
18/// * `buf` - The buffer to render to
19/// * `show_border` - Whether to show a border around the diff
20pub 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        // Create border with focus indicator
29        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    // Render header (file stats)
59    let header_height = render_header(diff, content_area, buf);
60
61    // Calculate area for diff content
62    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    // Render based on style
74    match diff.config.style {
75        DiffStyle::SideBySide => {
76            render_side_by_side(diff, diff_area, buf);
77        }
78        DiffStyle::Unified | DiffStyle::Inline => {
79            // For now, unified and inline fall back to side-by-side
80            render_side_by_side(diff, diff_area, buf);
81        }
82    }
83}