use std::ffi::OsString;
use crate::dialog::FileDialogOptions;
use gtkrs::{FileChooserAction, FileChooserExt, NativeDialogExt, Window};
use crate::Error;
pub enum FileDialogType {
Open,
Save,
}
pub(crate) fn open_file_sync(
window: &Window,
ty: FileDialogType,
options: FileDialogOptions,
) -> Result<OsString, Error> {
let (title, action) = match ty {
FileDialogType::Open => ("Open File", FileChooserAction::Open),
FileDialogType::Save => ("Save File", FileChooserAction::Save),
};
let dialog = gtkrs::FileChooserNativeBuilder::new()
.transient_for(window)
.title(title)
.build();
dialog.set_action(action);
dialog.set_show_hidden(options.show_hidden);
let result = dialog.run();
let result = match result {
gtk_sys::GTK_RESPONSE_ACCEPT => match dialog.get_filename() {
Some(path) => Ok(path.into_os_string()),
None => Err(Error::Other("No path received for filename")),
},
gtk_sys::GTK_RESPONSE_CANCEL => Err(Error::Other("Dialog was deleted")),
_ => {
eprintln!("Unhandled dialog result: {:?}", result);
Err(Error::Other("Unhandled dialog result"))
}
};
dialog.destroy();
result
}