use std::ffi::OsString;
use crate::dialog::{FileDialogOptions, FileDialogType};
use gtk::{FileChooserAction, FileChooserExt, NativeDialogExt, ResponseType, Window};
use crate::Error;
pub(crate) fn get_file_dialog_path(
window: &Window,
ty: FileDialogType,
options: FileDialogOptions,
) -> Result<OsString, Error> {
let (title, action) = match (ty, options.select_directories) {
(FileDialogType::Open, false) => ("Open File", FileChooserAction::Open),
(FileDialogType::Open, true) => ("Open Folder", FileChooserAction::SelectFolder),
(FileDialogType::Save, _) => ("Save File", FileChooserAction::Save),
};
let dialog = gtk::FileChooserNativeBuilder::new()
.transient_for(window)
.title(title)
.build();
dialog.set_action(action);
dialog.set_show_hidden(options.show_hidden);
dialog.set_select_multiple(options.multi_selection);
let result = dialog.run();
let result = match result {
ResponseType::Accept => match dialog.get_filename() {
Some(path) => Ok(path.into_os_string()),
None => Err(Error::Other("No path received for filename")),
},
ResponseType::Cancel => Err(Error::Other("Dialog was deleted")),
_ => {
log::warn!("Unhandled dialog result: {:?}", result);
Err(Error::Other("Unhandled dialog result"))
}
};
dialog.destroy();
result
}