diff --git a/zed/src/workspace/workspace_view.rs b/zed/src/workspace/workspace_view.rs index 91e1e3940395b833656f47e7f05c083113972928..2b89ba4d60c7b085e3786b7b54243aa7326e0b87 100644 --- a/zed/src/workspace/workspace_view.rs +++ b/zed/src/workspace/workspace_view.rs @@ -6,7 +6,6 @@ use crate::{ watch, worktree::{Worktree, WorktreeHandle}, }; -use anyhow::anyhow; use futures_core::{future::LocalBoxFuture, Future}; use gpui::{ color::rgbu, elements::*, json::to_string_pretty, keymap::Binding, AnyViewHandle, AppContext, @@ -17,7 +16,6 @@ use log::error; use smol::prelude::*; use std::{ collections::{hash_map::Entry, HashMap, HashSet}, - future, path::{Path, PathBuf}, sync::Arc, }; @@ -204,7 +202,11 @@ impl WorkspaceView { paths: &[PathBuf], ctx: &mut ViewContext, ) -> impl Future { - let entries = self.open_paths2(paths, ctx); + let entries = paths + .iter() + .cloned() + .map(|path| self.open_path(path, ctx)) + .collect::>(); let bg = ctx.background_executor().clone(); let tasks = paths @@ -233,18 +235,6 @@ impl WorkspaceView { } } - pub fn open_paths2( - &mut self, - paths: &[PathBuf], - ctx: &mut ViewContext, - ) -> Vec<(usize, Arc)> { - paths - .iter() - .cloned() - .map(move |path| self.open_path(path, ctx)) - .collect() - } - pub fn open_path(&mut self, path: PathBuf, ctx: &mut ViewContext) -> (usize, Arc) { for tree in self.worktrees.iter() { if let Ok(relative_path) = path.strip_prefix(tree.read(ctx).abs_path()) { @@ -304,54 +294,34 @@ impl WorkspaceView { return None; } - self.loading_entries.insert(entry.clone()); - - let window_id = ctx.window_id(); - let future = self.open_entry2(entry.clone(), window_id, self.settings.clone(), ctx); + let (worktree_id, path) = entry.clone(); - Some(ctx.spawn(future, move |me, item_view, ctx| { - me.loading_entries.remove(&entry); - match item_view { - Ok(item_view) => me.add_item(item_view, ctx), - Err(error) => log::error!("error opening item: {}", error), - } - })) - } - - pub fn open_entry2( - &mut self, - (worktree_id, path): (usize, Arc), - window_id: usize, - settings: watch::Receiver, - ctx: &mut ViewContext, - ) -> LocalBoxFuture<'static, Result, Arc>> { let worktree = match self.worktrees.get(&worktree_id).cloned() { Some(worktree) => worktree, None => { - return future::ready(Err(Arc::new(anyhow!( - "worktree {} does not exist", - worktree_id - )))) - .boxed_local(); + log::error!("worktree {} does not exist", worktree_id); + return None; } }; let inode = match worktree.read(ctx).inode_for_path(&path) { Some(inode) => inode, None => { - return future::ready(Err(Arc::new(anyhow!("path {:?} does not exist", path)))) - .boxed_local(); + log::error!("path {:?} does not exist", path); + return None; } }; let file = match worktree.file(path.clone(), ctx.as_ref()) { Some(file) => file, None => { - return future::ready(Err(Arc::new(anyhow!("path {:?} does not exist", path)))) - .boxed_local() + log::error!("path {:?} does not exist", path); + return None; } }; + self.loading_entries.insert(entry.clone()); + if let Entry::Vacant(entry) = self.buffers.entry((worktree_id, inode)) { let (mut tx, rx) = postage::watch::channel(); entry.insert(rx); @@ -370,7 +340,7 @@ impl WorkspaceView { } let mut watch = self.buffers.get(&(worktree_id, inode)).unwrap().clone(); - ctx.spawn( + Some(ctx.spawn( async move { loop { if let Some(load_result) = watch.borrow().as_ref() { @@ -379,15 +349,26 @@ impl WorkspaceView { watch.next().await; } }, - move |_, load_result, ctx| { - load_result.map(|buffer_handle| { - Box::new(ctx.as_mut().add_view(window_id, |ctx| { - BufferView::for_buffer(buffer_handle, Some(file), settings, ctx) - })) as Box - }) + move |me, load_result, ctx| { + me.loading_entries.remove(&entry); + match load_result { + Ok(buffer_handle) => { + let buffer_view = Box::new(ctx.add_view(|ctx| { + BufferView::for_buffer( + buffer_handle, + Some(file), + me.settings.clone(), + ctx, + ) + })); + me.add_item(buffer_view, ctx); + } + Err(error) => { + log::error!("error opening item: {}", error); + } + } }, - ) - .boxed_local() + )) } pub fn save_active_item(&mut self, _: &(), ctx: &mut ViewContext) {