diff --git a/crates/terminal_view/src/persistence.rs b/crates/terminal_view/src/persistence.rs index b601906b07f35c799dafb89932a1d0c559fbe1eb..1c215c1703278c8e54046ea305273242570c6b7f 100644 --- a/crates/terminal_view/src/persistence.rs +++ b/crates/terminal_view/src/persistence.rs @@ -1,7 +1,7 @@ use anyhow::Result; use async_recursion::async_recursion; use collections::HashSet; -use futures::{StreamExt as _, stream::FuturesUnordered}; +use futures::future::join_all; use gpui::{AppContext as _, AsyncWindowContext, Axis, Entity, Task, WeakEntity}; use project::Project; use serde::{Deserialize, Serialize}; @@ -242,7 +242,7 @@ async fn deserialize_pane_group( let items = pane.update_in(cx, |pane, window, cx| { populate_pane_items(pane, new_items, active_item, window, cx); - pane.set_pinned_count(pinned_count); + pane.set_pinned_count(pinned_count.min(pane.items_len())); pane.items_len() }); // Avoid blank panes in splits @@ -290,30 +290,25 @@ fn deserialize_terminal_views( item_ids: &[u64], cx: &mut AsyncWindowContext, ) -> impl Future>> + use<> { - let mut deserialized_items = item_ids - .iter() - .map(|item_id| { - cx.update(|window, cx| { - TerminalView::deserialize( - project.clone(), - workspace.clone(), - workspace_id, - *item_id, - window, - cx, - ) - }) - .unwrap_or_else(|e| Task::ready(Err(e.context("no window present")))) + let deserialized_items = join_all(item_ids.iter().filter_map(|item_id| { + cx.update(|window, cx| { + TerminalView::deserialize( + project.clone(), + workspace.clone(), + workspace_id, + *item_id, + window, + cx, + ) }) - .collect::>(); + .ok() + })); async move { - let mut items = Vec::with_capacity(deserialized_items.len()); - while let Some(item) = deserialized_items.next().await { - if let Some(item) = item.log_err() { - items.push(item); - } - } - items + deserialized_items + .await + .into_iter() + .filter_map(|item| item.log_err()) + .collect() } }