Skip to content

Commit

Permalink
Fixed: collection views cleared their selection whenever the content …
Browse files Browse the repository at this point in the history
…was changed.

This was unlike Cocoa and prevented CPArrayController's selectsInsertedObjects from working.
  • Loading branch information
aljungberg committed Apr 26, 2012
1 parent 44521a3 commit a0c7305
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 11 deletions.
25 changes: 16 additions & 9 deletions AppKit/CPCollectionView.j
Expand Up @@ -242,13 +242,15 @@
Sets the content of the collection view to the content in \c anArray.
This array can be of any type, and each element will be passed to the \c -setRepresentedObject: method.
It's the responsibility of your custom collection view item to interpret the object.
@param anArray the content array
If the new content array is smaller than the previous one, note that [receiver selectionIndexes] may
refer to out of range indices. \c selectionIndexes is not changed as a result of calling the
\c setContent: method.
@param anArray a content array
*/
- (void)setContent:(CPArray)anArray
{
// reset the _selectionIndexes
[self setSelectionIndexes:[CPIndexSet indexSet]];

_content = anArray;

[self reloadContent];
Expand Down Expand Up @@ -284,9 +286,11 @@

if (!_isSelectable)
{
var index = CPNotFound;
var index = CPNotFound,
itemCount = [_items count];

while ((index = [_selectionIndexes indexGreaterThanIndex:index]) != CPNotFound)
// Be wary of invalid selection ranges since setContent: does not clear selection indexes.
while ((index = [_selectionIndexes indexGreaterThanIndex:index]) != CPNotFound && index < itemCount)
[_items[index] setSelected:NO];
}
}
Expand Down Expand Up @@ -345,9 +349,11 @@
if (!_isSelectable || [_selectionIndexes isEqual:anIndexSet])
return;

var index = CPNotFound;
var index = CPNotFound,
itemCount = [_items count];

while ((index = [_selectionIndexes indexGreaterThanIndex:index]) !== CPNotFound)
// Be wary of invalid selection ranges since setContent: does not clear selection indexes.
while ((index = [_selectionIndexes indexGreaterThanIndex:index]) !== CPNotFound && index < itemCount)
[_items[index] setSelected:NO];

_selectionIndexes = anIndexSet;
Expand Down Expand Up @@ -403,7 +409,8 @@
}

index = CPNotFound;
while ((index = [_selectionIndexes indexGreaterThanIndex:index]) != CPNotFound)
// Be wary of invalid selection ranges since setContent: does not clear selection indexes.
while ((index = [_selectionIndexes indexGreaterThanIndex:index]) != CPNotFound && index < count)
[_items[index] setSelected:YES];

[self tile];
Expand Down
20 changes: 18 additions & 2 deletions Tests/AppKit/CPCollectionViewTest.j
Expand Up @@ -70,11 +70,14 @@
[self assert:"selection changed: 1" equals:_globalResults];
_globalResults = nil;

// setting the same content again should still trigger the delegate but with no selection
// setContent: by itself should not affect the selection.
[_collectionView setContent:content1];
[self assert:"selection changed: 0" equals:_globalResults];
[self assert:nil equals:_globalResults];
// Manually clear the selection.
[_collectionView setSelectionIndexes:[CPIndexSet indexSet]];
_globalResults = nil;


// now lets change the contents
[_collectionView setContent:content2];
// we set the selection to 0 again, but on the NEW content
Expand All @@ -94,6 +97,19 @@
[self assert:[CPIndexSet indexSet] equals:[_collectionView selectionIndexes]];
}

- (void)testSetContentAndSelectionIndexes
{
// Changing the content does not automatically clear the selection indexes. The previous
// selection indexes are preserved, even if now invalid or out of range. This is what
// Cocoa does and necessary to prevent a new empty selection from overwriting
// CPArrayController's selectsInsertedObjects selections.

[_collectionView setContent:[1, 2, 3]];
[_collectionView setSelectionIndexes:[CPIndexSet indexSetWithIndex:1]];
[_collectionView setContent:[3, 1, 2]];
[self assert:[CPIndexSet indexSetWithIndex:1] equals:[_collectionView selectionIndexes]];
}

@end

@implementation _CPCollectionViewWithHooks : CPCollectionView
Expand Down

0 comments on commit a0c7305

Please sign in to comment.