From a934be5bc69ba21d2649192852d8ea3502fcd50e Mon Sep 17 00:00:00 2001 From: Mike Solar Date: Wed, 2 Sep 2026 12:00:23 +0800 Subject: [PATCH] platform: PathPromptOptions.allowed_extensions; Linux portal glob filter The system file pickers can restrict the choosable files to the extensions the host wants (project import: .ove/.otio/.fcpxml; export: the chosen format). Linux's ashpd OpenFileRequest applies a FileFilter of glob patterns per extension; empty = no restriction. --- crates/gpui/src/app/test_context.rs | 2 ++ crates/gpui/src/platform.rs | 3 +++ crates/gpui_linux/src/linux/platform.rs | 19 ++++++++++++++----- 3 files changed, 19 insertions(+), 5 deletions(-) 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 {