diff --git a/crates/editor/src/editor_tests.rs b/crates/editor/src/editor_tests.rs index 3c4ad2f9a1..153de66726 100644 --- a/crates/editor/src/editor_tests.rs +++ b/crates/editor/src/editor_tests.rs @@ -13193,28 +13193,6 @@ async fn test_diff_base_change_with_expanded_diff_hunks( cx.set_diff_base("new diff base!"); executor.run_until_parked(); - cx.assert_state_with_diff( - r#" - use some::mod2; - - const A: u32 = 42; - const C: u32 = 42; - - fn main(ˇ) { - //println!("hello"); - - println!("world"); - // - // - } - "# - .unindent(), - ); - - cx.update_editor(|editor, window, cx| { - editor.expand_all_diff_hunks(&ExpandAllHunkDiffs, window, cx); - }); - executor.run_until_parked(); cx.assert_state_with_diff( r#" - new diff base! diff --git a/crates/editor/src/element.rs b/crates/editor/src/element.rs index 87602c72ad..612a866945 100644 --- a/crates/editor/src/element.rs +++ b/crates/editor/src/element.rs @@ -4829,7 +4829,15 @@ impl EditorElement { ) { for (_, hunk_hitbox) in &layout.display_hunks { if let Some(hunk_hitbox) = hunk_hitbox { - window.set_cursor_style(CursorStyle::PointingHand, hunk_hitbox); + if !self + .editor + .read(cx) + .buffer() + .read(cx) + .all_diff_hunks_expanded() + { + window.set_cursor_style(CursorStyle::PointingHand, hunk_hitbox); + } } } @@ -5717,7 +5725,7 @@ impl EditorElement { window.on_mouse_event({ let position_map = layout.position_map.clone(); let editor = self.editor.clone(); - let multi_buffer_range = + let diff_hunk_range = layout .display_hunks .iter() @@ -5753,7 +5761,7 @@ impl EditorElement { Self::mouse_left_down( editor, event, - multi_buffer_range.clone(), + diff_hunk_range.clone(), &position_map, line_numbers.as_ref(), window, diff --git a/crates/multi_buffer/src/multi_buffer.rs b/crates/multi_buffer/src/multi_buffer.rs index 82242ae042..422db29cbd 100644 --- a/crates/multi_buffer/src/multi_buffer.rs +++ b/crates/multi_buffer/src/multi_buffer.rs @@ -281,13 +281,28 @@ enum DiffTransform { }, } -#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)] +#[derive(Clone, Copy, Debug)] struct DiffTransformHunkInfo { excerpt_id: ExcerptId, hunk_start_anchor: text::Anchor, hunk_secondary_status: DiffHunkSecondaryStatus, } +impl Eq for DiffTransformHunkInfo {} + +impl PartialEq for DiffTransformHunkInfo { + fn eq(&self, other: &DiffTransformHunkInfo) -> bool { + self.excerpt_id == other.excerpt_id && self.hunk_start_anchor == other.hunk_start_anchor + } +} + +impl std::hash::Hash for DiffTransformHunkInfo { + fn hash(&self, state: &mut H) { + self.excerpt_id.hash(state); + self.hunk_start_anchor.hash(state); + } +} + #[derive(Clone)] pub struct ExcerptInfo { pub id: ExcerptId, @@ -2361,7 +2376,7 @@ impl MultiBuffer { self.expand_or_collapse_diff_hunks(vec![Anchor::min()..Anchor::max()], true, cx); } - pub fn all_diff_hunks_expanded(&mut self) -> bool { + pub fn all_diff_hunks_expanded(&self) -> bool { self.all_diff_hunks_expanded } @@ -2401,6 +2416,9 @@ impl MultiBuffer { expand: bool, cx: &mut Context, ) { + if self.all_diff_hunks_expanded && !expand { + return; + } self.sync(cx); let mut snapshot = self.snapshot.borrow_mut(); let mut excerpt_edits = Vec::new(); @@ -2986,7 +3004,7 @@ impl MultiBuffer { let was_previously_expanded = old_expanded_hunks.contains(&hunk_info); let should_expand_hunk = match &change_kind { DiffChangeKind::DiffUpdated { base_changed: true } => { - self.all_diff_hunks_expanded + self.all_diff_hunks_expanded || was_previously_expanded } DiffChangeKind::ExpandOrCollapseHunks { expand } => { let intersects = hunk_buffer_range.is_empty()