diff --git a/crates/workspace/src/workspace.rs b/crates/workspace/src/workspace.rs index 9711c7d034c452c863dd2876ac82c1bfd9ab3f45..0e686c49d2689bbedcc2eace0147871c9a975414 100644 --- a/crates/workspace/src/workspace.rs +++ b/crates/workspace/src/workspace.rs @@ -612,35 +612,58 @@ impl From for i64 { } fn prompt_and_open_paths(app_state: Arc, options: PathPromptOptions, cx: &mut App) { - let paths = cx.prompt_for_paths(options); - cx.spawn( - async move |cx| match paths.await.anyhow().and_then(|res| res) { - Ok(Some(paths)) => { - cx.update(|cx| { - open_paths(&paths, app_state, OpenOptions::default(), cx).detach_and_log_err(cx) + if let Some(workspace_window) = local_workspace_windows(cx).into_iter().next() { + workspace_window + .update(cx, |multi_workspace, window, cx| { + let workspace = multi_workspace.workspace().clone(); + workspace.update(cx, |workspace, cx| { + prompt_for_open_path_and_open(workspace, app_state, options, window, cx); }); - } - Ok(None) => {} - Err(err) => { - util::log_err(&err); - cx.update(|cx| { - if let Some(workspace_window) = cx - .active_window() - .and_then(|window| window.downcast::()) - { - workspace_window - .update(cx, |multi_workspace, _, cx| { - let workspace = multi_workspace.workspace().clone(); - workspace.update(cx, |workspace, cx| { - workspace.show_portal_error(err.to_string(), cx); - }); - }) - .ok(); - } + }) + .ok(); + } else { + let task = Workspace::new_local(Vec::new(), app_state.clone(), None, None, None, cx); + cx.spawn(async move |cx| { + let (window, _) = task.await?; + window.update(cx, |multi_workspace, window, cx| { + window.activate_window(); + let workspace = multi_workspace.workspace().clone(); + workspace.update(cx, |workspace, cx| { + prompt_for_open_path_and_open(workspace, app_state, options, window, cx); }); - } - }, - ) + })?; + anyhow::Ok(()) + }) + .detach_and_log_err(cx); + } +} + +pub fn prompt_for_open_path_and_open( + workspace: &mut Workspace, + app_state: Arc, + options: PathPromptOptions, + window: &mut Window, + cx: &mut Context, +) { + let paths = workspace.prompt_for_open_path( + options, + DirectoryLister::Local(workspace.project().clone(), app_state.fs.clone()), + window, + cx, + ); + cx.spawn_in(window, async move |this, cx| { + let Some(paths) = paths.await.log_err().flatten() else { + return; + }; + if let Some(task) = this + .update_in(cx, |this, window, cx| { + this.open_workspace_for_paths(false, paths, window, cx) + }) + .log_err() + { + task.await.log_err(); + } + }) .detach(); } diff --git a/crates/zed/src/zed.rs b/crates/zed/src/zed.rs index 4089abf5fece50f32c85b02fed7a3d08a73a2a64..a814626253e3b6f26a5bd459de15df3e9c75ac79 100644 --- a/crates/zed/src/zed.rs +++ b/crates/zed/src/zed.rs @@ -796,36 +796,33 @@ fn register_actions( }) .register_action(|workspace, _: &workspace::Open, window, cx| { telemetry::event!("Project Opened"); - let paths = workspace.prompt_for_open_path( + workspace::prompt_for_open_path_and_open( + workspace, + workspace.app_state().clone(), PathPromptOptions { files: true, directories: true, multiple: true, prompt: None, }, - DirectoryLister::Local( - workspace.project().clone(), - workspace.app_state().fs.clone(), - ), window, cx, ); - - cx.spawn_in(window, async move |this, cx| { - let Some(paths) = paths.await.log_err().flatten() else { - return; - }; - - if let Some(task) = this - .update_in(cx, |this, window, cx| { - this.open_workspace_for_paths(false, paths, window, cx) - }) - .log_err() - { - task.await.log_err(); - } - }) - .detach() + }) + .register_action(|workspace, _: &workspace::OpenFiles, window, cx| { + let directories = cx.can_select_mixed_files_and_dirs(); + workspace::prompt_for_open_path_and_open( + workspace, + workspace.app_state().clone(), + PathPromptOptions { + files: true, + directories, + multiple: true, + prompt: None, + }, + window, + cx, + ); }) .register_action(|workspace, action: &zed_actions::OpenRemote, window, cx| { if !action.from_existing_connection {