From fa67b79b22701c0c074300e06cf5a1efe40334b0 Mon Sep 17 00:00:00 2001 From: Christopher Snowhill Date: Mon, 24 Jan 2022 21:30:36 -0800 Subject: [PATCH] Mini Window: Window now acts as a drop target for files, sending them to the end of the playlist --- Window/MiniWindow.h | 4 +- Window/MiniWindow.m | 132 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 135 insertions(+), 1 deletion(-) diff --git a/Window/MiniWindow.h b/Window/MiniWindow.h index 043594dd5..7a1e14a18 100644 --- a/Window/MiniWindow.h +++ b/Window/MiniWindow.h @@ -8,9 +8,11 @@ #import #import "PlaybackController.h" +#import "PlaylistController.h" -@interface MiniWindow : NSWindow { +@interface MiniWindow : NSWindow { IBOutlet PlaybackController *playbackController; + IBOutlet PlaylistController *playlistController; IBOutlet NSToolbar *miniToolbar; NSImage *hdcdLogo; } diff --git a/Window/MiniWindow.m b/Window/MiniWindow.m index 6ac34cd19..40460305c 100644 --- a/Window/MiniWindow.m +++ b/Window/MiniWindow.m @@ -10,6 +10,8 @@ #import +extern NSString *iTunesDropType; + @implementation MiniWindow - (id)initWithContentRect:(NSRect)contentRect styleMask:(NSWindowStyleMask)windowStyle backing:(NSBackingStoreType)bufferingType defer:(BOOL)deferCreation @@ -34,7 +36,19 @@ - (void)awakeFromNib { + [super awakeFromNib]; + [self showHDCDLogo:NO]; + + NSPasteboardType fileType; + if (@available(macOS 10.13, *)) { + fileType = NSPasteboardTypeFileURL; + } + else { + fileType = NSFilenamesPboardType; + } + [self setLevel:kCGDraggingWindowLevel-1]; + [self registerForDraggedTypes:@[fileType, iTunesDropType]]; } - (void)toggleToolbarShown:(id)sender { @@ -96,4 +110,122 @@ } } +- (NSDragOperation) draggingEntered:(id)sender +{ + NSPasteboard * pboard = [sender draggingPasteboard]; + NSDragOperation sourceDragMask = [sender draggingSourceOperationMask]; + + NSPasteboardType fileType; + if (@available(macOS 10.13, *)) { + fileType = NSPasteboardTypeFileURL; + } + else { + fileType = NSFilenamesPboardType; + } + + if ([[pboard types] containsObject:iTunesDropType]) + { + if (sourceDragMask & NSDragOperationGeneric) + { + return NSDragOperationGeneric; + } + } + + if ([[pboard types] containsObject:fileType]) + { + if (sourceDragMask & NSDragOperationGeneric) + { + return NSDragOperationGeneric; + } + } + + return NSDragOperationNone; +} + +- (NSDragOperation) draggingUpdated:(id)sender +{ + NSPasteboard * pboard = [sender draggingPasteboard]; + NSDragOperation sourceDragMask = [sender draggingSourceOperationMask]; + + NSPasteboardType fileType; + if (@available(macOS 10.13, *)) { + fileType = NSPasteboardTypeFileURL; + } + else { + fileType = NSFilenamesPboardType; + } + + if ([[pboard types] containsObject:iTunesDropType]) + { + if (sourceDragMask & NSDragOperationGeneric) + { + return NSDragOperationGeneric; + } + } + + if ([[pboard types] containsObject:fileType]) + { + if (sourceDragMask & NSDragOperationGeneric) + { + return NSDragOperationGeneric; + } + } + + return NSDragOperationNone; + +} + +- (BOOL) prepareForDragOperation:(id)sender +{ + NSPasteboard * pboard = [sender draggingPasteboard]; + NSDragOperation sourceDragMask = [sender draggingSourceOperationMask]; + + NSPasteboardType fileType; + if (@available(macOS 10.13, *)) { + fileType = NSPasteboardTypeFileURL; + } + else { + fileType = NSFilenamesPboardType; + } + + if ([[pboard types] containsObject:iTunesDropType]) + { + if (sourceDragMask & NSDragOperationGeneric) + { + return YES; + } + } + + if ([[pboard types] containsObject:fileType]) + { + if (sourceDragMask & NSDragOperationGeneric) + { + return YES; + } + } + + return NO; +} + +- (BOOL) performDragOperation:(id)sender +{ + NSPasteboard * pboard = [sender draggingPasteboard]; + + NSPasteboardType fileType; + if (@available(macOS 10.13, *)) { + fileType = NSPasteboardTypeFileURL; + } + else { + fileType = NSFilenamesPboardType; + } + + if ([[pboard types] containsObject:iTunesDropType] || + [[pboard types] containsObject:fileType]) { + NSUInteger row = [[playlistController arrangedObjects] count]; + return [playlistController tableView:[playlistController tableView] acceptDrop:sender row:row dropOperation:NSTableViewDropOn]; + } + + return NO; +} + @end