use block::ConcreteBlock;
use objc::runtime::Object;
use objc::{class, msg_send, sel, sel_impl};
use objc_id::ShareId;
use crate::foundation::{id, nil, NSInteger, NSString, NO, YES};
#[derive(Debug)]
pub struct FileSavePanel {
pub panel: ShareId<Object>,
pub delegate: ShareId<Object>,
pub can_create_directories: bool
}
impl Default for FileSavePanel {
fn default() -> Self {
FileSavePanel::new()
}
}
impl FileSavePanel {
pub fn new() -> Self {
FileSavePanel {
panel: unsafe {
let cls = class!(NSSavePanel);
let x: id = msg_send![cls, savePanel];
ShareId::from_ptr(x)
},
delegate: unsafe { ShareId::from_ptr(msg_send![class!(NSObject), new]) },
can_create_directories: true
}
}
pub fn set_delegate(&mut self) {}
pub fn set_suggested_filename<S: AsRef<str>>(&mut self, suggested_filename: S) {
unsafe {
let filename = NSString::new(suggested_filename.as_ref());
let _: () = msg_send![&*self.panel, setNameFieldStringValue:&*filename];
}
}
pub fn set_message<S: AsRef<str>>(&mut self, message: S) {
unsafe {
let message = NSString::new(message.as_ref());
let _: () = msg_send![&*self.panel, setMessage:&*message];
}
}
pub fn set_can_create_directories(&mut self, can_create: bool) {
unsafe {
let _: () = msg_send![&*self.panel, setCanCreateDirectories:match can_create {
true => YES,
false => NO
}];
}
self.can_create_directories = can_create;
}
pub fn show<F: Fn(Option<String>) + 'static>(&self, handler: F) {
let panel = self.panel.clone();
let completion = ConcreteBlock::new(move |_result: NSInteger| {
handler(get_url(&panel));
});
let completion = completion.copy();
unsafe {
let _: () = msg_send![&*self.panel, runModal];
completion.call((1,));
}
}
}
pub fn get_url(panel: &Object) -> Option<String> {
unsafe {
let url: id = msg_send![&*panel, URL];
if url == nil {
None
} else {
let path: id = msg_send![url, path];
Some(NSString::retain(path).to_string())
}
}
}