Add staged status information to diff hunks (#24475)

Release Notes:

- Render unstaged hunks in the project diff editor with a slashed
background

---------

Co-authored-by: maxbrunsfeld <max@zed.dev>
Co-authored-by: Max Brunsfeld <maxbrunsfeld@gmail.com>
This commit is contained in:
Cole Miller 2025-02-10 21:43:25 -05:00 committed by GitHub
parent a9de9e3cb4
commit 8f75fe25e5
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
28 changed files with 1132 additions and 753 deletions

View file

@ -51,7 +51,7 @@ struct Background {
// 1u is Oklab color
color_space: u32,
solid: Hsla,
angle: f32,
gradient_angle_or_pattern_height: f32,
colors: array<LinearColorStop, 2>,
pad: u32,
}
@ -310,17 +310,18 @@ fn prepare_gradient_color(tag: u32, color_space: u32,
}
fn gradient_color(background: Background, position: vec2<f32>, bounds: Bounds,
sold_color: vec4<f32>, color0: vec4<f32>, color1: vec4<f32>) -> vec4<f32> {
solid_color: vec4<f32>, color0: vec4<f32>, color1: vec4<f32>) -> vec4<f32> {
var background_color = vec4<f32>(0.0);
switch (background.tag) {
default: {
return sold_color;
return solid_color;
}
case 1u: {
// Linear gradient background.
// -90 degrees to match the CSS gradient angle.
let radians = (background.angle % 360.0 - 90.0) * M_PI_F / 180.0;
let angle = background.gradient_angle_or_pattern_height;
let radians = (angle % 360.0 - 90.0) * M_PI_F / 180.0;
var direction = vec2<f32>(cos(radians), sin(radians));
let stop0_percentage = background.colors[0].percentage;
let stop1_percentage = background.colors[1].percentage;
@ -359,19 +360,18 @@ fn gradient_color(background: Background, position: vec2<f32>, bounds: Bounds,
}
}
case 2u: {
let base_pattern_size = bounds.size.y / 5.0;
let width = base_pattern_size * 0.5;
let slash_spacing = 0.89;
let radians = M_PI_F / 4.0;
let pattern_height = background.gradient_angle_or_pattern_height;
let stripe_angle = M_PI_F / 4.0;
let pattern_period = pattern_height * sin(stripe_angle);
let rotation = mat2x2<f32>(
cos(radians), -sin(radians),
sin(radians), cos(radians)
cos(stripe_angle), -sin(stripe_angle),
sin(stripe_angle), cos(stripe_angle)
);
let relative_position = position - bounds.origin;
let rotated_point = rotation * relative_position;
let pattern = (rotated_point.x / slash_spacing) % (base_pattern_size * 2.0);
let distance = min(pattern, base_pattern_size * 2.0 - pattern) - width;
background_color = sold_color;
let pattern = rotated_point.x % pattern_period;
let distance = min(pattern, pattern_period - pattern) - pattern_period / 4;
background_color = solid_color;
background_color.a *= saturate(0.5 - distance);
}
}