diff --git a/src/platform/macos/window.rs b/src/platform/macos/window.rs index cbd66056..bba4fb30 100644 --- a/src/platform/macos/window.rs +++ b/src/platform/macos/window.rs @@ -116,6 +116,50 @@ impl WindowDelegate { } } + /// Invoked when the dragged image enters destination bounds or frame + extern fn dragging_entered(_: &Object, _: Sel, _: id) { + println!("dragging_entered"); + } + + /// Invoked when the image is released + extern fn prepare_for_drag_operation(_: &Object, _: Sel, _: id) { + println!("prepare_for_drag_operation"); + } + + /// Invoked after the released image has been removed from the screen + extern fn perform_drag_operation(_: &Object, _: Sel, sender: id) -> BOOL { + use cocoa::appkit::NSPasteboard; + + let pb: id = unsafe { msg_send![sender, draggingPasteboard] }; + + let filenames = unsafe { NSPasteboard::propertyListForType(pb, appkit::NSFilenamesPboardType) }; + + use cocoa::foundation::NSFastEnumeration; + for file in unsafe { filenames.iter() } { + use cocoa::foundation::NSString; + unsafe { + use std::ffi::CStr; + let f = NSString::UTF8String(file); + let str = CStr::from_ptr(f).to_string_lossy().into_owned(); + + println!("file: {:?}", str); + } + }; + + YES + + } + + /// Invoked when the dragging operation is complete + extern fn conclude_drag_operation(_: &Object, _: Sel, _: id) { + println!("conclude_drag_operation"); + } + + /// Invoked when the dragging operation is cancelled + extern fn dragging_exited(_: &Object, _: Sel, _: id) { + println!("dragging_exited"); + } + static mut DELEGATE_CLASS: *const Class = 0 as *const Class; static INIT: std::sync::Once = std::sync::ONCE_INIT; @@ -137,6 +181,18 @@ impl WindowDelegate { decl.add_method(sel!(windowDidResignKey:), window_did_resign_key as extern fn(&Object, Sel, id)); + // callback for drag events + decl.add_method(sel!(draggingEntered:), + dragging_entered as extern fn(&Object, Sel, id)); + decl.add_method(sel!(prepareForDragOperation:), + prepare_for_drag_operation as extern fn(&Object, Sel, id)); + decl.add_method(sel!(performDragOperation:), + perform_drag_operation as extern fn(&Object, Sel, id) -> BOOL); + decl.add_method(sel!(concludeDragOperation:), + conclude_drag_operation as extern fn(&Object, Sel, id)); + decl.add_method(sel!(draggingExited:), + dragging_exited as extern fn(&Object, Sel, id)); + // Store internal state as user data decl.add_ivar::<*mut c_void>("winitState"); @@ -263,6 +319,11 @@ impl Window { if let Some((width, height)) = win_attribs.max_dimensions { nswindow_set_max_dimensions(window.0, width.into(), height.into()); } + + use cocoa::foundation::NSArray; + // register for drag and drop operations. + msg_send![(*window as id), + registerForDraggedTypes:NSArray::arrayWithObject(nil, appkit::NSFilenamesPboardType)]; } let ds = DelegateState {