diff --git a/crates/editor/src/element.rs b/crates/editor/src/element.rs index a1a4898a957c4b381f3da93d8a0cc9fff84931de..b865370437caf2e873a056419ba5734c3ca11332 100644 --- a/crates/editor/src/element.rs +++ b/crates/editor/src/element.rs @@ -3031,7 +3031,6 @@ impl EditorElement { scroll_position: gpui::Point, gutter_dimensions: &GutterDimensions, gutter_hitbox: &Hitbox, - display_hunks: &[(DisplayDiffHunk, Option)], snapshot: &EditorSnapshot, breakpoints: HashMap)>, row_infos: &[RowInfo], @@ -3073,7 +3072,6 @@ impl EditorElement { gutter_dimensions, scroll_position, gutter_hitbox, - display_hunks, window, cx, ); @@ -3088,7 +3086,7 @@ impl EditorElement { range: Range, row_infos: &[RowInfo], cx: &App, - ) -> Option { + ) -> Option<(DisplayRow, Option)> { if !cx.has_flag::() { return None; } @@ -3104,25 +3102,34 @@ impl EditorElement { } let display_row = indicator.display_row; + let row_index = (display_row.0.saturating_sub(range.start.0)) as usize; // Don't show on rows with expand excerpt buttons - if row_infos - .get((display_row.0.saturating_sub(range.start.0)) as usize) - .is_some_and(|row_info| row_info.expand_info.is_some()) - { + let row_info = row_infos.get(row_index); + if row_info.is_some_and(|row_info| row_info.expand_info.is_some()) { return None; } - Some(display_row) + let buffer_row = row_info.and_then(|info| info.buffer_row); + Some((display_row, buffer_row)) } - fn diff_review_button() -> AnyElement { - IconButton::new("diff_review_button", ui::IconName::Plus) - .icon_size(ui::IconSize::XSmall) - .size(ui::ButtonSize::None) - .icon_color(ui::Color::Default) - .style(ui::ButtonStyle::Filled) - .layer(ui::ElevationIndex::Surface) + fn diff_review_button(width: Pixels, cx: &mut App) -> AnyElement { + let text_c = cx.theme().colors().text; + let icon_c = cx.theme().colors().icon_accent; + + h_flex() + .id("diff_review_button") + .cursor_pointer() + .w(width - px(1.)) + .h(relative(0.9)) + .justify_center() + .rounded_sm() + .border_1() + .border_color(text_c.opacity(0.1)) + .bg(text_c.opacity(0.15)) + .hover(|s| s.bg(icon_c.opacity(0.4)).border_color(icon_c.opacity(0.5))) + .child(Icon::new(IconName::Plus).size(IconSize::Small)) .tooltip(Tooltip::text("Add Review")) .into_any_element() } @@ -3136,7 +3143,6 @@ impl EditorElement { scroll_position: gpui::Point, gutter_dimensions: &GutterDimensions, gutter_hitbox: &Hitbox, - display_hunks: &[(DisplayDiffHunk, Option)], snapshot: &EditorSnapshot, breakpoints: &mut HashMap)>, window: &mut Window, @@ -3229,7 +3235,6 @@ impl EditorElement { gutter_dimensions, scroll_position, gutter_hitbox, - display_hunks, window, cx, ); @@ -3298,14 +3303,13 @@ impl EditorElement { || gutter_dimensions.right_padding == px(0.); let width = if is_wide { - available_width - px(2.) + available_width - px(5.) } else { - available_width + em_width - px(2.) + available_width + em_width - px(5.) }; let toggle = IconButton::new(("expand", ix), icon_name) .icon_color(Color::Custom(cx.theme().colors().editor_line_number)) - .selected_icon_color(Color::Custom(cx.theme().colors().editor_foreground)) .icon_size(IconSize::Custom(rems(editor_font_size / window.rem_size()))) .width(width) .on_click(move |_, window, cx| { @@ -8354,7 +8358,6 @@ fn prepaint_gutter_button( gutter_dimensions: &GutterDimensions, scroll_position: gpui::Point, gutter_hitbox: &Hitbox, - display_hunks: &[(DisplayDiffHunk, Option)], window: &mut Window, cx: &mut App, ) -> AnyElement { @@ -8363,28 +8366,12 @@ fn prepaint_gutter_button( AvailableSpace::Definite(line_height), ); let indicator_size = button.layout_as_root(available_space, window, cx); + let git_gutter_width = EditorElement::gutter_strip_width(line_height) + + gutter_dimensions + .git_blame_entries_width + .unwrap_or_default(); - let blame_width = gutter_dimensions.git_blame_entries_width; - let gutter_width = display_hunks - .binary_search_by(|(hunk, _)| match hunk { - DisplayDiffHunk::Folded { display_row } => display_row.cmp(&row), - DisplayDiffHunk::Unfolded { - display_row_range, .. - } => { - if display_row_range.end <= row { - Ordering::Less - } else if display_row_range.start > row { - Ordering::Greater - } else { - Ordering::Equal - } - } - }) - .ok() - .and_then(|ix| Some(display_hunks[ix].1.as_ref()?.size.width)); - let left_offset = blame_width.max(gutter_width).unwrap_or_default(); - - let x = left_offset; + let x = git_gutter_width + px(2.); let mut y = Pixels::from((row.as_f64() - scroll_position.y) * ScrollPixelOffset::from(line_height)); @@ -10409,7 +10396,6 @@ impl Element for EditorElement { scroll_position, &gutter_dimensions, &gutter_hitbox, - &display_hunks, &snapshot, &mut breakpoint_rows, window, @@ -10429,7 +10415,6 @@ impl Element for EditorElement { scroll_position, &gutter_dimensions, &gutter_hitbox, - &display_hunks, &snapshot, breakpoint_rows, &row_infos, @@ -10440,17 +10425,46 @@ impl Element for EditorElement { Vec::new() }; + let git_gutter_width = Self::gutter_strip_width(line_height) + + gutter_dimensions + .git_blame_entries_width + .unwrap_or_default(); + let available_width = gutter_dimensions.left_padding - git_gutter_width; + + let max_line_number_length = self + .editor + .read(cx) + .buffer() + .read(cx) + .snapshot(cx) + .widest_line_number() + .ilog10() + + 1; + let diff_review_button = self .should_render_diff_review_button(start_row..end_row, &row_infos, cx) - .map(|display_row| { + .map(|(display_row, buffer_row)| { + let is_wide = max_line_number_length + >= EditorSettings::get_global(cx).gutter.min_line_number_digits + as u32 + && buffer_row.is_some_and(|row| { + (row + 1).ilog10() + 1 == max_line_number_length + }) + || gutter_dimensions.right_padding == px(0.); + + let button_width = if is_wide { + available_width - px(6.) + } else { + available_width + em_width - px(6.) + }; + prepaint_gutter_button( - Self::diff_review_button(), + Self::diff_review_button(button_width, cx), display_row, line_height, &gutter_dimensions, scroll_position, &gutter_hitbox, - &display_hunks, window, cx, )