This is MovieView.m in view mode; [Download] [Up]
#import "MovieView.h"
@implementation MovieView
- initWithFrame:(NSRect)r
{
self = [super initWithFrame:r];
if (self == nil)
return nil;
framesPerSecond = 10;
direction = 1;
[self updatePositionControl];
return self;
}
- (void)play:(id)sender
{
[timer invalidate];
[timer autorelease];
timer = [[NSTimer scheduledTimerWithTimeInterval:1.0 / framesPerSecond
target:self
selector:@selector(animate:)
userInfo:nil
repeats:YES] retain];
}
- (void)positionControlChanged:(id)sender
{
currentFrameIndex = [sender floatValue] * [frames count];
[self setNeedsDisplay:YES];
}
- (void)setFrames:(id)obj
{
[frames autorelease];
frames = [obj retain];
}
- (void)speedControlChanged:(id)sender
{
BOOL wasRunning = [timer isValid];
framesPerSecond = [speedControl floatValue];
[self stop:nil];
if (wasRunning)
[self play:nil];
}
- (void)rewind:sender
{
currentFrameIndex -= 5;
[self updatePositionControl];
[self setNeedsDisplay:YES];
}
- (void)fastForward:sender
{
currentFrameIndex += 5;
[self updatePositionControl];
[self setNeedsDisplay:YES];
}
- (void)stepBackward:(id)sender
{
--currentFrameIndex;
[self updatePositionControl];
[self setNeedsDisplay:YES];
}
- (void)stepForward:(id)sender
{
++currentFrameIndex;
[self updatePositionControl];
[self setNeedsDisplay:YES];
}
- (void)stop:(id)sender
{
[timer invalidate];
[self setNeedsDisplay:YES];
}
- (void)drawRect:(NSRect)rect
{
currentFrameIndex = MIN (currentFrameIndex, [frames count] - 1);
currentFrameIndex = MAX (currentFrameIndex, 0);
if ([frames count] > 0)
{
NSImage *image = [frames objectAtIndex:currentFrameIndex];
[image compositeToPoint:NSZeroPoint operation:NSCompositeCopy];
}
}
- (void)animate:(id)userInfo
{
currentFrameIndex += direction;
if (currentFrameIndex < 0)
{
direction = 1;
currentFrameIndex = 1;
}
else if (currentFrameIndex >= [frames count])
{
direction = -1;
currentFrameIndex = [frames count] - 2;
}
[self updatePositionControl];
[self setNeedsDisplay:YES];
}
-(void)updatePositionControl
{
[positionControl setFloatValue:currentFrameIndex / (float)([frames count] - 1.0)];
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.