@implementation ITPivotWindowEffect
++ (NSString *)effectName
+{
+ return @"Pivot";
+}
+
++ (NSDictionary *)supportedPositions
+{
+ return [NSDictionary dictionaryWithObjectsAndKeys:
+ [NSDictionary dictionaryWithObjectsAndKeys:
+ [NSNumber numberWithBool:YES], @"Left",
+ [NSNumber numberWithBool:NO], @"Center",
+ [NSNumber numberWithBool:YES], @"Right", nil] , @"Top" ,
+ [NSDictionary dictionaryWithObjectsAndKeys:
+ [NSNumber numberWithBool:NO], @"Left",
+ [NSNumber numberWithBool:NO], @"Center",
+ [NSNumber numberWithBool:NO], @"Right", nil] , @"Middle" ,
+ [NSDictionary dictionaryWithObjectsAndKeys:
+ [NSNumber numberWithBool:YES], @"Left",
+ [NSNumber numberWithBool:NO], @"Center",
+ [NSNumber numberWithBool:YES], @"Right", nil] , @"Bottom" , nil];
+}
+
+
++ (unsigned int)listOrder
+{
+ return 500;
+}
+
+
/*************************************************************************/
#pragma mark -
#pragma mark APPEAR METHODS
[self setPivot:315.0];
[_window setAlphaValue:0.0];
}
-
+
[_window orderFront:self];
_effectTimer = [NSTimer scheduledTimerWithTimeInterval:(1.0 / EFFECT_FPS)
target:self
- (void)appearStep
{
float interPivot = 0.0;
- [_window setEffectProgress:([_window effectProgress] + _effectSpeed)];
- [_window setEffectProgress:( ([_window effectProgress] < 1.0) ? [_window effectProgress] : 1.0)];
- interPivot = (( sin(([_window effectProgress] * pi) - (pi / 2)) + 1 ) / 2);
- [self setPivot:((interPivot * 45) + 315)];
+ float progress = ([_window effectProgress] + _effectSpeed);
+
+ progress = ( (progress < 1.0) ? progress : 1.0 );
+
+ [_window setEffectProgress:progress];
+
+ interPivot = (( sin((progress * pi) - (pi / 2)) + 1 ) / 2);
+ [self setPivot:(315 + (interPivot * 45))];
[_window setAlphaValue:interPivot];
-
- if ( [_window effectProgress] >= 1.0 ) {
+
+ if ( progress >= 1.0 ) {
[self appearFinish];
}
}
[_effectTimer invalidate];
_effectTimer = nil;
[self setWindowVisibility:ITWindowVisibleState];
-
+
__idle = YES;
-
+
if ( __shouldReleaseWhenIdle ) {
[self release];
}
- (void)cancelAppear
{
[self setWindowVisibility:ITWindowVanishingState];
-
+
[_effectTimer invalidate];
_effectTimer = nil;
-
+
[self performVanishFromProgress:[_window effectProgress] effectTime:(_effectTime / 3.5)];
}
[self setPivot:0.0];
[_window setAlphaValue:1.0];
}
-
+
[_window orderFront:self];
_effectTimer = [NSTimer scheduledTimerWithTimeInterval:(1.0 / EFFECT_FPS)
target:self
- (void)vanishStep
{
float interPivot = 1.0;
- [_window setEffectProgress:([_window effectProgress] - _effectSpeed)];
- [_window setEffectProgress:( ([_window effectProgress] > 0.0) ? [_window effectProgress] : 0.0)];
+ float progress = ([_window effectProgress] - _effectSpeed);
+
+ progress = ( (progress > 0.0) ? progress : 0.0);
+
+ [_window setEffectProgress:progress];
+
interPivot = (( sin(([_window effectProgress] * pi) - (pi / 2)) + 1 ) / 2);
- [self setPivot:((interPivot * 45) + 315)];
+ [self setPivot:(315 + (interPivot * 45))];
[_window setAlphaValue:interPivot];
-
- if ( [_window effectProgress] <= 0.0 ) {
+
+ if ( progress <= 0.0 ) {
[self vanishFinish];
}
}
[_window setAlphaValue:1.0];
[self setPivot:0.0];
[self setWindowVisibility:ITWindowHiddenState];
-
+
__idle = YES;
-
+
if ( __shouldReleaseWhenIdle ) {
[self release];
}
- (void)cancelVanish
{
[self setWindowVisibility:ITWindowAppearingState];
-
+
[_effectTimer invalidate];
_effectTimer = nil;
-
+
[self performAppearFromProgress:[_window effectProgress] effectTime:(_effectTime / 3.5)];
}
- (void)setPivot:(float)angle
{
- float degAngle = (angle * (pi / 180));
+ int hPos = [_window horizontalPosition];
+ int vPos = [_window verticalPosition];
+ NSRect winFrame = [_window frame];
- CGAffineTransform transform = CGAffineTransformMakeRotation(degAngle);
+ if ( (hPos == ITWindowPositionCenter) || (vPos == ITWindowPositionMiddle) ) {
- // Set pivot rotation point
- transform.tx = -32.0;
- transform.ty = [_window frame].size.height + 32.0;
-
- CGSSetWindowTransform([NSApp contextID],
- (CGSWindowID)[_window windowNumber],
- CGAffineTransformTranslate(transform,
- (([_window frame].origin.x - 32.0) * -1),
- (([[_window screen] frame].size.height - ([_window frame].origin.y) + 32.0) * -1) ));
+ CGAffineTransform transform;
+ NSPoint translation;
+
+ translation.x = -winFrame.origin.x;
+ translation.y = winFrame.origin.y + winFrame.size.height - [[NSScreen mainScreen] frame].size.height;
+
+ transform = CGAffineTransformMakeTranslation( translation.x, translation.y );
+
+ CGSSetWindowTransform([NSApp contextID],
+ (CGSWindowID)[_window windowNumber],
+ transform);
+ } else {
+ float degAngle;
+ CGAffineTransform transform;
+
+ if ( vPos == ITWindowPositionBottom ) {
+ if ( hPos == ITWindowPositionLeft ) {
+ angle = angle;
+ } else if ( hPos == ITWindowPositionRight ) {
+ angle = ( 45 - -(315 - angle) );
+ }
+ } else if ( vPos == ITWindowPositionTop ) {
+ if ( hPos == ITWindowPositionLeft ) {
+ angle = ( 45 - -(315 - angle) );
+ } else if ( hPos == ITWindowPositionRight ) {
+ angle = angle;
+ }
+ }
+
+ degAngle = (angle * (pi / 180));
+ transform = CGAffineTransformMakeRotation(degAngle);
+
+ if ( vPos == ITWindowPositionBottom ) {
+ transform.ty = winFrame.size.height;
+ } else if ( vPos == ITWindowPositionTop ) {
+ transform.ty = 0;
+ }
+
+ if ( hPos == ITWindowPositionLeft ) {
+ transform.tx = 0;
+ } else if ( hPos == ITWindowPositionRight ) {
+ transform.tx = winFrame.size.width;
+ }
+
+ transform = CGAffineTransformTranslate(transform, -winFrame.origin.x - transform.tx, winFrame.origin.y + winFrame.size.height - [[NSScreen mainScreen] frame].size.height - transform.ty);
+ CGSSetWindowTransform([NSApp contextID],
+ (CGSWindowID)[_window windowNumber],
+ transform );
+ }
}