Skip to content

Commit

Permalink
Cocoa: support drag-and-drop of multiple objects.
Browse files Browse the repository at this point in the history
  • Loading branch information
icculus committed Jul 4, 2015
1 parent b5c43a8 commit 65a1a3e
Showing 1 changed file with 44 additions and 22 deletions.
66 changes: 44 additions & 22 deletions src/video/cocoa/SDL_cocoawindow.m
Expand Up @@ -106,42 +106,64 @@ - (void)doCommandBySelector:(SEL)aSelector

- (NSDragOperation)draggingEntered:(id <NSDraggingInfo>)sender
{
return NSDragOperationGeneric;
if (([sender draggingSourceOperationMask] & NSDragOperationGeneric) == NSDragOperationGeneric) {
return NSDragOperationGeneric;
}

return NSDragOperationNone; /* no idea what to do with this, reject it. */
}

- (BOOL)performDragOperation:(id <NSDraggingInfo>)sender
{ @autoreleasepool
{
NSURL *fileURL = [NSURL URLFromPasteboard:[sender draggingPasteboard]];
NSNumber *isAlias = nil;
NSPasteboard *pasteboard = [sender draggingPasteboard];
NSArray *types = [NSArray arrayWithObject:NSFilenamesPboardType];
NSString *desiredType = [pasteboard availableTypeFromArray:types];
if (desiredType == nil) {
return NO; /* can't accept anything that's being dropped here. */
}

if (fileURL == nil) {
NSData *data = [pasteboard dataForType:desiredType];
if (data == nil) {
return NO;
}

/* Functionality for resolving URL aliases was added with OS X 10.6. */
if ([fileURL respondsToSelector:@selector(getResourceValue:forKey:error:)]) {
[fileURL getResourceValue:&isAlias forKey:NSURLIsAliasFileKey error:nil];
}
SDL_assert([desiredType isEqualToString:NSFilenamesPboardType]);
NSArray *array = [pasteboard propertyListForType:@"NSFilenamesPboardType"];

for (NSString *path in array) {
NSURL *fileURL = [[NSURL fileURLWithPath:path] autorelease];
NSNumber *isAlias = nil;

/* If the URL is an alias, resolve it. */
if ([isAlias boolValue]) {
NSURLBookmarkResolutionOptions opts = NSURLBookmarkResolutionWithoutMounting | NSURLBookmarkResolutionWithoutUI;
NSData *bookmark = [NSURL bookmarkDataWithContentsOfURL:fileURL error:nil];
if (bookmark != nil) {
NSURL *resolvedURL = [NSURL URLByResolvingBookmarkData:bookmark
options:opts
relativeToURL:nil
bookmarkDataIsStale:nil
error:nil];
/* Functionality for resolving URL aliases was added with OS X 10.6. */
if ([fileURL respondsToSelector:@selector(getResourceValue:forKey:error:)]) {
[fileURL getResourceValue:&isAlias forKey:NSURLIsAliasFileKey error:nil];
}

if (resolvedURL != nil) {
fileURL = resolvedURL;
/* If the URL is an alias, resolve it. */
if ([isAlias boolValue]) {
NSURLBookmarkResolutionOptions opts = NSURLBookmarkResolutionWithoutMounting | NSURLBookmarkResolutionWithoutUI;
NSData *bookmark = [NSURL bookmarkDataWithContentsOfURL:fileURL error:nil];
if (bookmark != nil) {
NSURL *resolvedURL = [NSURL URLByResolvingBookmarkData:bookmark
options:opts
relativeToURL:nil
bookmarkDataIsStale:nil
error:nil];

if (resolvedURL != nil) {
fileURL = resolvedURL;
}
}
}

if (!SDL_SendDropFile([[fileURL path] UTF8String])) {
return NO;
}
}

return (BOOL) SDL_SendDropFile([[fileURL path] UTF8String]);
}
return YES;
}}

- (BOOL)wantsPeriodicDraggingUpdates
{
Expand Down

0 comments on commit 65a1a3e

Please sign in to comment.