From 2b287a85e5d2ab0e74ff3b52bb8c906f7e377925 Mon Sep 17 00:00:00 2001 From: Alexander Ljungberg Date: Sat, 13 Feb 2010 21:19:43 -0300 Subject: [PATCH] CPArrayController now pushes new selections to the bound model for selectionIndexes. Using this, support for selectsInsertedObjects was added. This commit also fixes a performance problem where calling setSelectionIndexes with a selection equal to the one already active caused a selection update. --- AppKit/CPArrayController.j | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/AppKit/CPArrayController.j b/AppKit/CPArrayController.j index f0eb896b3..ed13c1e73 100644 --- a/AppKit/CPArrayController.j +++ b/AppKit/CPArrayController.j @@ -266,7 +266,7 @@ - (BOOL)setSelectionIndexes:(CPIndexSet)indexes { - if ([_selectionIndexes isEqual:indexes]) + if ([_selectionIndexes isEqualToIndexSet:indexes]) return NO; if(![indexes count] && _avoidsEmptySelection && [[self arrangedObjects] count]) @@ -282,6 +282,10 @@ [self _selectionDidChange]; [self didChangeValueForKey:@"selectionIndexes"]; + // Push back the new selection to the model for selectionIndexes if we have one. + // There won't be an infinite loop because of the equality check above. + [[CPKeyValueBinding getBinding:@"selectionIndexes" forObject:self] reverseSetValueFor:@"selectionIndexes"]; + return YES; } @@ -356,9 +360,16 @@ { var pos = [_arrangedObjects insertObject:object inArraySortedByDescriptors:_sortDescriptors]; - [self willChangeValueForKey:@"selectionIndexes"]; - [_selectionIndexes shiftIndexesStartingAtIndex:pos by:1]; - [self didChangeValueForKey:@"selectionIndexes"]; + if (_selectsInsertedObjects) + { + [self setSelectionIndex:pos]; + } + else + { + [self willChangeValueForKey:@"selectionIndexes"]; + [_selectionIndexes shiftIndexesStartingAtIndex:pos by:1]; + [self didChangeValueForKey:@"selectionIndexes"]; + } } else [self rearrangeObjects];