From e873f11d0bb398c460817aa1dd4061572f5a1d09 Mon Sep 17 00:00:00 2001 From: Matthew Judy Date: Mon, 14 Apr 2003 12:31:41 +0000 Subject: [PATCH] HUGE ITTSW Checkin. For those only interested in the short version, it is as follows: ITTransientStatusWindow is now feature complete except for positioning. All currently planned effects work, and you can use the Showcase to play with them. - Renamed the visibility state constants, removing the string "StatusWindow" from them, since window visibility is a protocol not limited to ITTSW. - Implemented ITSlideHorizontallyWindowEffect and ITSlideVerticallyWindowEffect. This completes the 1.0 planned suite. - Implemented a heuristic for effects to be able to release themselves when idle, so that an effect can finish a transition smoothly, and release gracefully, instead of crashing. - Made all effects return the window to normal after vanish, so that they don't have to worry about doing so when they appear. Some do anyway. - Implemented timed exit, and the various logic to make the two exit modes work seamlessly. - Modified the Showcase Controller and nib to allow use and testing of all ITTSW's features. Unavailable features are disabled. Removed the switch/case block and used an if/else block instead. Switch/case sucks. Hard. - Decided against a separate cancelVanishEffect. I like our way better, and I think it's a better UE than Apple's, so... fuck Apple. Fuck them in their stupid asses. REMAINING: ---------- - Positioning - MT Status Window Controller. Should be able to complete at least one of those tomorrow. Positioning comes first. --- ITCutWindowEffect.m | 4 +- ITDissolveWindowEffect.m | 28 +++- ITPivotWindowEffect.m | 29 +++- ITSlideHorizontallyWindowEffect.m | 148 ++++++++++++++++- ITSlideVerticallyWindowEffect.m | 150 +++++++++++++++++- ITTransientStatusWindow.h | 2 +- ITTransientStatusWindow.m | 59 +++++-- ITWindowEffect.h | 12 +- ITWindowEffect.m | 17 +- Showcase/Controller.h | 1 + Showcase/Controller.m | 96 +++++++---- .../English.lproj/MainMenu.nib/classes.nib | 1 + .../MainMenu.nib/keyedobjects.nib | Bin 33764 -> 33859 bytes 13 files changed, 467 insertions(+), 80 deletions(-) diff --git a/ITCutWindowEffect.m b/ITCutWindowEffect.m index a42fcc8..79381cb 100755 --- a/ITCutWindowEffect.m +++ b/ITCutWindowEffect.m @@ -13,7 +13,7 @@ - (void)performAppear { [_window orderFront:self]; - [self setWindowVisibility:ITTransientStatusWindowVisibleState]; + [self setWindowVisibility:ITWindowVisibleState]; } - (void)cancelAppear @@ -30,7 +30,7 @@ - (void)performVanish { [_window orderOut:self]; - [self setWindowVisibility:ITTransientStatusWindowHiddenState]; + [self setWindowVisibility:ITWindowHiddenState]; } - (void)cancelVanish diff --git a/ITDissolveWindowEffect.m b/ITDissolveWindowEffect.m index fc2bd38..147840d 100755 --- a/ITDissolveWindowEffect.m +++ b/ITDissolveWindowEffect.m @@ -22,7 +22,9 @@ - (void)performAppear { - [self setWindowVisibility:ITTransientStatusWindowAppearingState]; + __idle = NO; + + [self setWindowVisibility:ITWindowAppearingState]; [self performAppearFromProgress:0.0 effectTime:_effectTime]; } @@ -60,12 +62,18 @@ { [_effectTimer invalidate]; _effectTimer = nil; - [self setWindowVisibility:ITTransientStatusWindowVisibleState]; + [self setWindowVisibility:ITWindowVisibleState]; + + __idle = YES; + + if ( __shouldReleaseWhenIdle ) { + [self release]; + } } - (void)cancelAppear { - [self setWindowVisibility:ITTransientStatusWindowVanishingState]; + [self setWindowVisibility:ITWindowVanishingState]; [_effectTimer invalidate]; _effectTimer = nil; @@ -81,7 +89,9 @@ - (void)performVanish { - [self setWindowVisibility:ITTransientStatusWindowVanishingState]; + __idle = NO; + + [self setWindowVisibility:ITWindowVanishingState]; [self performVanishFromProgress:1.0 effectTime:_effectTime]; } @@ -120,12 +130,18 @@ _effectTimer = nil; [_window orderOut:self]; [_window setAlphaValue:1.0]; - [self setWindowVisibility:ITTransientStatusWindowHiddenState]; + [self setWindowVisibility:ITWindowHiddenState]; + + __idle = YES; + + if ( __shouldReleaseWhenIdle ) { + [self release]; + } } - (void)cancelVanish { - [self setWindowVisibility:ITTransientStatusWindowVanishingState]; + [self setWindowVisibility:ITWindowVanishingState]; [_effectTimer invalidate]; _effectTimer = nil; diff --git a/ITPivotWindowEffect.m b/ITPivotWindowEffect.m index 95c1040..25e21d4 100755 --- a/ITPivotWindowEffect.m +++ b/ITPivotWindowEffect.m @@ -24,7 +24,9 @@ - (void)performAppear { - [self setWindowVisibility:ITTransientStatusWindowAppearingState]; + __idle = NO; + + [self setWindowVisibility:ITWindowAppearingState]; [self performAppearFromProgress:0.0 effectTime:_effectTime]; } @@ -64,12 +66,18 @@ { [_effectTimer invalidate]; _effectTimer = nil; - [self setWindowVisibility:ITTransientStatusWindowVisibleState]; + [self setWindowVisibility:ITWindowVisibleState]; + + __idle = YES; + + if ( __shouldReleaseWhenIdle ) { + [self release]; + } } - (void)cancelAppear { - [self setWindowVisibility:ITTransientStatusWindowVanishingState]; + [self setWindowVisibility:ITWindowVanishingState]; [_effectTimer invalidate]; _effectTimer = nil; @@ -85,7 +93,9 @@ - (void)performVanish { - [self setWindowVisibility:ITTransientStatusWindowVanishingState]; + __idle = NO; + + [self setWindowVisibility:ITWindowVanishingState]; [self performVanishFromProgress:1.0 effectTime:_effectTime]; } @@ -126,12 +136,19 @@ _effectTimer = nil; [_window orderOut:self]; [_window setAlphaValue:1.0]; - [self setWindowVisibility:ITTransientStatusWindowHiddenState]; + [self setPivot:0.0]; + [self setWindowVisibility:ITWindowHiddenState]; + + __idle = YES; + + if ( __shouldReleaseWhenIdle ) { + [self release]; + } } - (void)cancelVanish { - [self setWindowVisibility:ITTransientStatusWindowAppearingState]; + [self setWindowVisibility:ITWindowAppearingState]; [_effectTimer invalidate]; _effectTimer = nil; diff --git a/ITSlideHorizontallyWindowEffect.m b/ITSlideHorizontallyWindowEffect.m index c5f3fba..ac302ff 100755 --- a/ITSlideHorizontallyWindowEffect.m +++ b/ITSlideHorizontallyWindowEffect.m @@ -1,28 +1,166 @@ #import "ITSlideHorizontallyWindowEffect.h" +#import "ITCoreGraphicsHacks.h" +#import "ITTransientStatusWindow.h" + + +@interface ITSlideHorizontallyWindowEffect (Private) +- (void)performAppearFromProgress:(float)progress effectTime:(float)time; +- (void)appearStep; +- (void)appearFinish; +- (void)performVanishFromProgress:(float)progress effectTime:(float)time; +- (void)vanishStep; +- (void)vanishFinish; +- (void)setSlide:(float)distance; +@end @implementation ITSlideHorizontallyWindowEffect +/*************************************************************************/ +#pragma mark - +#pragma mark APPEAR METHODS +/*************************************************************************/ + - (void)performAppear { - NSLog(@"ITSlideHorizontallyWindowEffect does not implement performAppear."); + __idle = NO; + + [self setWindowVisibility:ITWindowAppearingState]; + [self performAppearFromProgress:0.0 effectTime:_effectTime]; } -- (void)performVanish +- (void)performAppearFromProgress:(float)progress effectTime:(float)time { - NSLog(@"ITSlideHorizontallyWindowEffect does not implement performVanish."); + [_window setEffectProgress:progress]; + _effectSpeed = (1.0 / (EFFECT_FPS * time)); + + if ( progress == 0.0 ) { + [_window setAlphaValue:0.0]; + } + + [_window orderFront:self]; + _effectTimer = [NSTimer scheduledTimerWithTimeInterval:(1.0 / EFFECT_FPS) + target:self + selector:@selector(appearStep) + userInfo:nil + repeats:YES]; +} + +- (void)appearStep +{ + float interSlide = 0.0; + [_window setEffectProgress:([_window effectProgress] + _effectSpeed)]; + [_window setEffectProgress:( ([_window effectProgress] < 1.0) ? [_window effectProgress] : 1.0)]; + interSlide = (( sin(([_window effectProgress] * pi) - (pi / 2)) + 1 ) / 2); + [self setSlide:( [_window frame].size.width - (interSlide * [_window frame].size.width) )]; + [_window setAlphaValue:interSlide]; + + if ( [_window effectProgress] >= 1.0 ) { + [self appearFinish]; + } +} + +- (void)appearFinish +{ + [_effectTimer invalidate]; + _effectTimer = nil; + [self setWindowVisibility:ITWindowVisibleState]; + + __idle = YES; + + if ( __shouldReleaseWhenIdle ) { + [self release]; + } } - (void)cancelAppear { - NSLog(@"ITSlideHorizontallyWindowEffect does not implement cancelAppear."); + [self setWindowVisibility:ITWindowVanishingState]; + + [_effectTimer invalidate]; + _effectTimer = nil; + + [self performVanishFromProgress:[_window effectProgress] effectTime:(_effectTime / 4.0)]; +} + + +/*************************************************************************/ +#pragma mark - +#pragma mark VANISH METHODS +/*************************************************************************/ + +- (void)performVanish +{ + __idle = NO; + + [self setWindowVisibility:ITWindowVanishingState]; + [self performVanishFromProgress:1.0 effectTime:_effectTime]; +} + +- (void)performVanishFromProgress:(float)progress effectTime:(float)time +{ + [_window setEffectProgress:progress]; + _effectSpeed = (1.0 / (EFFECT_FPS * time)); + if ( progress == 1.0 ) { + [_window setAlphaValue:1.0]; + } + + [_window orderFront:self]; + _effectTimer = [NSTimer scheduledTimerWithTimeInterval:(1.0 / EFFECT_FPS) + target:self + selector:@selector(vanishStep) + userInfo:nil + repeats:YES]; +} + +- (void)vanishStep +{ + float interSlide = 1.0; + [_window setEffectProgress:([_window effectProgress] - _effectSpeed)]; + [_window setEffectProgress:( ([_window effectProgress] > 0.0) ? [_window effectProgress] : 0.0)]; + interSlide = (( sin(([_window effectProgress] * pi) - (pi / 2)) + 1 ) / 2); + [self setSlide:( [_window frame].size.width - (interSlide * [_window frame].size.width) )]; + [_window setAlphaValue:interSlide]; + + if ( [_window effectProgress] <= 0.0 ) { + [self vanishFinish]; + } +} + +- (void)vanishFinish +{ + [_effectTimer invalidate]; + _effectTimer = nil; + [_window orderOut:self]; + [_window setAlphaValue:1.0]; + [self setSlide:0.0]; + [self setWindowVisibility:ITWindowHiddenState]; + + __idle =YES; + + if ( __shouldReleaseWhenIdle ) { + [self release]; + } } - (void)cancelVanish { - NSLog(@"ITSlideHorizontallyWindowEffect does not implement cancelVanish."); + [self setWindowVisibility:ITWindowAppearingState]; + + [_effectTimer invalidate]; + _effectTimer = nil; + + [self performAppearFromProgress:[_window effectProgress] effectTime:(_effectTime / 4.0)]; } +- (void)setSlide:(float)distance +{ + CGAffineTransform transform = CGAffineTransformMakeTranslation((distance - 32.0), + -( [[_window screen] frame].size.height - ( [_window frame].size.height + 32.0) ) ); + CGSSetWindowTransform([NSApp contextID], + (CGSWindowID)[_window windowNumber], + transform); +} @end diff --git a/ITSlideVerticallyWindowEffect.m b/ITSlideVerticallyWindowEffect.m index 143e079..d5b1b6f 100755 --- a/ITSlideVerticallyWindowEffect.m +++ b/ITSlideVerticallyWindowEffect.m @@ -1,28 +1,166 @@ #import "ITSlideVerticallyWindowEffect.h" +#import "ITCoreGraphicsHacks.h" +#import "ITTransientStatusWindow.h" + + +@interface ITSlideVerticallyWindowEffect (Private) +- (void)performAppearFromProgress:(float)progress effectTime:(float)time; +- (void)appearStep; +- (void)appearFinish; +- (void)performVanishFromProgress:(float)progress effectTime:(float)time; +- (void)vanishStep; +- (void)vanishFinish; +- (void)setSlide:(float)distance; +@end @implementation ITSlideVerticallyWindowEffect +/*************************************************************************/ +#pragma mark - +#pragma mark APPEAR METHODS +/*************************************************************************/ + - (void)performAppear { - NSLog(@"ITSlideVerticallyWindowEffect does not implement performAppear."); + __idle = NO; + + [self setWindowVisibility:ITWindowAppearingState]; + [self performAppearFromProgress:0.0 effectTime:_effectTime]; } -- (void)performVanish +- (void)performAppearFromProgress:(float)progress effectTime:(float)time +{ + [_window setEffectProgress:progress]; + _effectSpeed = (1.0 / (EFFECT_FPS * time)); + + if ( progress == 0.0 ) { + [_window setAlphaValue:0.0]; + } + + [_window orderFront:self]; + _effectTimer = [NSTimer scheduledTimerWithTimeInterval:(1.0 / EFFECT_FPS) + target:self + selector:@selector(appearStep) + userInfo:nil + repeats:YES]; +} + +- (void)appearStep { - NSLog(@"ITSlideVerticallyWindowEffect does not implement performVanish."); + float interSlide = 0.0; + [_window setEffectProgress:([_window effectProgress] + _effectSpeed)]; + [_window setEffectProgress:( ([_window effectProgress] < 1.0) ? [_window effectProgress] : 1.0)]; + interSlide = (( sin(([_window effectProgress] * pi) - (pi / 2)) + 1 ) / 2); + [self setSlide:(interSlide * [_window frame].size.height)]; + [_window setAlphaValue:interSlide]; + + if ( [_window effectProgress] >= 1.0 ) { + [self appearFinish]; + } +} + +- (void)appearFinish +{ + [_effectTimer invalidate]; + _effectTimer = nil; + [self setWindowVisibility:ITWindowVisibleState]; + + __idle = YES; + + if ( __shouldReleaseWhenIdle ) { + [self release]; + } } - (void)cancelAppear { - NSLog(@"ITSlideVerticallyWindowEffect does not implement cancelAppear."); + [self setWindowVisibility:ITWindowVanishingState]; + + [_effectTimer invalidate]; + _effectTimer = nil; + + [self performVanishFromProgress:[_window effectProgress] effectTime:(_effectTime / 4.0)]; } -- (void)cancelVanish + +/*************************************************************************/ +#pragma mark - +#pragma mark VANISH METHODS +/*************************************************************************/ + +- (void)performVanish +{ + __idle = NO; + + [self setWindowVisibility:ITWindowVanishingState]; + [self performVanishFromProgress:1.0 effectTime:_effectTime]; +} + +- (void)performVanishFromProgress:(float)progress effectTime:(float)time +{ + [_window setEffectProgress:progress]; + _effectSpeed = (1.0 / (EFFECT_FPS * time)); + if ( progress == 1.0 ) { + [_window setAlphaValue:1.0]; + } + + [_window orderFront:self]; + _effectTimer = [NSTimer scheduledTimerWithTimeInterval:(1.0 / EFFECT_FPS) + target:self + selector:@selector(vanishStep) + userInfo:nil + repeats:YES]; +} + +- (void)vanishStep +{ + float interSlide = 1.0; + [_window setEffectProgress:([_window effectProgress] - _effectSpeed)]; + [_window setEffectProgress:( ([_window effectProgress] > 0.0) ? [_window effectProgress] : 0.0)]; + interSlide = (( sin(([_window effectProgress] * pi) - (pi / 2)) + 1 ) / 2); + [self setSlide:(interSlide * [_window frame].size.height)]; + [_window setAlphaValue:interSlide]; + + if ( [_window effectProgress] <= 0.0 ) { + [self vanishFinish]; + } +} + +- (void)vanishFinish { - NSLog(@"ITSlideVerticallyWindowEffect does not implement cancelVanish."); + [_effectTimer invalidate]; + _effectTimer = nil; + [_window orderOut:self]; + [_window setAlphaValue:1.0]; + [self setSlide:[_window frame].size.height]; + [self setWindowVisibility:ITWindowHiddenState]; + + __idle = YES; + + if ( __shouldReleaseWhenIdle ) { + [self release]; + } } +- (void)cancelVanish +{ + [self setWindowVisibility:ITWindowAppearingState]; + + [_effectTimer invalidate]; + _effectTimer = nil; + + [self performAppearFromProgress:[_window effectProgress] effectTime:(_effectTime / 4.0)]; +} +- (void)setSlide:(float)distance +{ + CGAffineTransform transform = CGAffineTransformMakeTranslation( -32.0, + -( [[_window screen] frame].size.height - ( distance + 32.0) ) ); + + CGSSetWindowTransform([NSApp contextID], + (CGSWindowID)[_window windowNumber], + transform); +} @end diff --git a/ITTransientStatusWindow.h b/ITTransientStatusWindow.h index dcbe360..9fbd1fc 100755 --- a/ITTransientStatusWindow.h +++ b/ITTransientStatusWindow.h @@ -59,7 +59,7 @@ typedef enum { BOOL _reallyIgnoresEvents; - NSTimer *_delayTimer; + NSTimer *_exitTimer; // NSView *_contentSubView; } diff --git a/ITTransientStatusWindow.m b/ITTransientStatusWindow.m index 6cb33a3..bae7b53 100755 --- a/ITTransientStatusWindow.m +++ b/ITTransientStatusWindow.m @@ -19,6 +19,7 @@ backgroundType:(ITTransientStatusWindowBackgroundType)backgroundType; - (void)rebuildWindow; - (void)startVanishTimer; +- (void)stopVanishTimer; @end @@ -73,7 +74,7 @@ static ITTransientStatusWindow *staticWindow = nil; backing:NSBackingStoreBuffered defer:NO] ) ) { - _visibilityState = ITTransientStatusWindowHiddenState; + _visibilityState = ITWindowHiddenState; _exitMode = exitMode; _exitDelay = DEFAULT_EXIT_DELAY; _backgroundType = backgroundType; @@ -84,7 +85,7 @@ static ITTransientStatusWindow *staticWindow = nil; _entryEffect = nil; _exitEffect = nil; _reallyIgnoresEvents = YES; - _delayTimer = nil; + _exitTimer = nil; // if ( _backgroundType == ITTransientStatusWindowRounded ) { // _contentSubView = contentView; @@ -154,15 +155,15 @@ static ITTransientStatusWindow *staticWindow = nil; - (IBAction)appear:(id)sender { - if ( _visibilityState == ITTransientStatusWindowHiddenState ) { + if ( _visibilityState == ITWindowHiddenState ) { // Window is hidden. Appear as normal, and start the timer. [_entryEffect performAppear]; - } else if ( _visibilityState == ITTransientStatusWindowVisibleState ) { + } else if ( _visibilityState == ITWindowVisibleState ) { // Window is completely visible. Simply reset the timer. [self startVanishTimer]; - } else if ( _visibilityState == ITTransientStatusWindowAppearingState ) { + } else if ( _visibilityState == ITWindowAppearingState ) { // Window is on its way in. Do nothing. - } else if ( _visibilityState == ITTransientStatusWindowVanishingState ) { + } else if ( _visibilityState == ITWindowVanishingState ) { // Window is on its way out. Cancel the vanish. [_exitEffect cancelVanish]; } @@ -170,15 +171,15 @@ static ITTransientStatusWindow *staticWindow = nil; - (IBAction)vanish:(id)sender { - if ( _visibilityState == ITTransientStatusWindowVisibleState ) { + if ( _visibilityState == ITWindowVisibleState ) { // Window is totally visible. Perform exit effect. [_exitEffect performVanish]; - } else if ( _visibilityState == ITTransientStatusWindowHiddenState ) { + } else if ( _visibilityState == ITWindowHiddenState ) { // Window is hidden. Do nothing. - } else if ( _visibilityState == ITTransientStatusWindowAppearingState ) { + } else if ( _visibilityState == ITWindowAppearingState ) { // Window is on its way in. Cancel appear. [_entryEffect cancelAppear]; - } else if ( _visibilityState == ITTransientStatusWindowVanishingState ) { + } else if ( _visibilityState == ITWindowVanishingState ) { // Window is on its way out. Do nothing. } } @@ -192,7 +193,7 @@ static ITTransientStatusWindow *staticWindow = nil; { _visibilityState = newState; - if ( _visibilityState == ITTransientStatusWindowVisibleState ) { + if ( _visibilityState == ITWindowVisibleState ) { [self startVanishTimer]; } } @@ -205,6 +206,14 @@ static ITTransientStatusWindow *staticWindow = nil; - (void)setExitMode:(ITTransientStatusWindowExitMode)newMode { _exitMode = newMode; + + if ( _visibilityState == ITWindowVisibleState ) { + if ( _exitMode == ITTransientStatusWindowExitOnCommand ) { + [self stopVanishTimer]; + } else if ( _exitMode == ITTransientStatusWindowExitAfterDelay ) { + [self startVanishTimer]; + } + } } - (float)exitDelay @@ -287,7 +296,7 @@ static ITTransientStatusWindow *staticWindow = nil; - (void)setEntryEffect:(ITWindowEffect *)newEffect { - [_entryEffect autorelease]; + [_entryEffect releaseWhenIdle]; _entryEffect = [newEffect retain]; } @@ -298,7 +307,7 @@ static ITTransientStatusWindow *staticWindow = nil; - (void)setExitEffect:(ITWindowEffect *)newEffect { - [_exitEffect autorelease]; + [_exitEffect releaseWhenIdle]; _exitEffect = [newEffect retain]; } @@ -328,8 +337,28 @@ static ITTransientStatusWindow *staticWindow = nil; - (void)startVanishTimer { - // start timer, if appropriate - // if timer already exists, restart it. + if ( _exitMode == ITTransientStatusWindowExitAfterDelay) { + [self stopVanishTimer]; + _exitTimer = [NSTimer scheduledTimerWithTimeInterval:_exitDelay + target:self + selector:@selector(doDelayedExit) + userInfo:nil + repeats:NO]; + } +} + +- (void)doDelayedExit +{ + [self vanish:self]; + _exitTimer = nil; +} + +- (void)stopVanishTimer +{ + if ( _exitTimer ) { + [_exitTimer invalidate]; + _exitTimer = nil; + } } @end diff --git a/ITWindowEffect.h b/ITWindowEffect.h index 71852e2..9ce6fcf 100755 --- a/ITWindowEffect.h +++ b/ITWindowEffect.h @@ -22,10 +22,10 @@ typedef enum { - ITTransientStatusWindowHiddenState, - ITTransientStatusWindowAppearingState, - ITTransientStatusWindowVisibleState, - ITTransientStatusWindowVanishingState + ITWindowHiddenState, + ITWindowAppearingState, + ITWindowVisibleState, + ITWindowVanishingState } ITWindowVisibilityState; @@ -53,6 +53,8 @@ typedef enum { ITVerticalWindowPosition _verticalPosition; ITHorizontalWindowPosition _horizontalPosition; NSTimer *_effectTimer; + BOOL __idle; + BOOL __shouldReleaseWhenIdle; } // Designated initializer @@ -67,4 +69,6 @@ typedef enum { - (float)effectTime; - (void)setEffectTime:(float)newTime; +- (void)releaseWhenIdle; + @end diff --git a/ITWindowEffect.m b/ITWindowEffect.m index 752742b..c1bdf0e 100755 --- a/ITWindowEffect.m +++ b/ITWindowEffect.m @@ -9,9 +9,11 @@ { if ( (self = [super init]) ) { - _window = [window retain]; - _effectTime = DEFAULT_EFFECT_TIME; - _effectTimer = nil; + _window = [window retain]; + _effectTime = DEFAULT_EFFECT_TIME; + _effectTimer = nil; + __shouldReleaseWhenIdle = NO; + __idle = YES; if ( [window conformsToProtocol:@protocol(ITWindowPositioning)] ) { // Casts so the compiler won't gripe @@ -77,6 +79,15 @@ NSLog(@"ITWindowEffect does not implement cancelVanish."); } +- (void)releaseWhenIdle; +{ + if ( __idle ) { + [self release]; + } else { + __shouldReleaseWhenIdle = YES; + } +} + - (void)dealloc { [_window release]; diff --git a/Showcase/Controller.h b/Showcase/Controller.h index 8f96266..f8b3b6d 100755 --- a/Showcase/Controller.h +++ b/Showcase/Controller.h @@ -26,6 +26,7 @@ IBOutlet NSPopUpButton *swBackgroundTypePopup; IBOutlet NSPopUpButton *swDefinedPositionPopup; IBOutlet NSTextField *swVanishDelay; + IBOutlet NSSlider *swSpeedSlider; } // ITStatusItem Support diff --git a/Showcase/Controller.m b/Showcase/Controller.m index f2680bd..80fc5f1 100755 --- a/Showcase/Controller.m +++ b/Showcase/Controller.m @@ -1,9 +1,12 @@ #import "Controller.h" #import "ITTransientStatusWindow.h" #import "ITTextField.h" -#import "ITPivotWindowEffect.h" -#import "ITDissolveWindowEffect.h" #import "ITCutWindowEffect.h" +#import "ITDissolveWindowEffect.h" +#import "ITSlideHorizontallyWindowEffect.h" +#import "ITSlideVerticallyWindowEffect.h" +#import "ITPivotWindowEffect.h" + #define SW_PAD 24.0 #define SW_SPACE 24.0 @@ -11,6 +14,7 @@ #define SW_BORDER 32.0 #define SW_IMAGE @"Library" + @interface Controller (ITStatusItemSupport) - (void)createStatusItem; - (void)removeStatusItem; @@ -25,7 +29,12 @@ [testTextField setCastsShadow:YES]; [tabView setAllowsDragging:YES]; statusWindow = [ITTransientStatusWindow sharedWindow]; + [statusWindow setEntryEffect:[[ITCutWindowEffect alloc] initWithWindow:statusWindow]]; + [statusWindow setExitEffect:[[ITDissolveWindowEffect alloc] initWithWindow:statusWindow]]; + [[statusWindow entryEffect] setEffectTime:[swSpeedSlider floatValue]]; + [[statusWindow exitEffect] setEffectTime:[swSpeedSlider floatValue]]; // [tabView setAllowsDragging:YES]; + } /*************************************************************************/ @@ -201,17 +210,12 @@ [[statusWindow contentView] addSubview:textField]; [[statusWindow contentView] setNeedsDisplay:YES]; - -// [statusWindow setEntryEffect:[[ITPivotWindowEffect alloc] initWithWindow:statusWindow]]; -// [statusWindow setExitEffect:[[ITPivotWindowEffect alloc] initWithWindow:statusWindow]]; - [statusWindow setEntryEffect:[[ITCutWindowEffect alloc] initWithWindow:statusWindow]]; - [statusWindow setExitEffect: [[ITDissolveWindowEffect alloc] initWithWindow:statusWindow]]; } - (IBAction)toggleStatusWindow:(id)sender { - if ( ([statusWindow visibilityState] == ITTransientStatusWindowHiddenState) || - ([statusWindow visibilityState] == ITTransientStatusWindowVanishingState) ) { + if ( ([statusWindow visibilityState] == ITWindowHiddenState) || + ([statusWindow visibilityState] == ITWindowVanishingState) ) { [[statusWindow contentView] setNeedsDisplay:YES]; [statusWindow appear:self]; } else { @@ -221,29 +225,57 @@ - (IBAction)changeWindowSetting:(id)sender { - switch ( [sender tag] ) - { - case 3010: // Not yet supported. - break; - case 3020: // Not yet supported. - break; - case 3030: // Change vanish delay - [statusWindow setExitDelay:[sender floatValue]]; - break; - case 3040: // Change vertical position - [statusWindow setVerticalPosition:[sender indexOfSelectedItem]]; - break; - case 3050: // Change horizontal position - [statusWindow setHorizontalPosition:[sender indexOfSelectedItem]]; - break; - case 3060: // Change effect speed - [[statusWindow entryEffect] setEffectTime:[sender floatValue]]; - [[statusWindow exitEffect] setEffectTime:[sender floatValue]]; - break; - case 3070: // Change entry effect - break; - case 3080: // Change exit effect - break; + if ( [sender tag] == 3010 ) { + + if ( [sender indexOfSelectedItem] == 0) { + [statusWindow setExitMode:ITTransientStatusWindowExitAfterDelay]; + } else if ( [sender indexOfSelectedItem] == 1) { + [statusWindow setExitMode:ITTransientStatusWindowExitOnCommand]; + } + + } else if ( [sender tag] == 3020 ) { + // Not yet supported + } else if ( [sender tag] == 3030 ) { + [statusWindow setExitDelay:[sender floatValue]]; + } else if ( [sender tag] == 3040 ) { + [statusWindow setVerticalPosition:[sender indexOfSelectedItem]]; + } else if ( [sender tag] == 3050 ) { + [statusWindow setHorizontalPosition:[sender indexOfSelectedItem]]; + } else if ( [sender tag] == 3060 ) { + [[statusWindow entryEffect] setEffectTime:[sender floatValue]]; + [[statusWindow exitEffect] setEffectTime:[sender floatValue]]; + } else if ( [sender tag] == 3070 ) { + + if ( [sender indexOfSelectedItem] == 0 ) { + [statusWindow setEntryEffect:[[[ITCutWindowEffect alloc] initWithWindow:statusWindow] autorelease]]; + } else if ( [sender indexOfSelectedItem] == 1 ) { + [statusWindow setEntryEffect:[[[ITDissolveWindowEffect alloc] initWithWindow:statusWindow] autorelease]]; + } else if ( [sender indexOfSelectedItem] == 2 ) { + [statusWindow setEntryEffect:[[[ITSlideVerticallyWindowEffect alloc] initWithWindow:statusWindow] autorelease]]; + } else if ( [sender indexOfSelectedItem] == 3 ) { + [statusWindow setEntryEffect:[[[ITSlideHorizontallyWindowEffect alloc] initWithWindow:statusWindow] autorelease]]; + } else if ( [sender indexOfSelectedItem] == 4 ) { + [statusWindow setEntryEffect:[[[ITPivotWindowEffect alloc] initWithWindow:statusWindow] autorelease]]; + } + + [[statusWindow entryEffect] setEffectTime:[swSpeedSlider floatValue]]; + + } else if ( [sender tag] == 3080 ) { + + if ( [sender indexOfSelectedItem] == 0 ) { + [statusWindow setExitEffect:[[ITCutWindowEffect alloc] initWithWindow:statusWindow]]; + } else if ( [sender indexOfSelectedItem] == 1 ) { + [statusWindow setExitEffect:[[ITDissolveWindowEffect alloc] initWithWindow:statusWindow]]; + } else if ( [sender indexOfSelectedItem] == 2 ) { + [statusWindow setExitEffect:[[ITSlideVerticallyWindowEffect alloc] initWithWindow:statusWindow]]; + } else if ( [sender indexOfSelectedItem] == 3 ) { + [statusWindow setExitEffect:[[ITSlideHorizontallyWindowEffect alloc] initWithWindow:statusWindow]]; + } else if ( [sender indexOfSelectedItem] == 4 ) { + [statusWindow setExitEffect:[[ITPivotWindowEffect alloc] initWithWindow:statusWindow]]; + } + + [[statusWindow exitEffect] setEffectTime:[swSpeedSlider floatValue]]; + } } diff --git a/Showcase/English.lproj/MainMenu.nib/classes.nib b/Showcase/English.lproj/MainMenu.nib/classes.nib index a953fe1..cd76fd0 100755 --- a/Showcase/English.lproj/MainMenu.nib/classes.nib +++ b/Showcase/English.lproj/MainMenu.nib/classes.nib @@ -26,6 +26,7 @@ swBackgroundTypePopup = NSPopUpButton; swDefinedPositionPopup = NSPopUpButton; swSampleTextView = NSTextView; + swSpeedSlider = NSSlider; swVanishDelay = NSTextField; swVanishModePopup = NSPopUpButton; tabView = ITTabView; diff --git a/Showcase/English.lproj/MainMenu.nib/keyedobjects.nib b/Showcase/English.lproj/MainMenu.nib/keyedobjects.nib index 276577dfd19858a3fd1ad514d201a4ff18404edd..dd63502a7765331ebb707caa13ae22d06a58ea6f 100755 GIT binary patch delta 17307 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 N(ZsHA{bwU!{|D)v?OOl< delta 16958 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 MjP3r`e`>z`4`rK`D*ylh -- 2.20.1