diff --git a/AppKit/CPTextField.j b/AppKit/CPTextField.j index 76d50f339..5e27a56b7 100644 --- a/AppKit/CPTextField.j +++ b/AppKit/CPTextField.j @@ -308,6 +308,11 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder"); if (shouldBeEditable) _isSelectable = YES; + if (_isEditable) + [self setThemeState:CPThemeStateEditable]; + else + [self unsetThemeState:CPThemeStateEditable]; + // We only allow first responder status if the field is editable and enabled. if (!shouldBeEditable && [[self window] firstResponder] === self) [[self window] makeFirstResponder:nil]; diff --git a/AppKit/CPTokenField.j b/AppKit/CPTokenField.j index c223e6c4a..5bc5828f2 100755 --- a/AppKit/CPTokenField.j +++ b/AppKit/CPTokenField.j @@ -570,6 +570,7 @@ var CPScrollDestinationNone = 0, [newToken setTokenField:self]; [newToken setRepresentedObject:tokenObject]; [newToken setStringValue:tokenValue]; + [newToken setEditable:[self isEditable]]; [contentView addSubview:newToken]; } @@ -615,6 +616,13 @@ var CPScrollDestinationNone = 0, } } +- (void)setEditable:(BOOL)shouldBeEditable +{ + [super setEditable:shouldBeEditable]; + + [[self _tokens] makeObjectsPerformSelector:@selector(setEditable:) withObject:shouldBeEditable]; +} + - (void)sendAction:(SEL)anAction to:(id)anObject { _shouldNotifyTarget = NO; @@ -1284,6 +1292,11 @@ var CPScrollDestinationNone = 0, return "tokenfield-token"; } +- (BOOL)acceptsFirstResponder +{ + return NO; +} + - (id)initWithFrame:(CPRect)frame { if (self = [super initWithFrame:frame]) @@ -1319,6 +1332,34 @@ var CPScrollDestinationNone = 0, _representedObject = representedObject; } +- (void)setEditable:(BOOL)shouldBeEditable +{ + [super setEditable:shouldBeEditable]; + [self setNeedsLayout]; +} + +- (BOOL)setThemeState:(CPThemeState)aState +{ + var r = [super setThemeState:aState]; + + // Share hover state with the delete button. + if (r && aState === CPThemeStateHovered) + [_deleteButton setThemeState:aState]; + + return r; +} + +- (BOOL)unsetThemeState:(CPThemeState)aState +{ + var r = [super unsetThemeState:aState]; + + // Share hover state with the delete button. + if (r && aState === CPThemeStateHovered) + [_deleteButton unsetThemeState:aState]; + + return r; +} + - (CGSize)_minimumFrameSize { var size = _CGSizeMakeZero(), @@ -1344,6 +1385,7 @@ var CPScrollDestinationNone = 0, { [_deleteButton setTarget:self]; [_deleteButton setAction:@selector(_delete:)]; + [_deleteButton setEnabled:[self isEditable]]; var frame = [bezelView frame], buttonOffset = [_deleteButton currentValueForThemeAttribute:@"offset"], @@ -1365,7 +1407,8 @@ var CPScrollDestinationNone = 0, - (void)_delete:(id)sender { - [_tokenField _deleteToken:self]; + if ([self isEditable]) + [_tokenField _deleteToken:self]; } @end diff --git a/AppKit/Themes/Aristo/ThemeDescriptors.j b/AppKit/Themes/Aristo/ThemeDescriptors.j index 5c77deb67..4eaa51738 100755 --- a/AppKit/Themes/Aristo/ThemeDescriptors.j +++ b/AppKit/Themes/Aristo/ThemeDescriptors.j @@ -1089,7 +1089,7 @@ var themedButtonValues = nil, [@"text-color", textHighlightedColor, CPThemeStateHighlighted], [@"bezel-inset", CGInsetMakeZero(), CPThemeStateBezeled], - [@"content-inset", CGInsetMake(2.0, 22.0, 2.0, 15.0), CPThemeStateBezeled], + [@"content-inset", CGInsetMake(2.0, 20.0, 2.0, 20.0), CPThemeStateBezeled], // Minimum height == maximum height since tokens are fixed height. [@"min-size", CGSizeMake(0.0, 19.0)], @@ -1112,16 +1112,17 @@ var themedButtonValues = nil, themeValues = [ - [@"bezel-color", bezelColor, CPThemeStateBordered], - [@"bezel-color", bezelHighlightedColor, CPThemeStateBordered | CPThemeStateHighlighted], + [@"bezel-color", bezelColor, CPThemeStateBordered | CPThemeStateHovered], + [@"bezel-color", [bezelColor colorWithAlphaComponent:0], CPThemeStateBordered | CPThemeStateDisabled], + [@"bezel-color", bezelHighlightedColor, CPThemeStateBordered | CPThemeStateHighlighted], [@"min-size", CGSizeMake(8.0, 8.0)], [@"max-size", CGSizeMake(8.0, 8.0)], - [@"bezel-inset", CGInsetMake(0.0, 0.0, 0.0, 0.0), CPThemeStateBordered], - [@"bezel-inset", CGInsetMake(0.0, 0.0, 0.0, 0.0), CPThemeStateBordered | CPThemeStateHighlighted], + [@"bezel-inset", CGInsetMake(0.0, 0.0, 0.0, 0.0), CPThemeStateBordered], + [@"bezel-inset", CGInsetMake(0.0, 0.0, 0.0, 0.0), CPThemeStateBordered | CPThemeStateHighlighted], - [@"offset", CGPointMake(17, 6), CPThemeStateBordered] + [@"offset", CGPointMake(17, 6), CPThemeStateBordered] ]; [self registerThemeValues:themeValues forView:button];