use std::path::{Path, PathBuf};
use raw_window_handle::HasWindowHandle;
use crate::dialog::{
FileFilter, FileFiltersBag, OpenMultipleFile, OpenSingleDir, OpenSingleFile, SaveSingleFile,
};
use crate::ffi::UnsafeWindowHandle;
#[derive(Debug, Clone, Default)]
pub struct FileDialogBuilder {
pub filename: Option<String>,
pub location: Option<PathBuf>,
pub filters: FileFiltersBag,
pub owner: UnsafeWindowHandle,
pub title: Option<String>,
}
impl FileDialogBuilder {
pub fn set_title(mut self, title: impl ToString) -> Self {
self.title = Some(title.to_string());
self
}
pub fn set_filename(mut self, filename: impl ToString) -> Self {
self.filename = Some(filename.to_string());
self
}
pub fn reset_filename(mut self) -> Self {
self.filename = None;
self
}
pub fn set_location<P: AsRef<Path> + ?Sized>(mut self, path: &P) -> Self {
self.location = Some(path.as_ref().to_path_buf());
self
}
pub fn reset_location(mut self) -> Self {
self.location = None;
self
}
pub fn add_filter<T, U, V>(mut self, name: T, extensions: V) -> Self
where
T: ToString,
U: ToString,
V: AsRef<[U]>,
{
self.filters.add(name, extensions);
self
}
pub fn add_filters<I>(mut self, filters: I) -> Self
where
I: IntoIterator<Item = (String, Vec<String>)>,
{
let filters = filters.into_iter().flat_map(|(x, y)| FileFilter::new(x, y));
self.filters.items.extend(filters);
self
}
pub fn reset_filters(mut self) -> Self {
self.filters.items.clear();
self
}
pub fn set_owner<W: HasWindowHandle>(mut self, window: &W) -> Self {
self.owner = UnsafeWindowHandle::new(window);
self
}
pub fn reset_owner(mut self) -> Self {
self.owner = UnsafeWindowHandle::default();
self
}
pub fn open_single_file(self) -> OpenSingleFile {
OpenSingleFile {
filename: self.filename,
location: self.location,
filters: self.filters,
owner: self.owner,
title: self.title.unwrap_or("Open a File".to_string()),
}
}
pub fn open_multiple_file(self) -> OpenMultipleFile {
OpenMultipleFile {
filename: self.filename,
location: self.location,
filters: self.filters,
owner: self.owner,
title: self.title.unwrap_or("Open Files".to_string()),
}
}
pub fn open_single_dir(self) -> OpenSingleDir {
OpenSingleDir {
filename: self.filename,
location: self.location,
owner: self.owner,
title: self.title.unwrap_or("Open a Folder".to_string()),
}
}
pub fn save_single_file(self) -> SaveSingleFile {
SaveSingleFile {
filename: self.filename,
location: self.location,
filters: self.filters,
owner: self.owner,
title: self.title.unwrap_or("Save As".to_string()),
}
}
}