Timr/Timer.m
2011-09-08 12:58:19 +02:00

230 lines
5.3 KiB
Objective-C

//
// Timer.m
//
// Created by Jeena on 15.12.09.
// Copyright 2009 Jeena Paradies. All rights reserved.
// sound from http://www.flashkit.com/soundfx/Electronic/Alarms/Alarm_cl-Liquid-8852/index.php
// click sound from http://free-loops.com/download-free-loop-7744.html
//
#import "Timer.h"
@implementation Timer
@synthesize repeatingTimer;
- (id)init {
if (self = [super init]) {
digits = [[NSMutableArray alloc] init];
for(int i = 0; i <= 9; i++) {
[digits addObject:[NSImage imageNamed:[NSString stringWithFormat:@"digit-%i.png", i]]];
}
colon = [[NSImage imageNamed:@"colon.png"] retain];
no_colon = [[NSImage imageNamed:@"no_colon.png"] retain];
alarmSound = [NSSound soundNamed:@"alarm.wav"];
[alarmSound retain];
[alarmSound setLoops:YES];
[alarmSound setVolume:1];
clickSound = [NSSound soundNamed:@"click.wav"];
[clickSound retain];
[clickSound setLoops:NO];
[clickSound setVolume:0.2];
clearSound = [NSSound soundNamed:@"clear.wav"];
[clearSound retain];
[clearSound setLoops:NO];
[clearSound setVolume:0.2];
remainingSeconds = 0;
isAlarm = NO;
cleared = NO;
ongoing = NO;
[clearSound play];
}
return self;
}
- (void)dealloc {
[digits release];
[colon release];
[no_colon release];
[clickSound release];
[clearSound release];
[super dealloc];
}
- (void)applicationLoaded:(id)sender {
[(NSButtonCell *)[hour1 cell] setHighlightsBy:NSContentsCellMask];
[(NSButtonCell *)[hour2 cell] setHighlightsBy:NSContentsCellMask];
[(NSButtonCell *)[minute1 cell] setHighlightsBy:NSContentsCellMask];
[(NSButtonCell *)[minute2 cell] setHighlightsBy:NSContentsCellMask];
[(NSButtonCell *)[second1 cell] setHighlightsBy:NSContentsCellMask];
[(NSButtonCell *)[second2 cell] setHighlightsBy:NSContentsCellMask];
[(NSButtonCell *)[start cell] setHighlightsBy:NSContentsCellMask];
[(NSButtonCell *)[clear cell] setHighlightsBy:NSContentsCellMask];
[self clearNow];
}
- (IBAction)startOrPause:(NSButton *)sender {
[clickSound play];
if (isAlarm) {
[self stopRepeatingTimer:self];
[self clearNow];
ongoing = NO;
} else {
if (!ongoing) {
[self startRepeatingTimer:self];
[clear setTransparent:YES];
ongoing = YES;
cleared = NO;
} else {
[self stopRepeatingTimer:self];
[clear setTransparent:NO];
ongoing = NO;
}
}
}
- (void)clearNow:(id)sender {
[self clearNow];
[clear setTransparent:YES];
[clearSound play];
[[[NSApplication sharedApplication] dockTile] setBadgeLabel:nil];
}
- (void)clearNow {
remainingSeconds = [[NSUserDefaults standardUserDefaults] integerForKey:@"defaultTime"];
[self setDigitsForTime:remainingSeconds];
cleared = YES;
[[[NSApplication sharedApplication] dockTile] setBadgeLabel:nil];
}
- (void)tick:(NSTimer*)theTimer {
[self setDigitsForTime:remainingSeconds];
remainingSeconds -= 1;
if (remainingSeconds < 0) {
[theTimer invalidate];
self.repeatingTimer = nil;
[self alarm:self];
cleared = NO;
}
}
- (void)setDigitsForTime:(int)time {
int hd2, hd1, md2, md1, sd2, sd1, hours, minutes, seconds;
hours = time / 3600;
hd1 = hours % 10;
hd2 = (hours - hd1) / 10;
minutes = (time - (hours * 3600)) / 60;
md1 = minutes % 10;
md2 = (minutes - md1) / 10;
seconds = time - (hours * 3600) - (minutes * 60);
sd1 = seconds % 10;
sd2 = (seconds - sd1) / 10;
hour2.image = [digits objectAtIndex:hd2];
hour1.image = [digits objectAtIndex:hd1];
minute2.image = [digits objectAtIndex:md2];
minute1.image = [digits objectAtIndex:md1];
second2.image = [digits objectAtIndex:sd2];
second1.image = [digits objectAtIndex:sd1];
NSString *badge = [NSString stringWithFormat:@"%i%i:%i%i", hd2, hd1, md2, md1];
[[[NSApplication sharedApplication] dockTile] setBadgeLabel:badge];
}
- (void)alarm:(id)sender {
isAlarm = YES;
if (cleared == NO) {
[alarmSound play];
[self performSelector:@selector(alarm:) withObject:self afterDelay:1];
} else {
[alarmSound stop];
isAlarm = NO;
}
}
- (void)startRepeatingTimer:(id)sender {
NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1
target:self selector:@selector(tick:)
userInfo:nil repeats:YES];
self.repeatingTimer = timer;
}
- (void)stopRepeatingTimer:(id)sender {
[repeatingTimer invalidate];
self.repeatingTimer = nil;
}
- (IBAction)changeDigit:(NSButton *)sender {
if (repeatingTimer == nil) {
[clickSound play];
int time = remainingSeconds;
int hd2, hd1, md2, md1, sd2, sd1, hours, minutes, seconds;
hours = time / 3600;
hd1 = hours % 10;
hd2 = (hours - hd1) / 10;
minutes = (time - (hours * 3600)) / 60;
md1 = minutes % 10;
md2 = (minutes - md1) / 10;
seconds = time - (hours * 3600) - (minutes * 60);
sd1 = seconds % 10;
sd2 = (seconds - sd1) / 10;
if (sender == hour2) {
hd2 = (hd2 + 1) % 10;
} else if (sender == hour1) {
hd1 = (hd1 + 1) % 10;
} else if (sender == minute2) {
md2 = (md2 + 1) % 6;
} else if (sender == minute1) {
md1 = (md1 + 1) % 10;
} else if (sender == second2) {
sd2 = (sd2 + 1) % 6;
} else if (sender == second1) {
sd1 = (sd1 + 1) % 10;
}
remainingSeconds = hd2 * 3600 * 10 + hd1 * 3600 + md2 * 60 * 10 + md1 * 60 + sd2 * 10 + sd1;
[[NSUserDefaults standardUserDefaults] setInteger:remainingSeconds forKey:@"defaultTime"];
[self clearNow];
}
}
@end