X-Git-Url: http://git.ithinksw.org/ITKit.git/blobdiff_plain/56515bcf2e6dd44a8fe3767b7f3791cae184d940..2589c16f443dd6fe9df554eb533df464b5bb919b:/ITTransientStatusWindow.m?ds=sidebyside diff --git a/ITTransientStatusWindow.m b/ITTransientStatusWindow.m index 45ad1e3..004396a 100755 --- a/ITTransientStatusWindow.m +++ b/ITTransientStatusWindow.m @@ -4,8 +4,9 @@ #import "ITTextField.h" #import "ITGrayRoundedView.h" -@class ITTextField; -@class ITGrayRoundedView; + +#define EFFECT_FPS 30.0 + /*************************************************************************/ #pragma mark - @@ -28,9 +29,13 @@ backgroundType:(ITTransientStatusWindowBackgroundType)backgroundType; - (void)rebuildWindow; - (void)performEffect; -- (void)dissolveEffect:(BOOL)entering; -- (void)slideVerticalEffect:(BOOL)entering; -- (void)slideHorizontalEffect:(BOOL)entering; +- (void)dissolveEffect; +- (void)slideVerticalEffect; +- (void)slideHorizontalEffect; +- (void)pivotEffect; +- (void)pivotStep; +- (void)pivotFinish; +- (void)setPivot:(float)angle; @end @@ -71,7 +76,7 @@ static ITTransientStatusWindow *staticWindow = nil; { NSRect contentRect; - // If no Content View was provided, use a generic NSView with the app icon. + // If no Content View was provided, use a generic view. if ( ! (contentView) ) { contentView = [[[NSView alloc] initWithFrame: NSMakeRect(100.0, 100.0, 200.0, 200.0)] autorelease]; @@ -91,18 +96,20 @@ static ITTransientStatusWindow *staticWindow = nil; _backgroundType = backgroundType; _verticalPosition = ITTransientStatusWindowPositionBottom; _horizontalPosition = ITTransientStatusWindowPositionLeft; + _screenPadding = 32.0; _entryEffect = ITTransientStatusWindowEffectNone; _exitEffect = ITTransientStatusWindowEffectDissolve; _effectTime = DEFAULT_EFFECT_TIME; + _effectProgress = 0.00; _reallyIgnoresEvents = YES; - _delayTimer = nil; - _fadeTimer = nil; + _delayTimer = nil; + _effectTimer = nil; -// if ( _backgroundType == ITTransientStatusWindowRounded ) { -// _contentSubView = contentView; -// } else { -// [self setContentView:contentView]; -// } +// if ( _backgroundType == ITTransientStatusWindowRounded ) { +// _contentSubView = contentView; +// } else { +// [self setContentView:contentView]; +// } [self setIgnoresMouseEvents:YES]; [self setLevel:NSScreenSaverWindowLevel]; @@ -118,18 +125,6 @@ static ITTransientStatusWindow *staticWindow = nil; #pragma mark INSTANCE METHODS /*************************************************************************/ -- (void)setRotation:(float)angle -{ - CGAffineTransform transform = CGAffineTransformMakeRotation(angle); - transform.tx = -32.0; - transform.ty = [self frame].size.height + 32.0; - CGSSetWindowTransform([NSApp contextID], - (CGSWindowID)[self windowNumber], - CGAffineTransformTranslate(transform, - (([self frame].origin.x - 32.0) * -1), - (([[self screen] frame].size.height - ([self frame].origin.y) + 32.0) * -1) )); -} - - (BOOL)ignoresMouseEvents { return _reallyIgnoresEvents; @@ -151,15 +146,15 @@ static ITTransientStatusWindow *staticWindow = nil; - (void)orderFront:(id)sender { - if ( _exitMode == ITTransientStatusWindowExitAfterDelay ) { - // set the timer, and orderOut: when it lapses. - } - if ( _entryEffect == ITTransientStatusWindowEffectNone ) { [super orderFront:sender]; + _visibilityState = ITTransientStatusWindowVisibleState; } else { [self performEffect]; } + if ( _exitMode == ITTransientStatusWindowExitAfterDelay ) { + // set the timer, and orderOut: when it lapses. + } } - (void)makeKeyAndOrderFront:(id)sender @@ -170,6 +165,7 @@ static ITTransientStatusWindow *staticWindow = nil; if ( _entryEffect == ITTransientStatusWindowEffectNone ) { [super makeKeyAndOrderFront:sender]; + _visibilityState = ITTransientStatusWindowVisibleState; } else { [self performEffect]; [self makeKeyWindow]; @@ -180,6 +176,7 @@ static ITTransientStatusWindow *staticWindow = nil; { if ( _entryEffect == ITTransientStatusWindowEffectNone ) { [super orderOut:sender]; + _visibilityState = ITTransientStatusWindowHiddenState; } else { [self performEffect]; } @@ -274,24 +271,26 @@ static ITTransientStatusWindow *staticWindow = nil; _horizontalPosition = newPosition; } -- (ITTransientStatusWindowEffect)entryEffect +- (ITWindowEffect *)entryEffect { return _entryEffect; } -- (void)setEntryEffect:(ITTransientStatusWindowEffect)newEffect; +- (void)setEntryEffect:(ITWindowEffect *)newEffect { - _entryEffect = newEffect; + [_entryEffect autorelease]; + _entryEffect = [newEffect retain]; } -- (ITTransientStatusWindowEffect)exitEffect; +- (ITWindowEffect *)exitEffect { return _exitEffect; } -- (void)setExitEffect:(ITTransientStatusWindowEffect)newEffect; +- (void)setExitEffect:(ITWindowEffect *)newEffect { - _exitEffect = newEffect; + [_exitEffect autorelease]; + _exitEffect = [newEffect retain]; } @@ -321,50 +320,119 @@ static ITTransientStatusWindow *staticWindow = nil; - (void)performEffect { if ( _visibilityState == ITTransientStatusWindowHiddenState ) { - if ( _entryEffect == ITTransientStatusWindowEffectDissolve ) { - [self dissolveEffect:YES]; - } else if ( _entryEffect == ITTransientStatusWindowEffectSlideVertically ) { - [self slideVerticalEffect:YES]; - } else if ( _entryEffect == ITTransientStatusWindowEffectSlideHorizontally ) { - [self slideHorizontalEffect:YES]; - } + _visibilityState = ITTransientStatusWindowEnteringState; } else if ( _visibilityState == ITTransientStatusWindowVisibleState ) { - if ( _exitEffect == ITTransientStatusWindowEffectDissolve ) { - [self dissolveEffect:NO]; - } else if ( _exitEffect == ITTransientStatusWindowEffectSlideVertically ) { - [self slideVerticalEffect:NO]; - } else if ( _exitEffect == ITTransientStatusWindowEffectSlideHorizontally ) { - [self slideHorizontalEffect:NO]; - } + _visibilityState = ITTransientStatusWindowExitingState; + } else { + return; + } + + if ( _entryEffect == ITTransientStatusWindowEffectDissolve ) { + [self dissolveEffect]; + } else if ( _entryEffect == ITTransientStatusWindowEffectSlideVertically ) { + [self slideVerticalEffect]; + } else if ( _entryEffect == ITTransientStatusWindowEffectSlideHorizontally ) { + [self slideHorizontalEffect]; + } else if ( _entryEffect == ITTransientStatusWindowEffectPivot ) { + [self pivotEffect]; + } +} + +- (void)dissolveEffect +{ + if ( _visibilityState == ITTransientStatusWindowEnteringState ) { + [super orderFront:self]; + _visibilityState = ITTransientStatusWindowVisibleState; + } else { + [super orderOut:self]; + _visibilityState = ITTransientStatusWindowHiddenState; } } -- (void)dissolveEffect:(BOOL)entering +- (void)slideVerticalEffect { - if ( entering ) { + if ( _visibilityState == ITTransientStatusWindowEnteringState ) { [super orderFront:self]; + _visibilityState = ITTransientStatusWindowVisibleState; } else { [super orderOut:self]; + _visibilityState = ITTransientStatusWindowHiddenState; } } -- (void)slideVerticalEffect:(BOOL)entering +- (void)slideHorizontalEffect { - if ( entering ) { + if ( _visibilityState == ITTransientStatusWindowEnteringState ) { [super orderFront:self]; + _visibilityState = ITTransientStatusWindowVisibleState; } else { [super orderOut:self]; + _visibilityState = ITTransientStatusWindowHiddenState; } } -- (void)slideHorizontalEffect:(BOOL)entering +- (void)pivotEffect { - if ( entering ) { + if ( _visibilityState == ITTransientStatusWindowEnteringState ) { + [self setPivot:315.0]; + _effectProgress = 0.0; + [self setAlphaValue:0.0]; [super orderFront:self]; + _effectTimer = [NSTimer scheduledTimerWithTimeInterval:(1.0 / EFFECT_FPS) + target:self + selector:@selector(pivotStep) + userInfo:nil + repeats:YES]; } else { [super orderOut:self]; + _visibilityState = ITTransientStatusWindowHiddenState; + } +} + +- (void)pivotStep +{ + if ( _visibilityState == ITTransientStatusWindowEnteringState ) { + float interPivot = 0.0; + _effectProgress += (1.0 / (EFFECT_FPS * _effectTime)); + _effectProgress = (_effectProgress < 1.0 ? _effectProgress : 1.0); + interPivot = (( sin((_effectProgress * pi) - (pi / 2)) + 1 ) / 2); + [self setPivot:((interPivot * 45) + 315)]; + [self setAlphaValue:interPivot]; + if ( _effectProgress >= 1.0 ) { + [self pivotFinish]; + } + } else { + //backwards } } +- (void)pivotFinish +{ + if ( _visibilityState == ITTransientStatusWindowEnteringState ) { + [_effectTimer invalidate]; + _effectTimer = nil; + _effectProgress = 0.0; + _visibilityState = ITTransientStatusWindowVisibleState; + } else { + //backwards + } +} + + +- (void)setPivot:(float)angle +{ + float degAngle = (angle * (pi / 180)); + CGAffineTransform transform = CGAffineTransformMakeRotation(degAngle); + + // Set pivot point + transform.tx = -32.0; + transform.ty = [self frame].size.height + 32.0; + + CGSSetWindowTransform([NSApp contextID], + (CGSWindowID)[self windowNumber], + CGAffineTransformTranslate(transform, + (([self frame].origin.x - 32.0) * -1), + (([[self screen] frame].size.height - ([self frame].origin.y) + 32.0) * -1) )); +} @end