zeta: Prevent diff popover from going offscreen (#22070)

https://github.com/user-attachments/assets/4ce806f1-d790-41d0-9825-e68055281446

Release Notes:

- N/A
This commit is contained in:
Bennet Bo Fenner 2024-12-16 11:22:20 +01:00 committed by GitHub
parent d135ec2b73
commit 040d9ae222
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -2794,7 +2794,7 @@ impl EditorElement {
style: &EditorStyle,
cx: &mut WindowContext,
) -> Option<AnyElement> {
const PADDING_X: Pixels = Pixels(25.);
const PADDING_X: Pixels = Pixels(24.);
const PADDING_Y: Pixels = Pixels(2.);
let active_inline_completion = self.editor.read(cx).active_inline_completion.as_ref()?;
@ -2897,6 +2897,7 @@ impl EditorElement {
}
let (text, highlights) = inline_completion_popover_text(editor_snapshot, edits, cx);
let line_count = text.lines().count() + 1;
let longest_row =
editor_snapshot.longest_row_in_range(edit_start.row()..edit_end.row() + 1);
@ -2914,7 +2915,8 @@ impl EditorElement {
.width
};
let text = gpui::StyledText::new(text).with_highlights(&style.text, highlights);
let styled_text =
gpui::StyledText::new(text).with_highlights(&style.text, highlights);
let mut element = div()
.bg(cx.theme().colors().editor_background)
@ -2922,15 +2924,38 @@ impl EditorElement {
.border_color(cx.theme().colors().border)
.rounded_md()
.px_1()
.child(text)
.child(styled_text)
.into_any();
let origin = text_bounds.origin
+ point(
longest_line_width + PADDING_X - scroll_pixel_position.x,
edit_start.row().as_f32() * line_height - scroll_pixel_position.y,
);
element.prepaint_as_root(origin, AvailableSpace::min_size(), cx);
let element_bounds = element.layout_as_root(AvailableSpace::min_size(), cx);
let is_fully_visible =
editor_width >= longest_line_width + PADDING_X + element_bounds.width;
let origin = if is_fully_visible {
text_bounds.origin
+ point(
longest_line_width + PADDING_X - scroll_pixel_position.x,
edit_start.row().as_f32() * line_height - scroll_pixel_position.y,
)
} else {
let target_above =
DisplayRow(edit_start.row().0.saturating_sub(line_count as u32));
let row_target = if visible_row_range
.contains(&DisplayRow(target_above.0.saturating_sub(1)))
{
target_above
} else {
DisplayRow(edit_end.row().0 + 1)
};
text_bounds.origin
+ point(
-scroll_pixel_position.x,
row_target.as_f32() * line_height - scroll_pixel_position.y,
)
};
element.prepaint_as_root(origin, element_bounds.into(), cx);
Some(element)
}
}