From 088594dc8cffa95e1507934dc3d1953c6fef4f87 Mon Sep 17 00:00:00 2001 From: Chris Moeller Date: Sat, 12 Oct 2013 22:08:34 -0700 Subject: [PATCH] Implemented clipboard support for the playlist view --- English.lproj/MainMenu.xib | 7 +- Playlist/PlaylistView.h | 2 + Playlist/PlaylistView.m | 148 +++++++++++++++++++++++++++++++++++++ 3 files changed, 154 insertions(+), 3 deletions(-) diff --git a/English.lproj/MainMenu.xib b/English.lproj/MainMenu.xib index 3e82aac02..c9126efe9 100644 --- a/English.lproj/MainMenu.xib +++ b/English.lproj/MainMenu.xib @@ -85,7 +85,7 @@ - + @@ -291,6 +291,7 @@ + @@ -584,7 +585,7 @@ - + @@ -1759,7 +1760,7 @@ Gw - + YnBsaXN0MDDUAQIDBAUGRkdYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3ASAAGGoK8QDwcI ExQZHh8qKyw0NzpAQ1UkbnVsbNUJCgsMDQ4PEBESVk5TU2l6ZVYkY2xhc3NcTlNJbWFnZUZsYWdzVk5T diff --git a/Playlist/PlaylistView.h b/Playlist/PlaylistView.h index 34baa0d75..83e2ca41a 100644 --- a/Playlist/PlaylistView.h +++ b/Playlist/PlaylistView.h @@ -10,10 +10,12 @@ #import "PlaybackController.h" #import "PlaylistController.h" +#import "PlaylistLoader.h" @interface PlaylistView : NSTableView { IBOutlet PlaybackController *playbackController; IBOutlet PlaylistController *playlistController; + IBOutlet PlaylistLoader *playlistLoader; NSMenu *headerContextMenu; } diff --git a/Playlist/PlaylistView.m b/Playlist/PlaylistView.m index 11fb9f2bd..37b3aec7c 100644 --- a/Playlist/PlaylistView.m +++ b/Playlist/PlaylistView.m @@ -17,6 +17,8 @@ #import "CogAudio/Status.h" +#import "Logging.h" + @implementation PlaylistView - (void)awakeFromNib @@ -227,6 +229,132 @@ [[playlistController undoManager] redo]; } +- (IBAction)copy:(id)sender +{ + NSPasteboard *pboard = [NSPasteboard generalPasteboard]; + + [pboard clearContents]; + + NSMutableArray *selectedURLs = [[NSMutableArray alloc] init]; + + for (PlaylistEntry *pe in [[playlistController content] objectsAtIndexes:[playlistController selectionIndexes]]) + { + [selectedURLs addObject:[pe URL]]; + } + + [pboard setData:[NSArchiver archivedDataWithRootObject:selectedURLs] forType:CogUrlsPboardType]; + + NSMutableDictionary * tracks = [[NSMutableDictionary alloc] init]; + + unsigned long i = 0; + for (NSURL *url in selectedURLs) + { + NSMutableDictionary * track = [NSMutableDictionary dictionaryWithObjectsAndKeys:[url absoluteString], @"Location", nil]; + [tracks setObject:track forKey:[NSString stringWithFormat:@"%lu", i]]; + ++i; + } + + NSMutableDictionary * itunesPlist = [NSMutableDictionary dictionaryWithObjectsAndKeys:tracks, @"Tracks", nil]; + + [pboard setPropertyList:itunesPlist forType:iTunesDropType]; + + [tracks release]; + + NSMutableArray *filePaths = [[NSMutableArray alloc] init]; + + for (NSURL *url in selectedURLs) + { + if ([url isFileURL]) + [filePaths addObject:[url path]]; + } + + if ([filePaths count]) + [pboard setPropertyList:filePaths forType:NSFilenamesPboardType]; + + [filePaths release]; + + [selectedURLs release]; +} + +- (IBAction)cut:(id)sender +{ + [self copy:sender]; + + [playlistController removeObjectsAtArrangedObjectIndexes:[playlistController selectionIndexes]]; + + if ([playlistController shuffle] != ShuffleOff) + [playlistController resetShuffleList]; +} + +- (IBAction)paste:(id)sender +{ + // Determine the type of object that was dropped + NSArray *supportedTypes = [NSArray arrayWithObjects:CogUrlsPboardType, NSFilenamesPboardType, iTunesDropType, nil]; + NSPasteboard *pboard = [NSPasteboard generalPasteboard]; + NSString *bestType = [pboard availableTypeFromArray:supportedTypes]; + + NSMutableArray *acceptedURLs = [[NSMutableArray alloc] init]; + + // Get files from an file drawer drop + if ([bestType isEqualToString:CogUrlsPboardType]) { + NSArray *urls = [NSUnarchiver unarchiveObjectWithData:[pboard dataForType:CogUrlsPboardType]]; + DLog(@"URLS: %@", urls); + //[playlistLoader insertURLs: urls atIndex:row sort:YES]; + [acceptedURLs addObjectsFromArray:urls]; + } + + // Get files from a normal file drop (such as from Finder) + if ([bestType isEqualToString:NSFilenamesPboardType]) { + NSMutableArray *urls = [[NSMutableArray alloc] init]; + + for (NSString *file in [pboard propertyListForType:NSFilenamesPboardType]) + { + [urls addObject:[NSURL fileURLWithPath:file]]; + } + + //[playlistLoader insertURLs:urls atIndex:row sort:YES]; + [acceptedURLs addObjectsFromArray:urls]; + [urls release]; + } + + // Get files from an iTunes drop + if ([bestType isEqualToString:iTunesDropType]) { + NSDictionary *iTunesDict = [pboard propertyListForType:iTunesDropType]; + NSDictionary *tracks = [iTunesDict valueForKey:@"Tracks"]; + + // Convert the iTunes URLs to URLs....MWAHAHAH! + NSMutableArray *urls = [[NSMutableArray alloc] init]; + + for (NSDictionary *trackInfo in [tracks allValues]) { + [urls addObject:[NSURL URLWithString:[trackInfo valueForKey:@"Location"]]]; + } + + //[playlistLoader insertURLs:urls atIndex:row sort:YES]; + [acceptedURLs addObjectsFromArray:urls]; + [urls release]; + } + + if ([acceptedURLs count]) + { + NSUInteger row = [[playlistController content] count]; + + [playlistController willInsertURLs:acceptedURLs origin:URLOriginInternal]; + + NSArray* entries = [playlistLoader insertURLs:acceptedURLs atIndex:row sort:NO]; + [playlistLoader didInsertURLs:entries origin:URLOriginInternal]; + + if ([playlistController shuffle] != ShuffleOff) + [playlistController resetShuffleList]; + } + + [acceptedURLs release]; +} + +- (IBAction)delete:(id)sender +{ + [playlistController removeObjectsAtArrangedObjectIndexes:[playlistController selectionIndexes]]; +} + -(BOOL)validateUserInterfaceItem:(id )anItem { @@ -246,6 +374,26 @@ else return NO; } + if (action == @selector(cut:) || action == @selector(copy:) || action == @selector(delete:)) + { + if ([[playlistController selectionIndexes] count] == 0) + return NO; + else + return YES; + } + if (action == @selector(paste:)) + { + NSPasteboard *pboard = [NSPasteboard generalPasteboard]; + + NSArray *supportedTypes = [NSArray arrayWithObjects:CogUrlsPboardType, NSFilenamesPboardType, iTunesDropType, nil]; + + NSString *bestType = [pboard availableTypeFromArray:supportedTypes]; + + if (bestType != nil) + return YES; + else + return NO; + } if (action == @selector(scrollToCurrentEntry:) && ([playbackController playbackStatus] == kCogStatusStopped)) return NO;