#include #include #include #include #include #include #include "UIDragDrop.h" #include "UIDragDropMac.h" static Atomic::WeakPtr dragAndDrop_; @interface NSWindow (NSWindowWithDragAndDrop) -(NSDragOperation)draggingEntered:(id )sender; -(NSDragOperation)draggingUpdated:(id)sender; -(BOOL)prepareForDragOperation:(id)sender; -(BOOL)performDragOperation:(id )sender; -(void)concludeDragOperation:(id )sender; @end @implementation NSWindow (NSWindowWithDragAndDrop) -(NSDragOperation)draggingEntered:(id )sender { NSPasteboard *pboard = [sender draggingPasteboard]; NSString *type = [pboard availableTypeFromArray:[NSArray arrayWithObject:NSFilenamesPboardType]]; if (type) { if ([type isEqualToString:NSFilenamesPboardType]) { NSArray *filenames = [pboard propertyListForType:NSFilenamesPboardType]; int i = (int) [filenames count]; if (i) dragAndDrop_->FileDragEntered(); while (i-- > 0) { NSString *filename = [filenames objectAtIndex:i]; dragAndDrop_->FileDragAddFile([filename UTF8String]); } } } return NSDragOperationCopy; } -(NSDragOperation)draggingUpdated:(id )sender { using namespace Atomic::MouseMove; Atomic::Graphics* graphics = dragAndDrop_->GetSubsystem(); NSPoint dragPoint = [sender draggingLocation]; Atomic::VariantMap eventData; eventData[P_X] = (int) dragPoint.x; eventData[P_Y] = graphics->GetHeight() - (int) dragPoint.y; eventData[P_DX] = 0; eventData[P_DY] = 0; eventData[P_BUTTONS] = 0; eventData[P_QUALIFIERS] = 0; dragAndDrop_->SendEvent(Atomic::E_MOUSEMOVE, eventData); return NSDragOperationCopy; } -(BOOL)prepareForDragOperation:(id)sender { return YES; } -(BOOL)performDragOperation:(id )sender { return YES; } -(void)concludeDragOperation:(id )sender { dragAndDrop_->FileDragConclude(); } @end namespace Atomic { static NSWindow* GetNSWindow() { SDL_Window* window = (SDL_Window*) dragAndDrop_->GetSubsystem()->GetSDLWindow(); SDL_SysWMinfo info; SDL_VERSION(&info.version); if(SDL_GetWindowWMInfo(window, &info)) { return info.info.cocoa.window; } return NULL; } /* void StartDragAndDrop() { Object* o = dragAndDrop_->GetDragObject(); if (!o) return; ToolCore::Asset* asset = o->GetType() == ToolCore::Asset::GetTypeStatic() ? (ToolCore::Asset*) o : NULL; if (asset) { NSWindow* window = GetNSWindow(); if (window) { NSImage *dragImage = nil; NSPoint dragPosition; NSString* filePath = [NSString stringWithUTF8String:asset->GetPath().CString()]; // Write data to the pasteboard NSArray *fileList = [NSArray arrayWithObjects:filePath, nil]; NSPasteboard *pboard = [NSPasteboard pasteboardWithName:NSDragPboard]; [pboard declareTypes:[NSArray arrayWithObject:NSFilenamesPboardType] owner:nil]; [pboard setPropertyList:fileList forType:NSFilenamesPboardType]; // blocks [window dragImage:dragImage at:dragPosition offset:NSZeroSize event:nil pasteboard:pboard source:window slideBack:YES]; } } } */ void InitDragAndDrop(UIDragDrop *dragAndDrop) { dragAndDrop_ = dragAndDrop; NSWindow* window = GetNSWindow(); if (window) { [window registerForDraggedTypes:[NSArray arrayWithObjects: NSFilenamesPboardType, nil]]; } } }