Properly handle opening of file-less excerpts (#21465)

Follow-up of https://github.com/zed-industries/zed/pull/20491 and
https://github.com/zed-industries/zed/pull/20469
Closes https://github.com/zed-industries/zed/issues/21369

Release Notes:

- Fixed file-less excerpts always opening instead of activating
This commit is contained in:
Kirill Bulatov 2024-12-03 18:41:36 +02:00 committed by GitHub
parent a0f2c0799e
commit a464474df0
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 36 additions and 3 deletions

View file

@ -12833,8 +12833,41 @@ impl Editor {
}; };
for (buffer, (ranges, scroll_offset)) in new_selections_by_buffer { for (buffer, (ranges, scroll_offset)) in new_selections_by_buffer {
let editor = let editor = buffer
workspace.open_project_item::<Self>(pane.clone(), buffer, true, true, cx); .read(cx)
.file()
.is_none()
.then(|| {
// Handle file-less buffers separately: those are not really the project items, so won't have a paroject path or entity id,
// so `workspace.open_project_item` will never find them, always opening a new editor.
// Instead, we try to activate the existing editor in the pane first.
let (editor, pane_item_index) =
pane.read(cx).items().enumerate().find_map(|(i, item)| {
let editor = item.downcast::<Editor>()?;
let singleton_buffer =
editor.read(cx).buffer().read(cx).as_singleton()?;
if singleton_buffer == buffer {
Some((editor, i))
} else {
None
}
})?;
pane.update(cx, |pane, cx| {
pane.activate_item(pane_item_index, true, true, cx)
});
Some(editor)
})
.flatten()
.unwrap_or_else(|| {
workspace.open_project_item::<Self>(
pane.clone(),
buffer,
true,
true,
cx,
)
});
editor.update(cx, |editor, cx| { editor.update(cx, |editor, cx| {
let autoscroll = match scroll_offset { let autoscroll = match scroll_offset {
Some(scroll_offset) => Autoscroll::top_relative(scroll_offset as usize), Some(scroll_offset) => Autoscroll::top_relative(scroll_offset as usize),

View file

@ -11805,7 +11805,7 @@ async fn test_mutlibuffer_in_navigation_history(cx: &mut gpui::TestAppContext) {
multi_buffer_editor.update(cx, |editor, cx| { multi_buffer_editor.update(cx, |editor, cx| {
editor.change_selections(Some(Autoscroll::Next), cx, |s| { editor.change_selections(Some(Autoscroll::Next), cx, |s| {
s.select_ranges(Some(60..70)) s.select_ranges(Some(70..70))
}); });
editor.open_excerpts(&OpenExcerpts, cx); editor.open_excerpts(&OpenExcerpts, cx);
}); });