Fix rendering of gutter diff hunks that extend to EOF, w/o newline (#23790)

Release Notes:

- N/A
This commit is contained in:
Max Brunsfeld 2025-01-28 10:27:19 -08:00 committed by GitHub
parent 47dcbdfe51
commit 7b901caf8f
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -78,7 +78,7 @@ use workspace::{item::Item, notifications::NotifyTaskExt, Workspace};
const INLINE_BLAME_PADDING_EM_WIDTHS: f32 = 7.;
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum DisplayDiffHunk {
enum DisplayDiffHunk {
Folded {
display_row: DisplayRow,
},
@ -1552,16 +1552,19 @@ impl EditorElement {
let hunk_display_start = snapshot.point_to_display_point(hunk_start_point, Bias::Left);
let hunk_display_end = snapshot.point_to_display_point(hunk_end_point, Bias::Right);
let display_hunk = if hunk_display_start.column() != 0 || hunk_display_end.column() != 0
{
let display_hunk = if hunk_display_start.column() != 0 {
DisplayDiffHunk::Folded {
display_row: hunk_display_start.row(),
}
} else {
let mut end_row = hunk_display_end.row();
if hunk_display_end.column() > 0 {
end_row.0 += 1;
}
DisplayDiffHunk::Unfolded {
status: hunk.status(),
diff_base_byte_range: hunk.diff_base_byte_range,
display_row_range: hunk_display_start.row()..hunk_display_end.row(),
display_row_range: hunk_display_start.row()..end_row,
multi_buffer_range: Anchor::range_in_buffer(
hunk.excerpt_id,
hunk.buffer_id,
@ -4225,7 +4228,7 @@ impl EditorElement {
});
}
pub(super) fn diff_hunk_bounds(
fn diff_hunk_bounds(
snapshot: &EditorSnapshot,
line_height: Pixels,
gutter_bounds: Bounds<Pixels>,
@ -4233,15 +4236,14 @@ impl EditorElement {
) -> Bounds<Pixels> {
let scroll_position = snapshot.scroll_position();
let scroll_top = scroll_position.y * line_height;
let gutter_strip_width = (0.275 * line_height).floor();
match hunk {
DisplayDiffHunk::Folded { display_row, .. } => {
let start_y = display_row.as_f32() * line_height - scroll_top;
let end_y = start_y + line_height;
let width = Self::diff_hunk_strip_width(line_height);
let highlight_origin = gutter_bounds.origin + point(px(0.), start_y);
let highlight_size = size(width, end_y - start_y);
let highlight_size = size(gutter_strip_width, end_y - start_y);
Bounds::new(highlight_origin, highlight_size)
}
DisplayDiffHunk::Unfolded {
@ -4283,21 +4285,14 @@ impl EditorElement {
let start_y = start_row.as_f32() * line_height - scroll_top;
let end_y = end_row_in_current_excerpt.as_f32() * line_height - scroll_top;
let width = Self::diff_hunk_strip_width(line_height);
let highlight_origin = gutter_bounds.origin + point(px(0.), start_y);
let highlight_size = size(width, end_y - start_y);
let highlight_size = size(gutter_strip_width, end_y - start_y);
Bounds::new(highlight_origin, highlight_size)
}
}
}
}
/// Returns the width of the diff strip that will be displayed in the gutter.
pub(super) fn diff_hunk_strip_width(line_height: Pixels) -> Pixels {
// We floor the value to prevent pixel rounding.
(0.275 * line_height).floor()
}
fn paint_gutter_indicators(
&self,
layout: &mut EditorLayout,
@ -5213,7 +5208,7 @@ impl EditorElement {
let editor = self.editor.clone();
let text_hitbox = layout.text_hitbox.clone();
let gutter_hitbox = layout.gutter_hitbox.clone();
let hovered_hunk =
let multi_buffer_range =
layout
.display_hunks
.iter()
@ -5242,7 +5237,7 @@ impl EditorElement {
Self::mouse_left_down(
editor,
event,
hovered_hunk.clone(),
multi_buffer_range.clone(),
&position_map,
&text_hitbox,
&gutter_hitbox,