add TimerView.meter property
[exterlulz-kokogems.git] / src / TimerView.m
blob5e6afdd274e17a95be27c410da48c1d962c4d7c0
1 /* ----====----====----====----====----====----====----====----====----====----
2 MyTimerView.m (jeweltoy)
4 JewelToy is a simple game played against the clock.
5 Copyright (C) 2001  Giles Williams
7 This program is free software; you can redistribute it and/or
8 modify it under the terms of the GNU General Public License
9 as published by the Free Software Foundation; either version 2
10 of the License, or (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
20 ----====----====----====----====----====----====----====----====----====---- */
22 #import "TimerView.h"
24 @implementation TimerView
26 @synthesize meter = _meter;
28 - (id)initWithFrame:(NSRect)frame {
29     [super initWithFrame:frame];
30     
31     _meter      = 0.5;
32     color1      = [[NSColor redColor] retain];
33     color2      = [[NSColor yellowColor] retain];
34     colorOK     = [[NSColor greenColor] retain];
35     backColor   = [[NSColor blackColor] retain];
36     isRunning   = NO;
37     
38     return self;
41 // dealloc is the method called when objects are being freed. (Note that "release"
42 // is called to release objects; when the number of release calls reduce the
43 // total reference count on an object to zero, dealloc is called to free
44 // the object.  dealloc should free any memory allocated by the subclass
45 // and then call super to get the superclass to do additional cleanup.
47 - (void)dealloc {
48     [color1 release];
49     [color2 release];
50     [colorOK release];
51     [backColor release];
52     [super dealloc];
55 - (void)drawRect:(NSRect)rect
57   #pragma unused (rect)
58   
59     NSRect dotRect;
61     [backColor set];
62     NSRectFill([self bounds]);   // Equiv to [[NSBezierPath bezierPathWithRect:[self bounds]] fill]
64     dotRect.origin.x = 4;
65     dotRect.origin.y = 4;
66     dotRect.size.width  = _meter * ([self bounds].size.width - 8);
67     dotRect.size.height = [self bounds].size.height - 8;
68     
69     [colorOK set];
71   // another MW change...
72     if (decrement!=0)
73     {
74       // TODO: reverse and add else?
75         if (_meter < 0.3) [color2 set];
76         if (_meter < 0.1) [color1 set];
77     }
79     NSRectFill(dotRect);   // Equiv to [[NSBezierPath bezierPathWithRect:dotRect] fill]
82 - (BOOL)isOpaque {
83     return YES;
86 // Utility
87 - (void) setPaused:(BOOL) value
89     isRunning = !value;
92 - (void) incrementMeter:(float) value
94     _meter += value;
95     if (_meter > 1) _meter = 1;
96     [self setNeedsDisplay:YES];
99 - (void) setDecrement:(float) value
101     decrement = value;
104 - (void) decrementMeter:(float) value
106     _meter -= value;
107   if (_meter < 0) {
108     _meter = 0;
109   }
110   
111     [self setNeedsDisplay:YES];
114 - (void) setTimerRunningEvery:(NSTimeInterval) timeInterval
115             decrement:(float) value
116             withTarget:(id) targ
117             whenRunOut:(SEL) runOutSel
118             whenRunOver:(SEL) runOverSel
120     decrement = value;
121     target = targ;
122     runOutSelector = runOutSel;
123     runOverSelector = runOverSel;
124     if (timer)
125     {
126         [timer invalidate];
127     }
128     timer = [NSTimer    scheduledTimerWithTimeInterval:timeInterval
129                 target:self
130                 selector:@selector(runTimer)
131                 userInfo:self
132                 repeats:YES];
133     isRunning = YES;
136 - (void) runTimer
138     if (isRunning)
139     {
140         if (_meter == 1)
141         {
142             isRunning = NO;
143             [target performSelector:runOverSelector];
144             return;
145         }
146         [self decrementMeter:decrement];
147         if (_meter == 0 && decrement!=0)        // MW change added '&& decrement'
148         {
149             isRunning = NO;
150             [target performSelector:runOutSelector];
151             return;
152         }
153     }
156 - (void) setTimer:(float)value
158     isRunning = NO;
159     _meter = value;
160   
161     [self setNeedsDisplay:YES];
164 @end