diff --git a/Playlist/DNDArrayController.h b/Playlist/DNDArrayController.h index 7417f9ea4..e475dce36 100755 --- a/Playlist/DNDArrayController.h +++ b/Playlist/DNDArrayController.h @@ -1,22 +1,28 @@ #import -extern NSString *MovedRowsType; +extern NSString *CogPlaylistItemType; extern NSString *CogUrlsPboardType; extern NSString *iTunesDropType; -@interface DNDArrayController : NSArrayController -{ - IBOutlet NSTableView *tableView; -} +@interface DNDArrayController : NSArrayController + +@property IBOutlet NSTableView *tableView; // table view drag and drop support -- (BOOL)tableView:(NSTableView *)aTableView writeRowsWithIndexes:(NSIndexSet *)rowIndexes toPasteboard:(NSPasteboard *)pboard; -- (NSDragOperation)tableView:(NSTableView*)tv validateDrop:(id )info proposedRow:(int)row proposedDropOperation:(NSTableViewDropOperation)op; -- (BOOL)tableView:(NSTableView*)tv acceptDrop:(id )info row:(int)row dropOperation:(NSTableViewDropOperation)op; - +- (id )tableView:(NSTableView *)tableView + pasteboardWriterForRow:(NSInteger)row; +- (NSDragOperation)tableView:(NSTableView *)tableView + validateDrop:(id )info + proposedRow:(int)row + proposedDropOperation:(NSTableViewDropOperation)dropOperation; +- (BOOL)tableView:(NSTableView *)tableView + acceptDrop:(id )info + row:(int)row + dropOperation:(NSTableViewDropOperation)dropOperation; // utility methods --(void)moveObjectsInArrangedObjectsFromIndexes:(NSIndexSet*)indexSet toIndex:(unsigned int)insertIndex; +-(void)moveObjectsInArrangedObjectsFromIndexes:(NSIndexSet *)indexSet + toIndex:(unsigned int)insertIndex; @end diff --git a/Playlist/DNDArrayController.m b/Playlist/DNDArrayController.m index 664177829..1e57aa543 100755 --- a/Playlist/DNDArrayController.m +++ b/Playlist/DNDArrayController.m @@ -5,7 +5,7 @@ @implementation DNDArrayController -NSString *MovedRowsType = @"MOVED_ROWS_TYPE"; +NSString *CogPlaylistItemType = @"org.cogx.cog.playlist-item"; NSString *CogUrlsPboardType = @"COG_URLS_TYPE"; // @"CorePasteboardFlavorType 0x6974756E" is the "itun" type representing an iTunes plist @@ -14,102 +14,105 @@ NSString *iTunesDropType = @"CorePasteboardFlavorType 0x6974756E"; - (void)awakeFromNib { // register for drag and drop - [tableView registerForDraggedTypes:[NSArray arrayWithObjects:MovedRowsType, CogUrlsPboardType, NSFilenamesPboardType, iTunesDropType, nil]]; + [self.tableView registerForDraggedTypes:@[CogPlaylistItemType, CogUrlsPboardType, + NSFilenamesPboardType, iTunesDropType]]; } -- (BOOL)tableView:(NSTableView *)aTableView writeRowsWithIndexes:(NSIndexSet *)rowIndexes toPasteboard:(NSPasteboard *)pboard +- (id )tableView:(NSTableView *)tableView + pasteboardWriterForRow:(NSInteger)row { - DLog(@"INDEX SET ON DRAG: %@", rowIndexes); - - NSData *data = [NSArchiver archivedDataWithRootObject:rowIndexes]; - - [pboard declareTypes: [NSArray arrayWithObjects:MovedRowsType, nil] owner:self]; - [pboard setData:data forType: MovedRowsType]; + NSPasteboardItem *item = [[NSPasteboardItem alloc] init]; + [item setString:[@(row) stringValue] forType:CogPlaylistItemType]; + + return item; +} - return YES; +- (void)tableView:(NSTableView *)tableView + draggingSession:(NSDraggingSession *)session + willBeginAtPoint:(NSPoint)screenPoint + forRowIndexes:(NSIndexSet *)rowIndexes +{ + DLog(@"Drag session started with indexes: %@", rowIndexes); } -- (NSDragOperation)tableView:(NSTableView*)tv - validateDrop:(id )info - proposedRow:(int)row - proposedDropOperation:(NSTableViewDropOperation)op +- (NSDragOperation)tableView:(NSTableView*)tableView + validateDrop:(id )info + proposedRow:(int)row + proposedDropOperation:(NSTableViewDropOperation)dropOperation { - NSDragOperation dragOp = NSDragOperationCopy; - - if ([info draggingSource] == tv) - dragOp = NSDragOperationMove; - - DLog(@"VALIDATING DROP!"); + NSDragOperation dragOp = NSDragOperationCopy; + + if ([info draggingSource] == tableView) + dragOp = NSDragOperationMove; + + DLog(@"VALIDATING DROP!"); // we want to put the object at, not over, - // the current row (contrast NSTableViewDropOn) - [tv setDropRow:row dropOperation:NSTableViewDropAbove]; - + // the current row (contrast NSTableViewDropOn) + [tableView setDropRow:row dropOperation:NSTableViewDropAbove]; + return dragOp; } -- (BOOL)tableView:(NSTableView*)tv - acceptDrop:(id )info - row:(int)row - dropOperation:(NSTableViewDropOperation)op +- (BOOL)tableView:(NSTableView*)tableView + acceptDrop:(id )info + row:(int)row + dropOperation:(NSTableViewDropOperation)dropOperation { - if (row < 0) - { - row = 0; - } - + if (row < 0) { + row = 0; + } + + NSArray *items = info.draggingPasteboard.pasteboardItems; // if drag source is self, it's a move - if ([info draggingSource] == tableView) - { - NSIndexSet *indexSet = [NSUnarchiver unarchiveObjectWithData:[[info draggingPasteboard] dataForType:MovedRowsType]]; - if (indexSet) - { - DLog(@"INDEX SET ON DROP: %@", indexSet); - NSArray *selected = [[self arrangedObjects] objectsAtIndexes:indexSet]; - [self moveObjectsInArrangedObjectsFromIndexes:indexSet toIndex:row]; - - [self setSelectedObjects:selected]; - - DLog(@"ACCEPTING DROP!"); - return YES; - } - } - DLog(@"REJECTING DROP!"); - return NO; + if ([info draggingSource] == tableView || items == nil) { + NSMutableIndexSet *indexSet = [NSMutableIndexSet indexSet]; + for (NSPasteboardItem *item in items) { + [indexSet addIndex:[[item stringForType:CogPlaylistItemType] intValue]]; + } + if ([indexSet count] > 0) { + DLog(@"INDEX SET ON DROP: %@", indexSet); + NSArray *selected = [[self arrangedObjects] objectsAtIndexes:indexSet]; + [self moveObjectsInArrangedObjectsFromIndexes:indexSet toIndex:row]; + + [self setSelectedObjects:selected]; + + DLog(@"ACCEPTING DROP!"); + return YES; + } + } + DLog(@"REJECTING DROP!"); + return NO; } --(void) moveObjectsInArrangedObjectsFromIndexes:(NSIndexSet*)indexSet - toIndex:(unsigned int)insertIndex +-(void) moveObjectsInArrangedObjectsFromIndexes:(NSIndexSet *)indexSet + toIndex:(unsigned int)insertIndex { - - NSArray *objects = [self arrangedObjects]; - NSUInteger index = [indexSet lastIndex]; - - int aboveInsertIndexCount = 0; - id object; - int removeIndex; - - while (NSNotFound != index) - { - if (index >= insertIndex) { - removeIndex = (int)(index + aboveInsertIndexCount); - aboveInsertIndexCount += 1; - } - else - { - removeIndex = (int)index; - insertIndex -= 1; - } - - object = [objects objectAtIndex:removeIndex]; + NSArray *objects = [self arrangedObjects]; + NSUInteger index = [indexSet lastIndex]; - [self removeObjectAtArrangedObjectIndex:removeIndex]; - [self insertObject:object atArrangedObjectIndex:insertIndex]; - - index = [indexSet indexLessThanIndex:index]; + int aboveInsertIndexCount = 0; + id object; + int removeIndex; + + while (NSNotFound != index) { + if (index >= insertIndex) { + removeIndex = (int)(index + aboveInsertIndexCount); + aboveInsertIndexCount += 1; + } else { + removeIndex = (int)index; + insertIndex -= 1; + } + + object = [objects objectAtIndex:removeIndex]; + + [self removeObjectAtArrangedObjectIndex:removeIndex]; + [self insertObject:object atArrangedObjectIndex:insertIndex]; + + index = [indexSet indexLessThanIndex:index]; } } diff --git a/Playlist/PlaylistController.m b/Playlist/PlaylistController.m index ad860f37c..f99e5db2c 100644 --- a/Playlist/PlaylistController.m +++ b/Playlist/PlaylistController.m @@ -867,7 +867,7 @@ pe.current = YES; if (pe != nil) - [tableView scrollRowToVisible:pe.index]; + [self.tableView scrollRowToVisible:pe.index]; currentEntry = pe; }