diff --git a/Cargo.lock b/Cargo.lock index 2e9c4fddd7..6d2f7b8666 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -17933,6 +17933,7 @@ dependencies = [ "windows 0.61.1", "workspace-hack", "zed_actions", + "zedless_settings", "zlog", ] diff --git a/crates/gpui/src/app.rs b/crates/gpui/src/app.rs index 759d33563e..86a249a4eb 100644 --- a/crates/gpui/src/app.rs +++ b/crates/gpui/src/app.rs @@ -799,8 +799,9 @@ impl App { pub fn prompt_for_paths( &self, options: PathPromptOptions, + initial_path: Option ) -> oneshot::Receiver>>> { - self.platform.prompt_for_paths(options) + self.platform.prompt_for_paths(options, initial_path) } /// Displays a platform modal for selecting a new path where a file can be saved. diff --git a/crates/gpui/src/platform.rs b/crates/gpui/src/platform.rs index 27ba9940f5..a6d9e594bb 100644 --- a/crates/gpui/src/platform.rs +++ b/crates/gpui/src/platform.rs @@ -220,6 +220,7 @@ pub(crate) trait Platform: 'static { fn prompt_for_paths( &self, options: PathPromptOptions, + initial_path: Option, ) -> oneshot::Receiver>>>; fn prompt_for_new_path(&self, directory: &Path) -> oneshot::Receiver>>; fn can_select_mixed_files_and_dirs(&self) -> bool; diff --git a/crates/gpui/src/platform/linux/platform.rs b/crates/gpui/src/platform/linux/platform.rs index fce0db610d..1aa1ca6487 100644 --- a/crates/gpui/src/platform/linux/platform.rs +++ b/crates/gpui/src/platform/linux/platform.rs @@ -275,6 +275,7 @@ impl Platform for P { fn prompt_for_paths( &self, options: PathPromptOptions, + initial_path: Option, ) -> oneshot::Receiver>>> { let (done_tx, done_rx) = oneshot::channel(); @@ -290,14 +291,27 @@ impl Platform for P { "Open File" }; - let request = match ashpd::desktop::file_chooser::OpenFileRequest::default() + let req = ashpd::desktop::file_chooser::OpenFileRequest::default() .modal(true) .title(title) .multiple(options.multiple) - .directory(options.directories) - .send() - .await - { + .directory(options.directories); + + let req2 = if let Some(initpath) = initial_path { + if let Ok(r) = req.current_folder(initpath) { + r + } else { + ashpd::desktop::file_chooser::OpenFileRequest::default() + .modal(true) + .title(title) + .multiple(options.multiple) + .directory(options.directories) + } + } else { + req + }; + + let request = match req2.send().await { Ok(request) => request, Err(err) => { let result = match err { diff --git a/crates/gpui/src/platform/test/platform.rs b/crates/gpui/src/platform/test/platform.rs index a26b65576c..4529f703df 100644 --- a/crates/gpui/src/platform/test/platform.rs +++ b/crates/gpui/src/platform/test/platform.rs @@ -329,6 +329,7 @@ impl Platform for TestPlatform { fn prompt_for_paths( &self, _options: crate::PathPromptOptions, + _initial_path: Option, ) -> oneshot::Receiver>>> { unimplemented!() } diff --git a/crates/workspace/Cargo.toml b/crates/workspace/Cargo.toml index 1f542f7920..80bfe856ae 100644 --- a/crates/workspace/Cargo.toml +++ b/crates/workspace/Cargo.toml @@ -62,6 +62,7 @@ ui.workspace = true util.workspace = true uuid.workspace = true zed_actions.workspace = true +zedless_settings.workspace = true workspace-hack.workspace = true [target.'cfg(target_os = "windows")'.dependencies] diff --git a/crates/workspace/src/workspace.rs b/crates/workspace/src/workspace.rs index 491c2c62d2..c6b60d4977 100644 --- a/crates/workspace/src/workspace.rs +++ b/crates/workspace/src/workspace.rs @@ -106,6 +106,7 @@ pub use workspace_settings::{ AutosaveSetting, BottomDockLayout, RestoreOnStartupBehavior, TabBarSettings, WorkspaceSettings, }; use zed_actions::{Spawn, feedback::FileBugReport}; +use zedless_settings::ZedlessSettings; use crate::notifications::NotificationId; use crate::persistence::{ @@ -511,7 +512,7 @@ pub fn init_settings(cx: &mut App) { } fn prompt_and_open_paths(app_state: Arc, options: PathPromptOptions, cx: &mut App) { - let paths = cx.prompt_for_paths(options); + let paths = cx.prompt_for_paths(options, None); cx.spawn( async move |cx| match paths.await.anyhow().and_then(|res| res) { Ok(Some(paths)) => { @@ -2024,6 +2025,9 @@ impl Workspace { window: &mut Window, cx: &mut Context, ) -> oneshot::Receiver>> { + let initial_path = ZedlessSettings::get_global(cx) + .projects_base_path + .clone(); if !lister.is_local(cx) || !WorkspaceSettings::get_global(cx).use_system_path_prompts { let prompt = self.on_prompt_for_open_path.take().unwrap(); let rx = prompt(self, lister, window, cx); @@ -2031,7 +2035,7 @@ impl Workspace { rx } else { let (tx, rx) = oneshot::channel(); - let abs_path = cx.prompt_for_paths(path_prompt_options); + let abs_path = cx.prompt_for_paths(path_prompt_options, initial_path); cx.spawn_in(window, async move |workspace, cx| { let Ok(result) = abs_path.await else { diff --git a/crates/zedless_settings/src/zedless_settings.rs b/crates/zedless_settings/src/zedless_settings.rs index 2816c3c196..aefd2528d5 100644 --- a/crates/zedless_settings/src/zedless_settings.rs +++ b/crates/zedless_settings/src/zedless_settings.rs @@ -14,6 +14,8 @@ pub struct ZedlessSettings { #[serde(default)] /// Zeta server URL. pub zeta_url: Option, + /// Starting path for path prompts. + pub projects_base_path: Option, } impl Settings for ZedlessSettings {