From 06726a28d35a2ae0f447add573c2892d72ebb148 Mon Sep 17 00:00:00 2001 From: Cole Miller Date: Mon, 17 Feb 2025 23:45:37 -0500 Subject: [PATCH] Revert splitting display diff hunks (#25020) This PR reverts two recent commits that changed our gutter highlights to mark separately the deleted and added portions of an expanded modification hunk. It returns to the previous status quo where the gutter highlight for an expanded modification hunk has the same color for the deleted and added portions. Release Notes: - N/A --- crates/editor/src/element.rs | 159 +++++++++-------------------------- 1 file changed, 39 insertions(+), 120 deletions(-) diff --git a/crates/editor/src/element.rs b/crates/editor/src/element.rs index 805ce47ef2bc1dd86efd256a82c3a79585577bbd..2e022ec2f338d02a2df0b750c3133e92b90b3eb8 100644 --- a/crates/editor/src/element.rs +++ b/crates/editor/src/element.rs @@ -79,19 +79,17 @@ use workspace::{item::Item, notifications::NotifyTaskExt, Workspace}; const INLINE_BLAME_PADDING_EM_WIDTHS: f32 = 7.; -/// Note that for a "modified" MultiBufferDiffHunk, there are two DisplayDiffHunks, -/// one for the deleted portion and one for the added portion. #[derive(Debug, Clone, PartialEq, Eq)] enum DisplayDiffHunk { Folded { display_row: DisplayRow, }, Unfolded { + diff_base_byte_range: Range, display_row_range: Range, multi_buffer_range: Range, status: DiffHunkStatus, - expanded: bool, - is_primary: bool, + contains_expanded: bool, }, } @@ -106,7 +104,7 @@ struct SelectionLayout { } impl SelectionLayout { - fn new( + fn new( selection: Selection, line_mode: bool, cursor_shape: CursorShape, @@ -1562,100 +1560,36 @@ impl EditorElement { let hunk_end_point = Point::new(hunk.row_range.end.0, 0); let hunk_display_start = snapshot.point_to_display_point(hunk_start_point, Bias::Left); - let hunk_added_start_at = - Anchor::in_buffer(hunk.excerpt_id, hunk.buffer_id, hunk.buffer_range.start); - let hunk_deleted_to_added_break = snapshot.point_to_display_point( - hunk_added_start_at.to_point(&snapshot.buffer_snapshot), - Bias::Right, - ); - let hunk_display_end = snapshot.point_to_display_point(hunk_end_point, Bias::Right); - if hunk_display_start.column() != 0 { - display_hunks.push(( - DisplayDiffHunk::Folded { - display_row: hunk_display_start.row(), - }, - None, - )); + 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; } - let deleted_count = snapshot - .buffer_snapshot - .row_infos(hunk.row_range.start) - .take(hunk.row_range.end.0 as usize - hunk.row_range.start.0 as usize) - .take_while(|row_info| { - matches!(row_info.diff_status, Some(DiffHunkStatus::Removed(_))) - }) - .count(); - let has_added = snapshot - .buffer_snapshot - .row_infos(hunk.row_range.start) - .take(hunk.row_range.end.0 as usize - hunk.row_range.start.0 as usize) - .any(|row_info| matches!(row_info.diff_status, Some(DiffHunkStatus::Added(_)))); - let expanded = deleted_count > 0 || has_added; - if deleted_count > 0 && has_added { - display_hunks.push(( - DisplayDiffHunk::Unfolded { - status: DiffHunkStatus::Removed(hunk.secondary_status), - display_row_range: hunk_display_start.row() - ..hunk_display_start.row() + DisplayRow(deleted_count as u32), - multi_buffer_range: Anchor::range_in_buffer( - hunk.excerpt_id, - hunk.buffer_id, - hunk.buffer_range.clone(), - ), - expanded, - is_primary: true, - }, - None, - )); - display_hunks.push(( - DisplayDiffHunk::Unfolded { - status: DiffHunkStatus::Added(hunk.secondary_status), - display_row_range: hunk_display_start.row() - + DisplayRow(deleted_count as u32) - ..end_row, - multi_buffer_range: Anchor::range_in_buffer( - hunk.excerpt_id, - hunk.buffer_id, - hunk.buffer_range, - ), - expanded, - is_primary: false, - }, - None, - )); - } else { - let status = if expanded && matches!(hunk.status(), DiffHunkStatus::Modified(_)) - { - if hunk_display_start.row() < hunk_deleted_to_added_break.row() { - DiffHunkStatus::Removed(hunk.secondary_status) - } else { - DiffHunkStatus::Added(hunk.secondary_status) - } - } else { - hunk.status() - }; - display_hunks.push(( - DisplayDiffHunk::Unfolded { - status, - display_row_range: hunk_display_start.row()..end_row, - multi_buffer_range: Anchor::range_in_buffer( - hunk.excerpt_id, - hunk.buffer_id, - hunk.buffer_range, - ), - expanded, - is_primary: true, - }, - None, - )); + let start_row = hunk_display_start.row(); + let contains_expanded = snapshot + .row_infos(start_row) + .take(end_row.0 as usize - start_row.0 as usize) + .any(|row_info| row_info.diff_status.is_some()); + DisplayDiffHunk::Unfolded { + status: hunk.status(), + diff_base_byte_range: hunk.diff_base_byte_range, + display_row_range: hunk_display_start.row()..end_row, + multi_buffer_range: Anchor::range_in_buffer( + hunk.excerpt_id, + hunk.buffer_id, + hunk.buffer_range, + ), + contains_expanded, } }; + + display_hunks.push((display_hunk, None)); } let git_gutter_setting = ProjectSettings::get_global(cx) @@ -1993,8 +1927,7 @@ impl EditorElement { if tasks.offset.0 < offset_range_start || tasks.offset.0 >= offset_range_end { return None; } - let multibuffer_point = - multi_buffer::ToPoint::to_point(&tasks.offset.0, &snapshot.buffer_snapshot); + let multibuffer_point = tasks.offset.0.to_point(&snapshot.buffer_snapshot); let multibuffer_row = MultiBufferRow(multibuffer_point.row); let buffer_folded = snapshot .buffer_snapshot @@ -4213,29 +4146,14 @@ impl EditorElement { newest_cursor_position, ]; - let mut display_hunks = display_hunks.iter().peekable(); - while let Some((hunk, _)) = display_hunks.next() { + for (hunk, _) in display_hunks { if let DisplayDiffHunk::Unfolded { display_row_range, multi_buffer_range, status, - is_primary: true, .. } = &hunk { - let mut display_row_range = display_row_range.clone(); - if let Some(( - DisplayDiffHunk::Unfolded { - display_row_range: secondary_display_row_range, - is_primary: false, - .. - }, - _, - )) = display_hunks.peek() - { - display_row_range.end = secondary_display_row_range.end; - } - if display_row_range.start < row_range.start || display_row_range.start >= row_range.end { @@ -4665,7 +4583,7 @@ impl EditorElement { DisplayDiffHunk::Unfolded { status, display_row_range, - expanded, + contains_expanded, .. } => hitbox.as_ref().map(|hunk_hitbox| match status { DiffHunkStatus::Added(secondary_status) => ( @@ -4673,14 +4591,14 @@ impl EditorElement { cx.theme().colors().version_control_added.opacity(0.7), corners, secondary_status, - *expanded, + *contains_expanded, ), DiffHunkStatus::Modified(secondary_status) => ( hunk_hitbox.bounds, cx.theme().colors().version_control_modified.opacity(0.7), corners, secondary_status, - *expanded, + *contains_expanded, ), DiffHunkStatus::Removed(secondary_status) if !display_row_range.is_empty() => @@ -4690,7 +4608,7 @@ impl EditorElement { cx.theme().colors().version_control_deleted.opacity(0.7), corners, secondary_status, - *expanded, + *contains_expanded, ) } DiffHunkStatus::Removed(secondary_status) => ( @@ -4704,7 +4622,7 @@ impl EditorElement { cx.theme().colors().version_control_deleted.opacity(0.7), Corners::all(1. * line_height), secondary_status, - *expanded, + *contains_expanded, ), }), }; @@ -4714,15 +4632,16 @@ impl EditorElement { background_color, corner_radii, secondary_status, - expanded, + contains_expanded, )) = hunk_to_paint { - let background = - if *secondary_status != DiffHunkSecondaryStatus::None && expanded { - pattern_slash(background_color, line_height.0 / 2.5) - } else { - solid_color(background_color) - }; + let background = if *secondary_status != DiffHunkSecondaryStatus::None + && contains_expanded + { + pattern_slash(background_color, line_height.0 / 2.5) + } else { + solid_color(background_color) + }; window.paint_quad(quad( hunk_bounds,