NSWindow (UKFade)
Language: Objective-C, Author: Uli Kusterer
License: MIT/X11
This is a little extension to NSWindow in the form of a category that adds a few methods for fading in/out a window.
NSWindow (UKFade) source preview
// // NSWindow+UKFade.m // TalkingMoose // // Created by Uli Kusterer on 22.06.05. // Copyright 2005 M. Uli Kusterer. All rights reserved. // #import "NSWindow+UKFade.h" static NSMutableDictionary* pendingFades = nil; @implementation NSWindow (UKFade) -(void) fadeInWithDuration: (NSTimeInterval)duration { if( !pendingFades ) pendingFades = [[NSMutableDictionary alloc] init]; NSString* key = [NSString stringWithFormat: @"%lx", self]; NSDictionary* fade = [pendingFades objectForKey: key]; if( fade ) // Currently fading that window? Abort that fade: [[fade objectForKey: @"timer"] invalidate]; // No need to remove from pendingFades, we'll replace it in a moment. [self setAlphaValue: 0]; [self orderFront: nil]; NSTimeInterval interval = duration / 0.1; float stepSize = 1 / interval; NSTimer* timer = [NSTimer scheduledTimerWithTimeInterval: 0.1 // scheduled since we also want "normal" run loop mode. target: self selector: @selector(fadeInOneStep:) userInfo: nil repeats: YES]; [[NSRunLoop currentRunLoop] addTimer: timer forMode: NSModalPanelRunLoopMode]; [[NSRunLoop currentRunLoop] addTimer: timer forMode: NSEventTrackingRunLoopMode]; [pendingFades setObject: [NSMutableDictionary dictionaryWithObjectsAndKeys: timer, @"timer", [NSNumber numberWithFloat: stepSize], @"stepSize", nil] forKey: key]; // Releases of any old fades. } -(void) fadeInOneStep: (NSTimer*)timer { NSString* key = [NSString stringWithFormat: @"%lx", self]; float newAlpha = [self alphaValue] + [[[pendingFades objectForKey: key] objectForKey: @"stepSize"] floatValue]; if( newAlpha >= 1.0 ) { newAlpha = 1; [timer invalidate]; [pendingFades removeObjectForKey: key]; } //NSLog(@"Fading in: %f", newAlpha); // DEBUG ONLY! [self setAlphaValue: newAlpha]; } -(void) fadeOutWithDuration: (NSTimeInterval)duration { if( !pendingFades ) pendingFades = [[NSMutableDictionary alloc] init]; NSString* key = [NSString stringWithFormat: @"%lx", self]; NSDictionary* fade = [pendingFades objectForKey: key]; if( fade ) // Currently fading that window? Abort that fade: [[fade objectForKey: @"timer"] invalidate]; // No need to remove from pendingFades, we'll replace it in a moment. [self setAlphaValue: 1.0]; NSTimeInterval interval = duration / 0.1; float stepSize = 1 / interval; NSTimer* timer = [NSTimer scheduledTimerWithTimeInterval: 0.1 // scheduled since we also want "normal" run loop mode. target: self selector: @selector(fadeOutOneStep:) userInfo: nil repeats: YES]; [pendingFades setObject: [NSMutableDictionary dictionaryWithObjectsAndKeys: timer, @"timer", [NSNumber numberWithFloat: stepSize], @"stepSize", nil] forKey: key]; // Releases of any old fades. [[NSRunLoop currentRunLoop] addTimer: timer forMode: NSModalPanelRunLoopMode]; [[NSRunLoop currentRunLoop] addTimer: timer forMode: NSEventTrackingRunLoopMode]; } -(void) fadeOutOneStep: (NSTimer*)timer { NSString* key = [NSString stringWithFormat: @"%lx", self]; NSMutableDictionary* currFadeDict = [[[pendingFades objectForKey: key] retain] autorelease]; // Make sure it doesn't go away in case we're cross-fading layers. float newAlpha = [self alphaValue] - [[currFadeDict objectForKey: @"stepSize"] floatValue]; if( newAlpha <= 0 ) { [timer invalidate]; [pendingFades removeObjectForKey: key]; NSNumber* newLevel = [currFadeDict objectForKey: @"newLevel"]; if( newLevel ) { NSTimer* timer = [NSTimer scheduledTimerWithTimeInterval: 0.1 // scheduled since we also want "normal" run loop mode. target: self selector: @selector(fadeInOneStep:) userInfo: nil repeats: YES]; [currFadeDict setObject: timer forKey: @"timer"]; [pendingFades setObject: currFadeDict forKey: key]; [[NSRunLoop currentRunLoop] addTimer: timer forMode: NSModalPanelRunLoopMode]; [[NSRunLoop currentRunLoop] addTimer: timer forMode: NSEventTrackingRunLoopMode]; [self setLevel: [newLevel intValue]]; //NSLog(@"Changing level to %u", [newLevel unsignedIntValue]); // DEBUG ONLY! newAlpha = 0; } else { newAlpha = 1; // Make opaque again so non-fading showing of window doesn't look unsuccessful. [self orderOut: nil]; // Hide so setAlphaValue below doesn't cause window to fade out, then pop in again. } } //NSLog(@"Fading out: %f", newAlpha); // DEBUG ONLY! [self setAlphaValue: newAlpha]; } -(void) fadeToLevel: (int)lev withDuration: (NSTimeInterval)duration { if( !pendingFades ) pendingFades = [[NSMutableDictionary alloc] init]; NSString* key = [NSString stringWithFormat: @"%lx", self]; NSDictionary* fade = [pendingFades objectForKey: key]; if( fade ) // Currently fading that window? Abort that fade: [[fade objectForKey: @"timer"] invalidate]; // No need to remove from pendingFades, we'll replace it in a moment. [self setAlphaValue: 1.0]; NSTimeInterval interval = (duration /2) / 0.1; float stepSize = 1 / interval; NSTimer* timer = [NSTimer scheduledTimerWithTimeInterval: 0.1 // scheduled since we also want "normal" run loop mode. target: self selector: @selector(fadeOutOneStep:) userInfo: nil repeats: YES]; [pendingFades setObject: [NSMutableDictionary dictionaryWithObjectsAndKeys: timer, @"timer", [NSNumber numberWithFloat: stepSize], @"stepSize", [NSNumber numberWithInt: lev], @"newLevel", nil] forKey: key]; // Releases of any old fades. [[NSRunLoop currentRunLoop] addTimer: timer forMode: NSModalPanelRunLoopMode]; [[NSRunLoop currentRunLoop] addTimer: timer forMode: NSEventTrackingRunLoopMode]; } @end
NSWindow (UKFade) header preview
// // NSWindow+UKFade.h // TalkingMoose // // Created by Uli Kusterer on 22.06.05. // Copyright 2005 M. Uli Kusterer. All rights reserved. // #import <Cocoa/Cocoa.h> @interface NSWindow (UKFade) -(void) fadeInWithDuration: (NSTimeInterval)duration; -(void) fadeOutWithDuration: (NSTimeInterval)duration; -(void) fadeToLevel: (int)lev withDuration: (NSTimeInterval)duration; // Private: -(void) fadeInOneStep: (NSTimer*)timer; -(void) fadeOutOneStep: (NSTimer*)timer; @endDownload Archive
Compatible with:
- Mac OS X 10.3
- Mac OS X 10.4 PPC
- Mac OS X 10.4 Intel
- Mac OS X 10.5 PPC
- Mac OS X 10.5 Intel
Comments
Comment feed
