This is CounterView.m in view mode; [Download] [Up]
// Written by Don Yacktman Copyright (c) 1994 by Don Yacktman.
// Version 1.0. All rights reserved.
//
// This notice may not be removed from this source code.
//
// This object is included in the MiscKit by permission from the author
// and its use is governed by the MiscKit license, found in the file
// "LICENSE.rtf" in the MiscKit distribution. Please refer to that file
// for a list of all applicable permissions and restrictions.
//
#import "CounterView.h"
@implementation CounterView
- initFrame:(const NXRect *)frm
{
[super initFrame:frm];
running = NO;
[self counter];
[self reset];
return self;
}
- drawSelf:(NXRect *)rects :(int)rectCount
{
NXRect theBorder;
[self getFrame:&theBorder];
theBorder.origin.x = 0.0;
theBorder.origin.y = 0.0;
NXDrawGrayBezel(&theBorder, NULL);
NXInsetRect(&theBorder, 4.0, 4.0);
if (running) NXSetColor(NX_COLORGREEN);
else NXSetColor(NX_COLORRED);
NXRectFill(&theBorder);
return self;
}
- keyDown:(NXEvent *)myevent
{
PSobscurecursor(); // subclasses which override need to do this.
if (myevent->data.key.charSet == NX_ASCIISET &&
(myevent->flags&(NX_CONTROLMASK|NX_ALTERNATEMASK|NX_COMMANDMASK)) == 0)
{
if ((myevent->data.key.charCode) == ' ') { // allow pause
[self tap:nil];
} else if ((myevent->data.key.charCode) == 's') { // allow new game
if (running) [self stop:nil];
else [self start:nil];
} else if ((myevent->data.key.charCode) == 'r') { // allow new game
[self clear:nil];
}
}
return self;
}
- mouseDown:(NXEvent *)event
{
if (!running) {
[self clear:nil];
[self start:nil];
} else [self tap:nil];
return self;
}
- (MiscStopwatch *)counter
{
if (!counter) counter = [[MiscStopwatch alloc] init];
return counter;
}
- reset
{
[beatsPerMeasure setIntValue:4];
[self clear:nil];
return self;
}
- clear:sender
{
beatsCounted = 0;
[self stop:nil];
[beatsPerMinute setIntValue:0];
[measuresPerMinute setIntValue:0];
[secondsElapsed setIntValue:0];
[[self counter] clearTiming:nil];
[beatsPerMinute setBackgroundGray:0.666];
[measuresPerMinute setBackgroundGray:0.666];
[self update];
return self;
}
- start:sender
{
running = YES;
[[self counter] continueTiming:nil];
[beatsPerMinute setBackgroundGray:1.0];
[measuresPerMinute setBackgroundGray:1.0];
[self update];
[self enableButtons:YES :NO :YES :YES];
return self;
}
- stop:sender
{
if (running) [self tap:nil];
running = NO;
[[self counter] pauseTiming:nil];
[beatsPerMinute setBackgroundGray:0.666];
[measuresPerMinute setBackgroundGray:0.666];
[self update];
[self enableButtons:YES :YES :NO :NO];
return self;
}
- tap:sender
{
int bm; id sc = [self counter];
float seconds, bpm, mpm;
if (!running) return [self start:nil];
// get the basic infor we need
beatsCounted++;
[[self counter] calcElapsedTime:nil];
seconds = [sc microsecond] / MISC_TIME_MAX_MICROSECONDS +
[sc second] + 60 * [sc minute];
bm = [beatsPerMeasure intValue];
// avoid divide by zero
if (bm < 1) bm = 1;
if (seconds < 1) seconds = 1;
// do calculations
bpm = floor((beatsCounted * 600) / seconds) / 10;
mpm = floor((bpm * 10) / bm) / 10;
// update the interface
[beatsPerMinute setFloatValue:bpm];
[measuresPerMinute setFloatValue:mpm];
[secondsElapsed setIntValue:seconds];
return self;
}
- enableButtons:(BOOL)cb :(BOOL)sb :(BOOL)sb2 :(BOOL)tb
{
[clearButton setEnabled:cb];
[startButton setEnabled:sb];
[stopButton setEnabled:sb2];
[tapButton setEnabled:tb];
return self;
}
- (BOOL)acceptsFirstMouse { return YES; }
- (BOOL)acceptsFirstResponder { return YES; }
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.