use std::path::{Path, PathBuf};
pub type Filter<'a> = (&'a str, &'a [&'a str]);
fn base(title: &str, dir: Option<&Path>) -> rfd::FileDialog {
let mut d = rfd::FileDialog::new().set_title(title);
if let Some(dir) = dir.filter(|d| d.is_dir()) {
d = d.set_directory(dir);
}
d
}
fn with_filters(mut d: rfd::FileDialog, filters: &[Filter]) -> rfd::FileDialog {
for (name, exts) in filters {
if *exts == ["*"] {
continue; }
d = d.add_filter(*name, exts);
}
d
}
pub fn pick_file(title: &str, dir: Option<&Path>, filters: &[Filter]) -> Option<PathBuf> {
with_filters(base(title, dir), filters).pick_file()
}
pub fn pick_folder(title: &str, dir: Option<&Path>) -> Option<PathBuf> {
base(title, dir).pick_folder()
}
pub fn save_file(
title: &str,
dir: Option<&Path>,
default_name: &str,
filters: &[Filter],
) -> Option<PathBuf> {
let d = with_filters(base(title, dir), filters);
let d = if default_name.is_empty() {
d
} else {
d.set_file_name(default_name)
};
d.save_file()
}
pub fn error_alert(title: &str, message: &str) {
rfd::MessageDialog::new()
.set_level(rfd::MessageLevel::Error)
.set_title(title)
.set_description(message)
.show();
}
pub fn seed_dir(current: &str) -> Option<PathBuf> {
if current.is_empty() {
return None;
}
let p = PathBuf::from(current);
if p.is_dir() {
Some(p)
} else {
p.parent().map(Path::to_path_buf)
}
}