Fixed: if CPArrayController setPreserveSelection was off and a selected item disappeared, an invalid selection state could occur. The error was caused by a slightly overeager early-out optimisation in __setSelectionIndexes.

This commit is contained in:
Alexander Ljungberg committed 2010-09-04 22:12:08 -04:00
1 parent c489909542
commit e704d42adb
2 files changed
+22 -3

No files matched your search

+3 -3
View File
@@ -363,9 +363,6 @@
if (!indexes)
indexes = [CPIndexSet indexSet];
if ([_selectionIndexes isEqualToIndexSet:indexes])
return NO;
if (![indexes count])
{
if(_avoidsEmptySelection && [[self arrangedObjects] count])
@@ -381,6 +378,9 @@
indexes = [CPIndexSet indexSetWithIndex:objectsCount-1];
}
if ([_selectionIndexes isEqualToIndexSet:indexes])
return NO;
_selectionIndexes = [indexes copy];
// Push back the new selection to the model for selectionIndexes if we have one.
+19
View File
@@ -113,6 +113,25 @@
[self assert:[CPIndexSet indexSet] equals:[arrayController selectionIndexes] message:@"no objects left, selection should disappear"];
}
- (void)testSelectionWhenObjectsDisappear
{
// If the selected object disappeares during a rearrange, the selection
// should update appropriately, even if preserve selection is off.
var arrayController = [self arrayController];
[arrayController setPreservesSelection:NO];
// Use a copy to make sure our original remains pristine.
[arrayController setSelectionIndexes:[CPIndexSet indexSetWithIndexesInRange:CPMakeRange(0, 3)]];
var newContent = [[self contentArray] copy];
[newContent removeObjectAtIndex:2];
[arrayController setContent:newContent];
[self assert:[CPIndexSet indexSetWithIndexesInRange:CPMakeRange(0, 2)] equals:[arrayController selectionIndexes]
message:@"last object cannot be selected"];
}
- (void)testContentBinding
{
[[self arrayController] bind:@"contentArray" toObject:self withKeyPath:@"contentArray" options:0];