Fix run indicators with expanded diff hunks (#23758)

Conrad Irwin created

Fix runnable positioning when diff hunks are altered.

Release Notes:

- N/A

Change summary

crates/editor/src/editor.rs             |  3 +++
crates/multi_buffer/src/multi_buffer.rs | 17 +++++++++++------
2 files changed, 14 insertions(+), 6 deletions(-)

Detailed changes

crates/editor/src/editor.rs 🔗

@@ -13381,6 +13381,9 @@ impl Editor {
 
                 cx.emit(EditorEvent::Reparsed(*buffer_id));
             }
+            multi_buffer::Event::DiffHunksToggled => {
+                self.tasks_update_task = Some(self.refresh_runnables(window, cx));
+            }
             multi_buffer::Event::LanguageChanged(buffer_id) => {
                 linked_editing_ranges::refresh_linked_ranges(self, window, cx);
                 cx.emit(EditorEvent::Reparsed(*buffer_id));

crates/multi_buffer/src/multi_buffer.rs 🔗

@@ -91,6 +91,7 @@ pub enum Event {
     ExcerptsEdited {
         ids: Vec<ExcerptId>,
     },
+    DiffHunksToggled,
     Edited {
         singleton_buffer_edited: bool,
         edited_buffer: Option<Entity<Buffer>>,
@@ -2299,6 +2300,7 @@ impl MultiBuffer {
             excerpt_edits,
             DiffChangeKind::ExpandOrCollapseHunks { expand },
         );
+        cx.emit(Event::DiffHunksToggled);
         cx.emit(Event::Edited {
             singleton_buffer_edited: false,
             edited_buffer: None,
@@ -3418,10 +3420,8 @@ impl MultiBufferSnapshot {
         while let Some(region) = cursor.region() {
             if region.is_main_buffer {
                 let mut buffer_end = region.buffer_range.start.key;
-                if region.is_main_buffer {
-                    let overshoot = range.end.saturating_sub(region.range.start.key);
-                    buffer_end.add_assign(&overshoot);
-                }
+                let overshoot = range.end.saturating_sub(region.range.start.key);
+                buffer_end.add_assign(&overshoot);
                 range_end = Some((region.excerpt.id, buffer_end));
                 break;
             }
@@ -3433,6 +3433,10 @@ impl MultiBufferSnapshot {
             value: None,
         });
 
+        if cursor.region().is_some_and(|region| !region.is_main_buffer) {
+            cursor.prev();
+        }
+
         iter::from_fn(move || loop {
             let excerpt = cursor.excerpt()?;
 
@@ -3475,8 +3479,9 @@ impl MultiBufferSnapshot {
                 // the metadata item's range.
                 if range.start > D::default() {
                     while let Some(region) = cursor.region() {
-                        if region.buffer.remote_id() == excerpt.buffer_id
-                            && region.buffer_range.end.value.unwrap() < range.start
+                        if !region.is_main_buffer
+                            || region.buffer.remote_id() == excerpt.buffer_id
+                                && region.buffer_range.end.value.unwrap() < range.start
                         {
                             cursor.next();
                         } else {