use std::path::PathBuf;
use reactive_core::{Task, spawn_task};
use services_core::file_dialogs;
pub use services_core::{FileDialog, FileFilter};
fn ask<T, P, F>(pick: P, on_done: F) -> Task
where
T: Default + Send + 'static,
P: FnOnce(&dyn services_core::FileDialogs) -> T + Send + 'static,
F: FnOnce(T) + 'static,
{
spawn_task(
move || match file_dialogs() {
Some(dialogs) => pick(dialogs.as_ref()),
None => T::default(),
},
on_done,
)
}
pub fn open_file(request: FileDialog, on_done: impl FnOnce(Option<PathBuf>) + 'static) -> Task {
ask(move |d| d.open_file(request), on_done)
}
pub fn open_files(request: FileDialog, on_done: impl FnOnce(Vec<PathBuf>) + 'static) -> Task {
ask(move |d| d.open_files(request), on_done)
}
pub fn save_file(request: FileDialog, on_done: impl FnOnce(Option<PathBuf>) + 'static) -> Task {
ask(move |d| d.save_file(request), on_done)
}
pub fn pick_folder(request: FileDialog, on_done: impl FnOnce(Option<PathBuf>) + 'static) -> Task {
ask(move |d| d.pick_folder(request), on_done)
}