cog/ThirdParty/GCWindowMenu/GCOneShotEffectTimer.m

105 lines
2.6 KiB
Objective-C

///**********************************************************************************************************************************
/// GCOneShotEffectTimer.m
/// GCDrawKit
///
/// Created by graham on 24/04/2007.
/// Released under the Creative Commons license 2007 Apptree.net.
///
///
/// This work is licensed under the Creative Commons Attribution-ShareAlike 2.5 License.
/// To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/2.5/ or send a letter to
/// Creative Commons, 543 Howard Street, 5th Floor, San Francisco, California, 94105, USA.
///
///**********************************************************************************************************************************
#import "GCOneShotEffectTimer.h"
#import "Logging.h"
@interface GCOneShotEffectTimer (Private)
- (id) initWithTimeInterval:(NSTimeInterval) t forDelegate:(id) del;
- (void) setDelegate:(id) del;
- (id) delegate;
- (void) osfx_callback:(NSTimer*) timer;
@end
@implementation GCOneShotEffectTimer
+ (id) oneShotWithTime:(NSTimeInterval) t forDelegate:(id) del
{
GCOneShotEffectTimer* ft = [[GCOneShotEffectTimer alloc] initWithTimeInterval:t forDelegate:del];
// unlike the usual case, this is returned retained (by self, effectively). The one-shot releases
// itself when it's complete
return ft;
}
- (id) initWithTimeInterval:(NSTimeInterval) t forDelegate:(id) del
{
if ((self = [super init]))
{
[self setDelegate:del];
_total = t;
_timer = [NSTimer scheduledTimerWithTimeInterval:1/60.0f target:self selector:@selector(osfx_callback:) userInfo:nil repeats:YES];
_start = [NSDate timeIntervalSinceReferenceDate];
}
return self;
}
- (void) dealloc
{
[_timer invalidate];
}
- (void) setDelegate:(id) del
{
// delegate is retained and released when one-shot completes. This allows some effects to work even
// though the original delegate might be released by the caller.
_delegate = del;
}
- (id) delegate
{
return _delegate;
}
- (void) osfx_callback:(NSTimer*) timer
{
NSTimeInterval elapsed = [NSDate timeIntervalSinceReferenceDate] - _start;
float val = elapsed / _total;
//DLog(@"t = %f", val );
if ( elapsed > _total )
{
[timer invalidate];
_timer = nil;
if ( _delegate && [_delegate respondsToSelector:@selector(oneShotComplete)])
[_delegate oneShotComplete];
}
else
{
if ( _delegate && [_delegate respondsToSelector:@selector(oneShotHasReached:)])
[_delegate oneShotHasReached:val];
if ( _delegate && [_delegate respondsToSelector:@selector(oneShotHasReachedInverse:)])
[_delegate oneShotHasReachedInverse:1.0 - val];
}
}
@end