From 4125b54c0d1e27ad5090e246d1c877adc5b335b0 Mon Sep 17 00:00:00 2001 From: OJ Kwon Date: Fri, 30 Mar 2018 12:03:43 -0700 Subject: [PATCH] feat(browser): implement select file dialog --- ports/servo/browser.rs | 32 +++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/ports/servo/browser.rs b/ports/servo/browser.rs index cf188dad4a7..afdaeb173c9 100644 --- a/ports/servo/browser.rs +++ b/ports/servo/browser.rs @@ -10,6 +10,7 @@ use servo::compositing::windowing::{WebRenderDebugOption, WindowEvent}; use servo::ipc_channel::ipc::IpcSender; use servo::msg::constellation_msg::{Key, TopLevelBrowsingContextId as BrowserId}; use servo::msg::constellation_msg::{KeyModifiers, KeyState, TraversalDirection}; +use servo::net_traits::filemanager_thread::FilterPattern; use servo::net_traits::pub_domains::is_reg_domain; use servo::script_traits::TouchEventType; use servo::servo_config::prefs::PREFS; @@ -17,7 +18,6 @@ use servo::servo_url::ServoUrl; use servo::webrender_api::ScrollLocation; use std::mem; use std::rc::Rc; -#[cfg(target_os = "linux")] use std::thread; use tinyfiledialogs; @@ -296,6 +296,7 @@ impl Browser { platform_get_selected_devices(devices, sender); }, EmbedderMsg::GetSelectedFiles(patterns, multiple_files, sender) => { + platform_get_selected_files(patterns, multiple_files, sender); } EmbedderMsg::ShowIME(_browser_id, _kind) => { debug!("ShowIME received"); @@ -342,6 +343,35 @@ fn platform_get_selected_devices(devices: Vec, sender: IpcSender, multiple_files: bool, sender: IpcSender>>) { + let picker_name = if multiple_files { "Pick files" } else { "Pick a file" }; + + thread::Builder::new().name(picker_name.to_owned()).spawn(move || { + let mut filter = vec![]; + for p in patterns { + let s = "*.".to_string() + &p.0; + filter.push(s) + } + + let filter_ref = &(filter.iter().map(|s| s.as_str()).collect::>()[..]); + let filter_opt = if filter.len() > 0 { Some((filter_ref, "")) } else { None }; + + if multiple_files { + let files = tinyfiledialogs::open_file_dialog_multi(picker_name, "", filter_opt); + let _ = sender.send(files); + } else { + let file = tinyfiledialogs::open_file_dialog(picker_name, "", filter_opt); + let _ = sender.send(file.map(|x| vec![x])); + } + }).expect("Thread spawning failed"); +} + +#[cfg(not(any(target_os = "macos", target_os = "linux", target_os = "windows")))] +fn platform_get_selected_files(_patterns: Vec, _multiple_files: bool, sender: IpcSender>>) { + sender.send(None); +} + fn sanitize_url(request: &str) -> Option { let request = request.trim(); ServoUrl::parse(&request).ok()