Fixed undo/redo handling when the playlist is sorted, including undo/redo interleaved with different sorting orders

This commit is contained in:
Chris Moeller 2013-10-18 01:47:48 -07:00
parent 3b8b948a1e
commit b461e774fd

View file

@ -297,9 +297,62 @@
return undoManager; return undoManager;
} }
- (NSIndexSet *)disarrangeIndexes:(NSIndexSet *)indexes
{
if ([[self arrangedObjects] count] <= [indexes lastIndex])
return indexes;
NSMutableIndexSet *disarrangedIndexes = [[[NSMutableIndexSet alloc] init] autorelease];
NSUInteger index = [indexes firstIndex];
while (index != NSNotFound)
{
[disarrangedIndexes addIndex:[[self content] indexOfObject:[[self arrangedObjects] objectAtIndex:index]]];
index = [indexes indexGreaterThanIndex:index];
}
return disarrangedIndexes;
}
- (NSArray *)disarrangeObjects:(NSArray *)objects
{
NSMutableArray *disarrangedObjects = [[[NSMutableArray alloc] init] autorelease];
for (PlaylistEntry *pe in [self content])
{
if ([objects containsObject:pe])
[disarrangedObjects addObject:pe];
}
return disarrangedObjects;
}
- (NSIndexSet *)rearrangeIndexes:(NSIndexSet *)indexes
{
if ([[self content] count] <= [indexes lastIndex])
return indexes;
NSMutableIndexSet *rearrangedIndexes = [[[NSMutableIndexSet alloc] init] autorelease];
NSUInteger index = [indexes firstIndex];
while (index != NSNotFound)
{
[rearrangedIndexes addIndex:[[self arrangedObjects] indexOfObject:[[self content] objectAtIndex:index]]];
index = [indexes indexGreaterThanIndex:index];
}
return rearrangedIndexes;
}
- (void)insertObjects:(NSArray *)objects atIndexes:(NSIndexSet *)indexes
{
[self insertObjects:objects atArrangedObjectIndexes:indexes];
[self rearrangeObjects];
}
- (void)insertObjects:(NSArray *)objects atArrangedObjectIndexes:(NSIndexSet *)indexes - (void)insertObjects:(NSArray *)objects atArrangedObjectIndexes:(NSIndexSet *)indexes
{ {
[[[self undoManager] prepareWithInvocationTarget:self] removeObjectsAtArrangedObjectIndexes:indexes]; [[[self undoManager] prepareWithInvocationTarget:self] removeObjectsAtIndexes:[self disarrangeIndexes:indexes]];
NSString *actionName = [NSString stringWithFormat:@"Adding %lu entries", (unsigned long)[objects count]]; NSString *actionName = [NSString stringWithFormat:@"Adding %lu entries", (unsigned long)[objects count]];
[[self undoManager] setActionName:actionName]; [[self undoManager] setActionName:actionName];
@ -309,10 +362,15 @@
[self resetShuffleList]; [self resetShuffleList];
} }
- (void)removeObjectsAtIndexes:(NSIndexSet *)indexes
{
[self removeObjectsAtArrangedObjectIndexes:[self rearrangeIndexes:indexes]];
}
- (void)removeObjectsAtArrangedObjectIndexes:(NSIndexSet *)indexes - (void)removeObjectsAtArrangedObjectIndexes:(NSIndexSet *)indexes
{ {
NSArray *objects = [[self arrangedObjects] objectsAtIndexes:indexes]; NSArray *objects = [[self arrangedObjects] objectsAtIndexes:indexes];
[[[self undoManager] prepareWithInvocationTarget:self] insertObjects:objects atArrangedObjectIndexes:indexes]; [[[self undoManager] prepareWithInvocationTarget:self] insertObjects:[self disarrangeObjects:objects] atIndexes:[self disarrangeIndexes:indexes]];
NSString *actionName = [NSString stringWithFormat:@"Removing %lu entries", (unsigned long)[indexes count]]; NSString *actionName = [NSString stringWithFormat:@"Removing %lu entries", (unsigned long)[indexes count]];
[[self undoManager] setActionName:actionName]; [[self undoManager] setActionName:actionName];