From 3a3df5c0118e942893dd3f12aa0c2f734ffae0af Mon Sep 17 00:00:00 2001
From: Anthony Eid <56899983+Anthony-Eid@users.noreply.github.com>
Date: Mon, 18 Aug 2025 15:48:02 -0400
Subject: [PATCH] gpui: Add support for custom prompt text in PathPromptOptions
(#36410)
This will be used to improve the clarity of the git clone UI
### MacOS
### Windows
### Linux
Release Notes:
- N/A
---
crates/extensions_ui/src/extensions_ui.rs | 1 +
crates/git_ui/src/git_panel.rs | 1 +
crates/gpui/src/platform.rs | 4 +++-
crates/gpui/src/platform/linux/platform.rs | 1 +
crates/gpui/src/platform/mac/platform.rs | 6 ++++++
crates/gpui/src/platform/windows/platform.rs | 6 ++++++
crates/gpui/src/shared_string.rs | 5 +++++
crates/workspace/src/workspace.rs | 3 +++
crates/zed/src/zed.rs | 2 ++
9 files changed, 28 insertions(+), 1 deletion(-)
diff --git a/crates/extensions_ui/src/extensions_ui.rs b/crates/extensions_ui/src/extensions_ui.rs
index 4915933920..7c7f9e6836 100644
--- a/crates/extensions_ui/src/extensions_ui.rs
+++ b/crates/extensions_ui/src/extensions_ui.rs
@@ -116,6 +116,7 @@ pub fn init(cx: &mut App) {
files: false,
directories: true,
multiple: false,
+ prompt: None,
},
DirectoryLister::Local(
workspace.project().clone(),
diff --git a/crates/git_ui/src/git_panel.rs b/crates/git_ui/src/git_panel.rs
index b346f4d216..754812cbdf 100644
--- a/crates/git_ui/src/git_panel.rs
+++ b/crates/git_ui/src/git_panel.rs
@@ -2088,6 +2088,7 @@ impl GitPanel {
files: false,
directories: true,
multiple: false,
+ prompt: Some("Select as Repository Destination".into()),
});
let workspace = self.workspace.clone();
diff --git a/crates/gpui/src/platform.rs b/crates/gpui/src/platform.rs
index bf6ce68703..ffd68d60e6 100644
--- a/crates/gpui/src/platform.rs
+++ b/crates/gpui/src/platform.rs
@@ -1278,7 +1278,7 @@ pub enum WindowBackgroundAppearance {
}
/// The options that can be configured for a file dialog prompt
-#[derive(Copy, Clone, Debug)]
+#[derive(Clone, Debug)]
pub struct PathPromptOptions {
/// Should the prompt allow files to be selected?
pub files: bool,
@@ -1286,6 +1286,8 @@ pub struct PathPromptOptions {
pub directories: bool,
/// Should the prompt allow multiple files to be selected?
pub multiple: bool,
+ /// The prompt to show to a user when selecting a path
+ pub prompt: Option,
}
/// What kind of prompt styling to show
diff --git a/crates/gpui/src/platform/linux/platform.rs b/crates/gpui/src/platform/linux/platform.rs
index 31d445be52..86e5a79e8a 100644
--- a/crates/gpui/src/platform/linux/platform.rs
+++ b/crates/gpui/src/platform/linux/platform.rs
@@ -294,6 +294,7 @@ impl Platform for P {
let request = match ashpd::desktop::file_chooser::OpenFileRequest::default()
.modal(true)
.title(title)
+ .accept_label(options.prompt.as_ref().map(crate::SharedString::as_str))
.multiple(options.multiple)
.directory(options.directories)
.send()
diff --git a/crates/gpui/src/platform/mac/platform.rs b/crates/gpui/src/platform/mac/platform.rs
index 533423229c..79177fb2c9 100644
--- a/crates/gpui/src/platform/mac/platform.rs
+++ b/crates/gpui/src/platform/mac/platform.rs
@@ -705,6 +705,7 @@ impl Platform for MacPlatform {
panel.setCanChooseDirectories_(options.directories.to_objc());
panel.setCanChooseFiles_(options.files.to_objc());
panel.setAllowsMultipleSelection_(options.multiple.to_objc());
+
panel.setCanCreateDirectories(true.to_objc());
panel.setResolvesAliases_(false.to_objc());
let done_tx = Cell::new(Some(done_tx));
@@ -730,6 +731,11 @@ impl Platform for MacPlatform {
}
});
let block = block.copy();
+
+ if let Some(prompt) = options.prompt {
+ let _: () = msg_send![panel, setPrompt: ns_string(&prompt)];
+ }
+
let _: () = msg_send![panel, beginWithCompletionHandler: block];
}
})
diff --git a/crates/gpui/src/platform/windows/platform.rs b/crates/gpui/src/platform/windows/platform.rs
index ee0babf7cb..856187fa57 100644
--- a/crates/gpui/src/platform/windows/platform.rs
+++ b/crates/gpui/src/platform/windows/platform.rs
@@ -787,6 +787,12 @@ fn file_open_dialog(
unsafe {
folder_dialog.SetOptions(dialog_options)?;
+
+ if let Some(prompt) = options.prompt {
+ let prompt: &str = &prompt;
+ folder_dialog.SetOkButtonLabel(&HSTRING::from(prompt))?;
+ }
+
if folder_dialog.Show(window).is_err() {
// User cancelled
return Ok(None);
diff --git a/crates/gpui/src/shared_string.rs b/crates/gpui/src/shared_string.rs
index c325f98cd2..a34b7502f0 100644
--- a/crates/gpui/src/shared_string.rs
+++ b/crates/gpui/src/shared_string.rs
@@ -23,6 +23,11 @@ impl SharedString {
pub fn new(str: impl Into>) -> Self {
SharedString(ArcCow::Owned(str.into()))
}
+
+ /// Get a &str from the underlying string.
+ pub fn as_str(&self) -> &str {
+ &self.0
+ }
}
impl JsonSchema for SharedString {
diff --git a/crates/workspace/src/workspace.rs b/crates/workspace/src/workspace.rs
index 1eaa125ba5..02eac1665b 100644
--- a/crates/workspace/src/workspace.rs
+++ b/crates/workspace/src/workspace.rs
@@ -561,6 +561,7 @@ pub fn init(app_state: Arc, cx: &mut App) {
files: true,
directories: true,
multiple: true,
+ prompt: None,
},
cx,
);
@@ -578,6 +579,7 @@ pub fn init(app_state: Arc, cx: &mut App) {
files: true,
directories,
multiple: true,
+ prompt: None,
},
cx,
);
@@ -2655,6 +2657,7 @@ impl Workspace {
files: false,
directories: true,
multiple: true,
+ prompt: None,
},
DirectoryLister::Project(self.project.clone()),
window,
diff --git a/crates/zed/src/zed.rs b/crates/zed/src/zed.rs
index cfafbb70f0..6d5aecba70 100644
--- a/crates/zed/src/zed.rs
+++ b/crates/zed/src/zed.rs
@@ -645,6 +645,7 @@ fn register_actions(
files: true,
directories: true,
multiple: true,
+ prompt: None,
},
DirectoryLister::Local(
workspace.project().clone(),
@@ -685,6 +686,7 @@ fn register_actions(
files: true,
directories: true,
multiple: true,
+ prompt: None,
},
DirectoryLister::Project(workspace.project().clone()),
window,