forked from mikecsh/mbtablegrid
-
Notifications
You must be signed in to change notification settings - Fork 3
/
MBImageCell.m
99 lines (72 loc) · 2.74 KB
/
MBImageCell.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
//
// MBImageCell.m
// MBTableGrid
//
// Created by Brendan Duddridge on 2014-11-13.
//
//
#import "MBImageCell.h"
@interface MBImageCell()
@property (nonatomic, strong) NSColor *borderColor;
@end
@implementation MBImageCell
- (instancetype)init {
self = [super init];
if (self) {
[self setBordered:NO];
[self setBezeled:NO];
if (@available(macOS 10.13, *)) {
self.borderColor = [NSColor colorNamed:@"grid-line"];
} else {
self.borderColor = [NSColor gridColor];
}
}
return self;
}
#pragma mark - MBTableGridEditable
- (void)drawWithFrame:(NSRect)cellFrame inView:(NSView *)controlView withBackgroundColor:(NSColor *)backgroundColor {
[backgroundColor set];
NSRect rect = cellFrame;
NSRectFill(rect);
[self drawWithFrame:cellFrame inView:controlView];
}
- (void)drawWithFrame:(NSRect)cellFrame inView:(NSView *)controlView {
[self.borderColor set];
NSRect rightLine = NSMakeRect(NSMaxX(cellFrame)-1.0, NSMinY(cellFrame), 1.0, NSHeight(cellFrame));
NSRectFill(rightLine);
// Draw the bottom border
NSRect bottomLine = NSMakeRect(NSMinX(cellFrame), NSMaxY(cellFrame)-1.0, NSWidth(cellFrame), 1.0);
NSRectFill(bottomLine);
cellFrame.origin.y += 1;
cellFrame.size.height -= 3;
if (self.accessoryButtonImage) {
NSRect accessoryButtonFrame = cellFrame;
accessoryButtonFrame.size.width = 16.0;
accessoryButtonFrame.size.height = 16.0;
accessoryButtonFrame.origin.x = cellFrame.origin.x + cellFrame.size.width - accessoryButtonFrame.size.width - 4;
// adjust rect for top border
accessoryButtonFrame.origin.y = cellFrame.origin.y + ceilf(cellFrame.size.height / 2) - ceilf(self.accessoryButtonImage.size.height / 2);
// draw the accessory image
[self.accessoryButtonImage drawInRect:accessoryButtonFrame
fromRect:NSZeroRect
operation:NSCompositingOperationSourceOver
fraction:1.0
respectFlipped:YES
hints:nil];
}
// adjust cellFrame to make room for accessory button so it's never overlapped
// with a little bit of padding.
cellFrame.size.width -= 16 + 2;
[self drawInteriorWithFrame:cellFrame inView:controlView];
}
- (NSCellHitResult)hitTestForEvent:(NSEvent *)event inRect:(NSRect)cellFrame ofView:(NSView *)controlView {
NSRect accessoryButtonFrame = cellFrame;
accessoryButtonFrame.size.width = 16.0;
accessoryButtonFrame.size.height = 16.0;
accessoryButtonFrame.origin.x = cellFrame.origin.x + cellFrame.size.width - accessoryButtonFrame.size.width - 4;
// adjust rect for top border
accessoryButtonFrame.origin.y += 1;
CGPoint eventLocationInControlView = [controlView convertPoint:event.locationInWindow fromView:nil];
return CGRectContainsPoint(accessoryButtonFrame, eventLocationInControlView) ? NSCellHitContentArea : NSCellHitNone;
}
@end