Color staged and unstaged hunks differently by opacity (#25108)

Release Notes:

- Make staged diff hunks appear as more opaque than unstaged hunks

---------

Co-authored-by: Nate Butler <iamnbutler@gmail.com>
This commit is contained in:
Cole Miller 2025-02-19 13:33:21 -05:00 committed by GitHub
parent c9bd44f983
commit 8e17b34eff
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
11 changed files with 265 additions and 175 deletions

View file

@ -9,6 +9,7 @@ pub use position::{TypedOffset, TypedPoint, TypedRow};
use anyhow::{anyhow, Result};
use buffer_diff::{
BufferDiff, BufferDiffEvent, BufferDiffSnapshot, DiffHunkSecondaryStatus, DiffHunkStatus,
DiffHunkStatusKind,
};
use clock::ReplicaId;
use collections::{BTreeMap, Bound, HashMap, HashSet};
@ -135,12 +136,16 @@ pub struct MultiBufferDiffHunk {
impl MultiBufferDiffHunk {
pub fn status(&self) -> DiffHunkStatus {
if self.buffer_range.start == self.buffer_range.end {
DiffHunkStatus::Removed(self.secondary_status)
let kind = if self.buffer_range.start == self.buffer_range.end {
DiffHunkStatusKind::Deleted
} else if self.diff_base_byte_range.is_empty() {
DiffHunkStatus::Added(self.secondary_status)
DiffHunkStatusKind::Added
} else {
DiffHunkStatus::Modified(self.secondary_status)
DiffHunkStatusKind::Modified
};
DiffHunkStatus {
kind,
secondary: self.secondary_status,
}
}
}
@ -6210,7 +6215,7 @@ where
excerpt,
has_trailing_newline: *has_trailing_newline,
is_main_buffer: false,
diff_hunk_status: Some(DiffHunkStatus::Removed(
diff_hunk_status: Some(DiffHunkStatus::deleted(
hunk_info.hunk_secondary_status,
)),
buffer_range: buffer_start..buffer_end,
@ -6256,7 +6261,7 @@ where
has_trailing_newline,
is_main_buffer: true,
diff_hunk_status: inserted_hunk_info
.map(|info| DiffHunkStatus::Added(info.hunk_secondary_status)),
.map(|info| DiffHunkStatus::added(info.hunk_secondary_status)),
buffer_range: buffer_start..buffer_end,
range: start..end,
})

View file

@ -1,5 +1,5 @@
use super::*;
use buffer_diff::DiffHunkStatus;
use buffer_diff::{DiffHunkStatus, DiffHunkStatusKind};
use gpui::{App, TestAppContext};
use indoc::indoc;
use language::{Buffer, Rope};
@ -1325,13 +1325,13 @@ fn test_basic_diff_hunks(cx: &mut TestAppContext) {
.map(|info| (info.buffer_row, info.diff_status))
.collect::<Vec<_>>(),
vec![
(Some(0), Some(DiffHunkStatus::added())),
(Some(0), Some(DiffHunkStatus::added_none())),
(Some(1), None),
(Some(1), Some(DiffHunkStatus::removed())),
(Some(2), Some(DiffHunkStatus::added())),
(Some(1), Some(DiffHunkStatus::deleted_none())),
(Some(2), Some(DiffHunkStatus::added_none())),
(Some(3), None),
(Some(3), Some(DiffHunkStatus::removed())),
(Some(4), Some(DiffHunkStatus::removed())),
(Some(3), Some(DiffHunkStatus::deleted_none())),
(Some(4), Some(DiffHunkStatus::deleted_none())),
(Some(4), None),
(Some(5), None)
]
@ -2279,7 +2279,7 @@ impl ReferenceMultibuffer {
buffer_start: Some(
base_buffer.offset_to_point(hunk.diff_base_byte_range.start),
),
status: Some(DiffHunkStatus::Removed(hunk.secondary_status)),
status: Some(DiffHunkStatus::deleted(hunk.secondary_status)),
});
}
@ -2294,7 +2294,7 @@ impl ReferenceMultibuffer {
buffer_id: Some(buffer.remote_id()),
range: len..text.len(),
buffer_start: Some(buffer.offset_to_point(offset)),
status: Some(DiffHunkStatus::Added(hunk.secondary_status)),
status: Some(DiffHunkStatus::added(hunk.secondary_status)),
});
offset = hunk_range.end;
}
@ -2664,13 +2664,13 @@ async fn test_random_multibuffer(cx: &mut TestAppContext, mut rng: StdRng) {
snapshot.widest_line_number(),
expected_row_infos
.into_iter()
.filter_map(
|info| if matches!(info.diff_status, Some(DiffHunkStatus::Removed(_))) {
.filter_map(|info| {
if info.diff_status.is_some_and(|status| status.is_deleted()) {
None
} else {
info.buffer_row
}
)
})
.max()
.unwrap()
+ 1
@ -3021,10 +3021,10 @@ fn format_diff(
.enumerate()
.zip(row_infos)
.map(|((ix, line), info)| {
let marker = match info.diff_status {
Some(DiffHunkStatus::Added(_)) => "+ ",
Some(DiffHunkStatus::Removed(_)) => "- ",
Some(DiffHunkStatus::Modified(_)) => unreachable!(),
let marker = match info.diff_status.map(|status| status.kind) {
Some(DiffHunkStatusKind::Added) => "+ ",
Some(DiffHunkStatusKind::Deleted) => "- ",
Some(DiffHunkStatusKind::Modified) => unreachable!(),
None => {
if has_diff && !line.is_empty() {
" "