CPTextField and CPTrackingArea: optimization and cursor management.

This commit is contained in:
Didier Korthoudt
2016-05-18 11:09:06 +02:00
parent c8ce2343d7
commit aebd28dbef
+35 -28
View File
@@ -410,6 +410,8 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder");
[self setThemeState:CPThemeStateEditable];
else
[self unsetThemeState:CPThemeStateEditable];
[self updateTrackingAreas];
}
/*!
@@ -431,6 +433,8 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder");
// We only allow first responder status if the field is enabled.
if (!shouldBeEnabled && [[self window] firstResponder] === self)
[[self window] makeFirstResponder:nil];
[self updateTrackingAreas];
}
/*!
@@ -440,6 +444,8 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder");
- (void)setSelectable:(BOOL)aFlag
{
_isSelectable = aFlag;
[self updateTrackingAreas];
}
/*!
@@ -997,14 +1003,11 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder");
[self textDidChange:[CPNotification notificationWithName:CPControlTextDidChangeNotification object:self userInfo:nil]];
}
- (void)mouseMoved:(CPEvent)anEvent
{
[super mouseMoved:anEvent];
[self _updateCursorForEvent:anEvent];
}
- (void)mouseDown:(CPEvent)anEvent
{
if (![self isEnabled])
return [[self nextResponder] mouseDown:anEvent];
// Don't track! (ever?)
if ([self isEditable] && [self isEnabled])
{
@@ -1259,27 +1262,6 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder");
[_delegate controlTextDidEndEditing:note];
}
- (void)_updateCursorForEvent:(CPEvent)anEvent
{
var frame = CGRectMakeCopy([self frame]),
contentInset = [self currentValueForThemeAttribute:@"content-inset"];
frame = [[self superview] convertRectToBase:CGRectInsetByInset(frame, contentInset)];
if ([self isEnabled] && ([self isSelectable] || [self isEditable]) && CGRectContainsPoint(frame, [anEvent locationInWindow]))
{
#if PLATFORM(DOM)
self._DOMElement.style.cursor = "text";
#endif
}
else
{
#if PLATFORM(DOM)
self._DOMElement.style.cursor = "default";
#endif
}
}
/*!
Returns the string in the text field.
*/
@@ -2200,4 +2182,29 @@ var CPTextFieldIsEditableKey = "CPTextFieldIsEditableKey",
[_source setObjectValue:aValue];
}
@end
@end
@implementation CPTextField (CPTrackingArea)
- (void)updateTrackingAreas
{
[self removeAllTrackingAreas];
if ([self isEnabled] && (_isEditable || _isSelectable))
{
var myBounds = CGRectMakeCopy([self bounds]),
contentInset = [self currentValueForThemeAttribute:@"content-inset"];
[self addTrackingArea:[[CPTrackingArea alloc] initWithRect:CGRectInsetByInset(myBounds, contentInset)
options:CPTrackingMouseEnteredAndExited | CPTrackingCursorUpdate | CPTrackingActiveInKeyWindow
owner:self
userInfo:nil]];
}
}
- (void)cursorUpdate:(CPEvent)anEvent
{
[[CPCursor IBeamCursor] set];
}
@end