-
Notifications
You must be signed in to change notification settings - Fork 2
/
CellView.m
113 lines (92 loc) · 3.44 KB
/
CellView.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
#import "CellView.h"
#import "Controller.h"
@implementation CellView
@synthesize backgroundColor;
@synthesize borderColor;
@synthesize aliveColor;
@synthesize deadColor;
@synthesize borderSize;
- (id)initWithFrame:(NSRect)frame
{
self = [super initWithFrame:frame];
if (self) {
}
return self;
}
- (void) dealloc
{
[backgroundColor release];
[borderColor release];
[aliveColor release];
[deadColor release];
[super dealloc];
}
- (void)drawRect:(NSRect)rect
{
NSRect bounds = [self bounds];
[[self backgroundColor] set];
[NSBezierPath fillRect:bounds];
int columns = [controller columns];
int rows = [controller rows];
cellWidth = ((bounds.size.width - (columns * [self borderSize])) / columns);
cellHeight = ((bounds.size.height - (rows * [self borderSize])) / rows);
// Draw Cells
for(int colIndex = 0; colIndex < columns; colIndex++) {
for(int rowIndex = 0; rowIndex < rows; rowIndex++) {
switch ([controller cellAliveAtColumn:colIndex andRow:rowIndex]) {
case YES:
[[self aliveColor] set];
break;
case NO:
[[self deadColor] set];
break;
}
// Create the cell
NSRect cell = NSMakeRect((colIndex * cellWidth) + (colIndex * [self borderSize]),
(rowIndex * cellHeight) + (rowIndex * [self borderSize]),
cellWidth,
cellHeight);
[NSBezierPath fillRect:cell];
if((rowIndex % 5) == 0) {
[NSBezierPath setDefaultLineWidth:[self borderSize]];
[[self borderColor] set];
NSPoint start = NSMakePoint(bounds.origin.y, (rowIndex * cellHeight) + (rowIndex * [self borderSize]));
NSPoint finish = NSMakePoint(bounds.size.width, (rowIndex * cellHeight) + (rowIndex * [self borderSize]));
[NSBezierPath strokeLineFromPoint:start toPoint:finish];
}
}
if((colIndex % 5) == 0) {
[NSBezierPath setDefaultLineWidth:[self borderSize]];
[[self borderColor] set];
NSPoint start = NSMakePoint((colIndex * cellWidth) + (colIndex * [self borderSize]), bounds.origin.x);
NSPoint finish = NSMakePoint((colIndex * cellWidth) + (colIndex * [self borderSize]), bounds.size.height);
[NSBezierPath strokeLineFromPoint:start toPoint:finish];
}
}
}
#pragma mark Events
- (void)mouseDown:(NSEvent *)event
{
NSPoint p = [event locationInWindow];
NSPoint downPoint = [self convertPoint:p fromView:nil];
int column = downPoint.x / (cellWidth + [self borderSize]);
int row = downPoint.y / (cellHeight + [self borderSize]);
[controller toggleCellAtColumn:column andRow:row];
// For drags we want to enable or disable, not toggle
dragCellStatus = [controller cellAliveAtColumn:column andRow:row];
[self setNeedsDisplay:TRUE];
}
- (void) mouseDragged:(NSEvent *)event
{
NSPoint p = [event locationInWindow];
NSPoint downPoint = [self convertPoint:p fromView:nil];
int column = downPoint.x / (cellWidth + [self borderSize]);
int row = downPoint.y / (cellHeight + [self borderSize]);
if (column != dragColumn || row != dragRow) {
[controller setCellAlive:dragCellStatus AtColumn:column andRow:row];
[self setNeedsDisplay:TRUE];
}
dragColumn = column;
dragRow = row;
}
@end