From f451cd17128ace9af47a103892c98db9147a7caa Mon Sep 17 00:00:00 2001 From: vspader Date: Sun, 24 Feb 2008 15:47:04 +0000 Subject: [PATCH] Fixed playlist moving. --- Playlist/DNDArrayController.h | 6 +-- Playlist/DNDArrayController.m | 88 +++++++++++------------------------ Playlist/PlaylistController.m | 54 ++++++++++++--------- Playlist/PlaylistView.m | 8 ++++ 4 files changed, 69 insertions(+), 87 deletions(-) diff --git a/Playlist/DNDArrayController.h b/Playlist/DNDArrayController.h index f6f9adfe3..7417f9ea4 100755 --- a/Playlist/DNDArrayController.h +++ b/Playlist/DNDArrayController.h @@ -11,16 +11,12 @@ extern NSString *iTunesDropType; } // table view drag and drop support -- (BOOL)tableView:(NSTableView *)tv writeRows:(NSArray*)rows toPasteboard:(NSPasteboard*)pboard; +- (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; // utility methods --(void)moveObjectsFromArrangedObjectIndexes:(NSArray *) sources toIndexes:(NSArray *)destinations; - -(void)moveObjectsInArrangedObjectsFromIndexes:(NSIndexSet*)indexSet toIndex:(unsigned int)insertIndex; -- (NSIndexSet *)indexSetFromRows:(NSArray *)rows; - @end diff --git a/Playlist/DNDArrayController.m b/Playlist/DNDArrayController.m index b86874cf6..66553379c 100755 --- a/Playlist/DNDArrayController.m +++ b/Playlist/DNDArrayController.m @@ -16,15 +16,14 @@ NSString *iTunesDropType = @"CorePasteboardFlavorType 0x6974756E"; } -- (BOOL)tableView:(NSTableView *)tv - writeRows:(NSArray*)rows - toPasteboard:(NSPasteboard*)pboard +- (BOOL)tableView:(NSTableView *)aTableView writeRowsWithIndexes:(NSIndexSet *)rowIndexes toPasteboard:(NSPasteboard *)pboard { - NSData *data; - data = [NSKeyedArchiver archivedDataWithRootObject:rows]; + NSLog(@"INDEX SET ON DRAG: %@", rowIndexes); + + NSData *data = [NSArchiver archivedDataWithRootObject:rowIndexes]; [pboard declareTypes: [NSArray arrayWithObjects:MovedRowsType, nil] owner:self]; - [pboard setData: data forType: MovedRowsType]; + [pboard setData:data forType: MovedRowsType]; return YES; } @@ -61,58 +60,33 @@ NSString *iTunesDropType = @"CorePasteboardFlavorType 0x6974756E"; // if drag source is self, it's a move if ([info draggingSource] == tableView) { - NSArray *rows = [NSKeyedUnarchiver unarchiveObjectWithData:[[info draggingPasteboard] dataForType: MovedRowsType]]; - - NSIndexSet *indexSet = [self indexSetFromRows:rows]; - - [self moveObjectsInArrangedObjectsFromIndexes:indexSet toIndex:row]; - - // set selected rows to those that were just moved - // Need to work out what moved where to determine proper selection... - - return YES; + NSIndexSet *indexSet = [NSUnarchiver unarchiveObjectWithData:[[info draggingPasteboard] dataForType:MovedRowsType]]; + if (indexSet) + { + NSLog(@"INDEX SET ON DROP: %@", indexSet); + NSArray *selected = [[self arrangedObjects] objectsAtIndexes:indexSet]; + [self moveObjectsInArrangedObjectsFromIndexes:indexSet toIndex:row]; + + [self setSelectedObjects:selected]; + + return YES; + } } return NO; } --(void)moveObjectsFromArrangedObjectIndexes:(NSArray *) sources toIndexes:(NSArray *)destinations; -{ - //We expect [sources count] == [destinations count]. - NSMutableArray *selectedObjects = [[NSMutableArray alloc] init]; - - NSUInteger i = 0; - for (i = 0; i < [sources count]; i++) { - NSUInteger source = [[sources objectAtIndex:i] unsignedIntegerValue]; - NSUInteger dest = [[destinations objectAtIndex:i] unsignedIntegerValue]; - - id object = [[self arrangedObjects] objectAtIndex:source]; - - [object retain]; - - [self removeObjectAtArrangedObjectIndex:source]; - [self insertObject:object atArrangedObjectIndex:dest]; - - [selectedObjects addObject: object]; - - [object release]; - } - - [self setSelectedObjects:selectedObjects]; - - [selectedObjects release]; -} - --(void)moveObjectsInArrangedObjectsFromIndexes:(NSIndexSet*)indexSet +-(void) moveObjectsInArrangedObjectsFromIndexes:(NSIndexSet*)indexSet toIndex:(unsigned int)insertIndex { + + NSArray *objects = [self arrangedObjects]; int index = [indexSet lastIndex]; + int aboveInsertIndexCount = 0; + id object; int removeIndex; - - NSMutableArray *sources = [NSMutableArray array]; - NSMutableArray *destinations = [NSMutableArray array]; while (NSNotFound != index) { @@ -126,24 +100,16 @@ NSString *iTunesDropType = @"CorePasteboardFlavorType 0x6974756E"; insertIndex -= 1; } - [sources addObject:[NSNumber numberWithUnsignedInteger:removeIndex]]; - [destinations addObject: [NSNumber numberWithUnsignedInteger:insertIndex]]; + object = [objects objectAtIndex:removeIndex]; + + [object retain]; + [self removeObjectAtArrangedObjectIndex:removeIndex]; + [self insertObject:object atArrangedObjectIndex:insertIndex]; + [object release]; index = [indexSet indexLessThanIndex:index]; } - - [self moveObjectsFromArrangedObjectIndexes:sources toIndexes:destinations]; } -- (NSIndexSet *)indexSetFromRows:(NSArray *)rows -{ - NSMutableIndexSet *indexSet = [NSMutableIndexSet indexSet]; - - for (NSNumber *idx in rows) - { - [indexSet addIndex:[idx unsignedIntValue]]; - } - return indexSet; -} @end diff --git a/Playlist/PlaylistController.m b/Playlist/PlaylistController.m index ee883cc29..80a1c5220 100644 --- a/Playlist/PlaylistController.m +++ b/Playlist/PlaylistController.m @@ -84,25 +84,42 @@ return [[[self arrangedObjects] objectAtIndex:row] statusMessage]; } --(void)moveObjectsFromArrangedObjectIndexes:(NSArray *) sources toIndexes:(NSArray *)destinations +-(void)moveObjectsInArrangedObjectsFromIndexes:(NSIndexSet*)indexSet + toIndex:(unsigned int)insertIndex { - [super moveObjectsFromArrangedObjectIndexes:sources toIndexes:destinations]; + [super moveObjectsInArrangedObjectsFromIndexes:indexSet toIndex:insertIndex]; - NSUInteger firstIndex = (NSUInteger)-1; - NSUInteger i = 0; + NSUInteger lowerIndex = insertIndex; + NSUInteger index = insertIndex; - for (i = 0; i < [sources count]; i++) { - NSUInteger source = [[sources objectAtIndex:i] unsignedIntegerValue]; - NSUInteger dest = [[destinations objectAtIndex:i] unsignedIntegerValue]; - - if (source < firstIndex) - firstIndex = source; - - if (dest < firstIndex) - firstIndex = dest; + while (NSNotFound != lowerIndex) { + lowerIndex = [indexSet indexLessThanIndex:lowerIndex]; + + if (lowerIndex != NSNotFound) + index = lowerIndex; } - [self updateIndexesFromRow:firstIndex]; + [self updateIndexesFromRow:index]; +} + +- (BOOL)tableView:(NSTableView *)aTableView writeRowsWithIndexes:(NSIndexSet *)rowIndexes toPasteboard:(NSPasteboard *)pboard +{ + [super tableView:aTableView writeRowsWithIndexes:rowIndexes toPasteboard:pboard]; + + NSMutableArray *filenames = [NSMutableArray array]; + NSInteger row; + for (row = [rowIndexes firstIndex]; + row <= [rowIndexes lastIndex]; + row = [rowIndexes indexGreaterThanIndex:row]) + { + PlaylistEntry *song = [[self arrangedObjects] objectAtIndex:row]; + [filenames addObject:[[song path] stringByExpandingTildeInPath]]; + } + + [pboard addTypes:[NSArray arrayWithObject:NSFilenamesPboardType] owner:self]; + [pboard setPropertyList:filenames forType:NSFilenamesPboardType]; + + return YES; } - (BOOL)tableView:(NSTableView*)tv @@ -110,14 +127,9 @@ row:(int)row dropOperation:(NSTableViewDropOperation)op { - [super tableView:tv acceptDrop:info row:row dropOperation:op]; - - if ([info draggingSource] == tableView) - { - //DNDArrayController handles moving... - + //Check if DNDArrayController handles it. + if ([super tableView:tv acceptDrop:info row:row dropOperation:op]) return YES; - } if (row < 0) row = 0; diff --git a/Playlist/PlaylistView.m b/Playlist/PlaylistView.m index 1e422b5c8..030067cb8 100644 --- a/Playlist/PlaylistView.m +++ b/Playlist/PlaylistView.m @@ -324,4 +324,12 @@ return [super validateUserInterfaceItem:anItem]; } +- (NSDragOperation)draggingSourceOperationMaskForLocal:(BOOL)isLocal +{ + if (isLocal) + return NSDragOperationNone; + else + return NSDragOperationCopy; +} + @end