ftp.nice.ch/pub/next/graphics/movie/Morph2a.s.tar.gz#/Morph2/MovieView.m

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.