diff --git a/AppKit/CPSegmentedControl.j b/AppKit/CPSegmentedControl.j index 9d58af0d3..99bafdfce 100644 --- a/AppKit/CPSegmentedControl.j +++ b/AppKit/CPSegmentedControl.j @@ -199,7 +199,20 @@ CPSegmentSwitchTrackingMomentary = 2; - (void)setSelectedSegment:(unsigned)aSegment { // setSelected:forSegment throws the exception for us (if necessary) - [self setSelected:YES forSegment:aSegment]; + if (_selectedSegment == aSegment) + return; + + if (aSegment == -1) + { + var count = [self segmentCount]; + + while (count--) + [self setSelected:NO forSegment:count]; + + _selectedSegment = -1; + } + else + [self setSelected:YES forSegment:aSegment]; } /*! diff --git a/Tests/AppKit/CPSegmentedControlTest.j b/Tests/AppKit/CPSegmentedControlTest.j index 0f41cf599..f56c7f0a5 100644 --- a/Tests/AppKit/CPSegmentedControlTest.j +++ b/Tests/AppKit/CPSegmentedControlTest.j @@ -61,5 +61,36 @@ [self assert:[_segmentedControl selectedSegment] equals:-1]; } +- (void)testDeselectAll +{ + [_segmentedControl setTrackingMode:CPSegmentSwitchTrackingSelectAny]; + [_segmentedControl setSegmentCount:2]; + [_segmentedControl setSelected:YES forSegment:0]; + [_segmentedControl setSelected:YES forSegment:1]; + [self assert:[_segmentedControl selectedSegment] equals:1]; + + [self assertNoThrow:function() + { + [_segmentedControl setSelectedSegment:-1]; + }]; + + [self assert:[_segmentedControl selectedSegment] equals:-1]; + [self assertFalse:[_segmentedControl isSelectedForSegment:0]]; + [self assertFalse:[_segmentedControl isSelectedForSegment:1]]; +} + +- (void)testSetSelectedSegmentDoesNotDeselect +{ + [_segmentedControl setTrackingMode:CPSegmentSwitchTrackingSelectAny]; + [_segmentedControl setSelected:YES forSegment:0]; + [_segmentedControl setSelected:YES forSegment:1]; + [self assert:[_segmentedControl selectedSegment] equals:1]; + + [_segmentedControl setSelectedSegment:1]; + + [self assertTrue:[_segmentedControl isSelectedForSegment:0]]; + [self assertTrue:[_segmentedControl isSelectedForSegment:1]]; +} + @end