Files
cappuccino/AppKit/CoreAnimation/_CPObjectAnimator.j
T
cacaodev c75f1685c5 _CPObjectAnimator & CPViewAnimator
Make subclassing easier.
For a specific animator, can choose the implementation to invoke by
subclassing - (id) forwardingTargetForSelector:

The pattern for the animator class, if no -(id)animator is implemented,
is now <TargetClass>Animator by default and it searches for a
<TargetSuperClass>Animator if necessary.

NEW: Added support for CPAnimationTriggerOrderIn|Out animated key.
2015-03-31 00:33:28 +02:00

94 lines
2.1 KiB
Plaintext

@import <Foundation/CPProxy.j>
@import "CAAnimation.j"
@class CPAnimationContext
var _supportsCSSAnimations = null;
@protocol CPAnimatablePropertyContainer <CPObject>
+ (id)defaultAnimationForKey:(CPString)key;
- (id)animationForKey:(CPString)key;
- (id)animator;
- (CPDictionary)animations;
- (void)setAnimations:(CPDictionary)animations;
@end
@implementation _CPObjectAnimator : CPProxy
{
id <CPAnimatablePropertyContainer> _target;
}
+ (BOOL)supportsCSSAnimations
{
if (_supportsCSSAnimations === null)
_supportsCSSAnimations = CPBrowserCSSProperty("animation");
return _supportsCSSAnimations;
}
- (id)initWithTarget:(id)aTarget
{
_target = aTarget;
return self;
}
- (id)animator
{
return self;
}
- (BOOL)isEqual:(id)anObject
{
return [_target isEqual:anObject];
}
- (id)forwardingTargetForSelector:(SEL)aSelector
{
return _target;
}
- (CPMethodSignature)methodSignatureForSelector:(SEL)aSelector
{
return [_target methodSignatureForSelector:aSelector];
}
- (void)forwardInvocation:(CPInvocation)anInvocation
{
var target = [self forwardingTargetForSelector:[anInvocation selector]];
[anInvocation invokeWithTarget:target];
return;
}
- (void)doesNotRecognizeSelector:(SEL)aSelector
{
[CPException raise:CPInvalidArgumentException reason:@"Animator does not recognize selector " + CPStringFromSelector(aSelector)];
}
- (CPString)description
{
return [CPString stringWithFormat:@"%@ Animator Proxy for %@", [self class], _target];
}
- (void)setValue:(id)aTargetValue forKey:(id)aKeyPath
{
var animation = [_target animationForKey:aKeyPath],
context = [CPAnimationContext currentContext];
if (!animation || ![animation isKindOfClass:[CAAnimation class]] || (![context duration] && ![animation duration]) || ![_CPObjectAnimator supportsCSSAnimations])
[_target setValue:aTargetValue forKey:aKeyPath];
else
{
[context _enqueueActionForObject:_target keyPath:aKeyPath targetValue:aTargetValue completionHandler:function()
{
[_target setValue:aTargetValue forKey:aKeyPath];
}];
}
}
@end