@@ -12237,11 +12237,19 @@ impl Editor {
cx: &mut Context<'_, Editor>,
) {
self.buffer.update(cx, |buffer, cx| {
- if buffer.has_expanded_diff_hunks_in_ranges(&ranges, cx) {
- buffer.collapse_diff_hunks(ranges, cx)
- } else {
- buffer.expand_diff_hunks(ranges, cx)
- }
+ let expand = !buffer.has_expanded_diff_hunks_in_ranges(&ranges, cx);
+ buffer.expand_or_collapse_diff_hunks(ranges, expand, cx);
+ })
+ }
+
+ fn toggle_diff_hunks_in_ranges_narrow(
+ &mut self,
+ ranges: Vec<Range<Anchor>>,
+ cx: &mut Context<'_, Editor>,
+ ) {
+ self.buffer.update(cx, |buffer, cx| {
+ let expand = !buffer.has_expanded_diff_hunks_in_ranges(&ranges, cx);
+ buffer.expand_or_collapse_diff_hunks_narrow(ranges, expand, cx);
})
}
@@ -559,7 +559,7 @@ impl EditorElement {
let mut modifiers = event.modifiers;
if let Some(hovered_hunk) = hovered_hunk {
- editor.toggle_diff_hunks_in_ranges(vec![hovered_hunk], cx);
+ editor.toggle_diff_hunks_in_ranges_narrow(vec![hovered_hunk], cx);
cx.notify();
return;
} else if gutter_hitbox.is_hovered(window) {
@@ -2376,24 +2376,17 @@ impl MultiBuffer {
false
}
- fn expand_or_collapse_diff_hunks(
+ fn expand_or_collapse_diff_hunks_internal(
&mut self,
- ranges: Vec<Range<Anchor>>,
+ ranges: impl Iterator<Item = (Range<Point>, ExcerptId)>,
expand: bool,
cx: &mut Context<Self>,
) {
self.sync(cx);
let mut snapshot = self.snapshot.borrow_mut();
let mut excerpt_edits = Vec::new();
- for range in ranges.iter() {
- let end_excerpt_id = range.end.excerpt_id;
- let range = range.to_point(&snapshot);
- let mut peek_end = range.end;
- if range.end.row < snapshot.max_row().0 {
- peek_end = Point::new(range.end.row + 1, 0);
- };
-
- for diff_hunk in snapshot.diff_hunks_in_range(range.start..peek_end) {
+ for (range, end_excerpt_id) in ranges {
+ for diff_hunk in snapshot.diff_hunks_in_range(range) {
if diff_hunk.excerpt_id.cmp(&end_excerpt_id, &snapshot).is_gt() {
continue;
}
@@ -2428,6 +2421,44 @@ impl MultiBuffer {
});
}
+ pub fn expand_or_collapse_diff_hunks_narrow(
+ &mut self,
+ ranges: Vec<Range<Anchor>>,
+ expand: bool,
+ cx: &mut Context<Self>,
+ ) {
+ let snapshot = self.snapshot.borrow().clone();
+ self.expand_or_collapse_diff_hunks_internal(
+ ranges
+ .iter()
+ .map(move |range| (range.to_point(&snapshot), range.end.excerpt_id)),
+ expand,
+ cx,
+ );
+ }
+
+ pub fn expand_or_collapse_diff_hunks(
+ &mut self,
+ ranges: Vec<Range<Anchor>>,
+ expand: bool,
+ cx: &mut Context<Self>,
+ ) {
+ let snapshot = self.snapshot.borrow().clone();
+ self.expand_or_collapse_diff_hunks_internal(
+ ranges.iter().map(move |range| {
+ let end_excerpt_id = range.end.excerpt_id;
+ let range = range.to_point(&snapshot);
+ let mut peek_end = range.end;
+ if range.end.row < snapshot.max_row().0 {
+ peek_end = Point::new(range.end.row + 1, 0);
+ };
+ (range.start..peek_end, end_excerpt_id)
+ }),
+ expand,
+ cx,
+ );
+ }
+
pub fn resize_excerpt(
&mut self,
id: ExcerptId,