From dc5e03920857ebef62a3eb0b36015f4fe5ad279d Mon Sep 17 00:00:00 2001 From: tpoole Date: Tue, 7 Feb 2017 12:54:01 +0000 Subject: [PATCH] Fixed multiple file drag and drop on OS X --- .../native/juce_mac_NSViewComponentPeer.mm | 2 +- .../native/juce_mac_Windowing.mm | 50 ++++++++++++++++--- 2 files changed, 44 insertions(+), 8 deletions(-) diff --git a/modules/juce_gui_basics/native/juce_mac_NSViewComponentPeer.mm b/modules/juce_gui_basics/native/juce_mac_NSViewComponentPeer.mm index 64b86bfdf0..da76a50bb3 100644 --- a/modules/juce_gui_basics/native/juce_mac_NSViewComponentPeer.mm +++ b/modules/juce_gui_basics/native/juce_mac_NSViewComponentPeer.mm @@ -1865,7 +1865,7 @@ struct JuceNSWindowClass : public ObjCClass addIvar ("owner"); addMethod (@selector (canBecomeKeyWindow), canBecomeKeyWindow, "c@:"); - addMethod (@selector (canBecomeMainWindow), canBecomeMainWindow, "c@:"); + addMethod (@selector (canBecomeMainWindow), canBecomeMainWindow, "c@:"); addMethod (@selector (becomeKeyWindow), becomeKeyWindow, "v@:"); addMethod (@selector (windowShouldClose:), windowShouldClose, "c@:@"); addMethod (@selector (constrainFrameRect:toScreen:), constrainFrameRect, @encode (NSRect), "@:", @encode (NSRect), "@"); diff --git a/modules/juce_gui_basics/native/juce_mac_Windowing.mm b/modules/juce_gui_basics/native/juce_mac_Windowing.mm index ee22f3b191..ee976540e2 100644 --- a/modules/juce_gui_basics/native/juce_mac_Windowing.mm +++ b/modules/juce_gui_basics/native/juce_mac_Windowing.mm @@ -22,6 +22,26 @@ ============================================================================== */ +} // namespace juce + +@interface NSDraggingSourceHelper : NSObject +{ +} +@end + +@implementation NSDraggingSourceHelper + +-(NSDragOperation) draggingSession: (NSDraggingSession *)session sourceOperationMaskForDraggingContext: (NSDraggingContext)context +{ + juce::ignoreUnused (session, context); + return NSDragOperationCopy; +} + +@end + +namespace juce { + +//============================================================================== void LookAndFeel::playAlertSound() { NSBeep(); @@ -241,14 +261,30 @@ bool DragAndDropContainer::performExternalDragDropOfFiles (const StringArray& fi { if (auto* event = [[view window] currentEvent]) { - auto dragRect = getDragRect (view, event); + auto* dragItems = [[[NSMutableArray alloc] init] autorelease]; + for (auto& filename : files) + { + auto* nsFilename = juceStringToNS (filename); + auto* fileURL = [NSURL fileURLWithPath: nsFilename]; + auto* dragItem = [[NSDraggingItem alloc] initWithPasteboardWriter: fileURL]; - for (int i = 0; i < files.size(); ++i) - if (! [view dragFile: juceStringToNS (files[i]) - fromRect: dragRect - slideBack: YES - event: event]) - return false; + auto eventPos = [event locationInWindow]; + auto dragRect = [view convertRect: NSMakeRect (eventPos.x - 16.0f, eventPos.y - 16.0f, 32.0f, 32.0f) + fromView: nil]; + auto *dragImage = [[NSWorkspace sharedWorkspace] iconForFile: nsFilename]; + [dragItem setDraggingFrame: dragRect + contents: dragImage]; + + [dragItems addObject: dragItem]; + [dragItem release]; + } + + auto* helper = [[NSDraggingSourceHelper alloc] autorelease]; + + if (! [view beginDraggingSessionWithItems: dragItems + event: event + source: helper]) + return false; return true; }