diff --git a/crates/gpui/src/app/test_context.rs b/crates/gpui/src/app/test_context.rs index edf4094653..b65eaf783f 100644 --- a/crates/gpui/src/app/test_context.rs +++ b/crates/gpui/src/app/test_context.rs @@ -1128,6 +1128,7 @@ mod tests { directories: true, multiple: true, prompt: None, + allowed_extensions: Vec::new(), }) }); assert!(cx.did_prompt_for_paths()); @@ -1154,6 +1155,7 @@ mod tests { directories: false, multiple: false, prompt: None, + allowed_extensions: Vec::new(), }) }); diff --git a/crates/gpui/src/platform.rs b/crates/gpui/src/platform.rs index cb92bb8494..6c990de5b6 100644 --- a/crates/gpui/src/platform.rs +++ b/crates/gpui/src/platform.rs @@ -1845,6 +1845,9 @@ pub struct PathPromptOptions { pub multiple: bool, /// The prompt to show to a user when selecting a path pub prompt: Option, + /// Restrict the choosable items to these lowercase extensions + /// (without the dot; empty = no restriction). Empty also means "any". + pub allowed_extensions: Vec, } /// What kind of prompt styling to show diff --git a/crates/gpui_linux/src/linux/platform.rs b/crates/gpui_linux/src/linux/platform.rs index 7c86cee59b..aedc4ef166 100644 --- a/crates/gpui_linux/src/linux/platform.rs +++ b/crates/gpui_linux/src/linux/platform.rs @@ -358,16 +358,25 @@ impl Platform for LinuxPlatform

{ "Open File" }; - let request = match ashpd::desktop::file_chooser::OpenFileRequest::default() + let mut request = ashpd::desktop::file_chooser::OpenFileRequest::default() .identifier(identifier.await) .modal(true) .title(title) .accept_label(options.prompt.as_ref().map(gpui::SharedString::as_str)) .multiple(options.multiple) - .directory(options.directories) - .send() - .await - { + .directory(options.directories); + // Extension filter (the caller's allowed_extensions, e.g. + // ["ove","otio","fcpxml"] for the project import/export): + // the portal filter globs the accepted patterns. + if !options.allowed_extensions.is_empty() { + let mut filter = + ashpd::desktop::file_chooser::FileFilter::new("Supported files"); + for ext in &options.allowed_extensions { + filter = filter.glob(&format!("*.{ext}")); + } + request = request.filter(filter); + } + let request = match request.send().await { Ok(request) => request, Err(err) => { let result = match err {