@@ -6,41 +6,64 @@ @implementation MMHoverButton
66 NSBox *_circle;
77}
88
9- + (NSImage *)imageNamed : ( NSString *) name
9+ + (NSImage *)imageFromType : (MMHoverButtonImage) imageType
1010{
11- CGFloat size = [name isEqualToString: @" CloseTabButton" ] ? 15 : 17 ;
12- return [NSImage imageWithSize: NSMakeSize (size, size) flipped: NO drawingHandler: ^BOOL (NSRect dstRect) {
13- NSBezierPath *p = [NSBezierPath new ];
14- if ([name isEqualToString: @" AddTabButton" ]) {
11+ if (imageType >= MMHoverButtonImageCount)
12+ return nil ;
13+
14+ CGFloat size = imageType == MMHoverButtonImageCloseTab ? 15 : 17 ;
15+
16+ static __weak NSImage *imageCache[MMHoverButtonImageCount] = { nil };
17+ if (imageCache[imageType] != nil )
18+ return imageCache[imageType];
19+
20+ BOOL (^drawFuncs[MMHoverButtonImageCount])(NSRect ) = {
21+ // AddTab
22+ ^BOOL (NSRect dstRect) {
23+ NSBezierPath *p = [NSBezierPath new ];
1524 [p moveToPoint: NSMakePoint ( 8.5 , 4.5 )];
1625 [p lineToPoint: NSMakePoint ( 8.5 , 12.5 )];
1726 [p moveToPoint: NSMakePoint ( 4.5 , 8.5 )];
1827 [p lineToPoint: NSMakePoint (12.5 , 8.5 )];
1928 [p setLineWidth: 1.2 ];
2029 [p stroke ];
21- }
22- else if ([name isEqualToString: @" CloseTabButton" ]) {
30+ return YES ;
31+ },
32+ // CloseTab
33+ ^BOOL (NSRect dstRect) {
34+ NSBezierPath *p = [NSBezierPath new ];
2335 [p moveToPoint: NSMakePoint ( 4.5 , 4.5 )];
2436 [p lineToPoint: NSMakePoint (10.5 , 10.5 )];
2537 [p moveToPoint: NSMakePoint ( 4.5 , 10.5 )];
2638 [p lineToPoint: NSMakePoint (10.5 , 4.5 )];
2739 [p setLineWidth: 1.2 ];
2840 [p stroke ];
29- }
30- else if ([name isEqualToString: @" ScrollLeftButton" ]) {
41+ return YES ;
42+ },
43+ // ScrollLeft
44+ ^BOOL (NSRect dstRect) {
45+ NSBezierPath *p = [NSBezierPath new ];
3146 [p moveToPoint: NSMakePoint ( 5.0 , 8.5 )];
3247 [p lineToPoint: NSMakePoint (10.0 , 4.5 )];
3348 [p lineToPoint: NSMakePoint (10.0 , 12.5 )];
3449 [p fill ];
35- }
36- else if ([name isEqualToString: @" ScrollRightButton" ]) {
50+ return YES ;
51+ },
52+ // ScrollRight
53+ ^BOOL (NSRect dstRect) {
54+ NSBezierPath *p = [NSBezierPath new ];
3755 [p moveToPoint: NSMakePoint (12.0 , 8.5 )];
3856 [p lineToPoint: NSMakePoint ( 7.0 , 4.5 )];
3957 [p lineToPoint: NSMakePoint ( 7.0 , 12.5 )];
4058 [p fill ];
59+ return YES ;
4160 }
42- return YES ;
43- }];
61+ };
62+ NSImage *img = [NSImage imageWithSize: NSMakeSize (size, size)
63+ flipped: NO
64+ drawingHandler: drawFuncs[imageType]];
65+ imageCache[imageType] = img;
66+ return img;
4467}
4568
4669- (instancetype )initWithFrame : (NSRect )frameRect
@@ -70,22 +93,28 @@ - (void)setFgColor:(NSColor *)color
7093 self.image = super.image ;
7194}
7295
73- - (void )setImage : (NSImage *)image
96+ - (void )setImage : (NSImage *)imageTemplate
7497{
75- _circle.cornerRadius = image .size .width / 2.0 ;
98+ _circle.cornerRadius = imageTemplate .size .width / 2.0 ;
7699 NSColor *fillColor = self.fgColor ?: NSColor .controlTextColor ;
77- super.image = [NSImage imageWithSize: image.size flipped: NO drawingHandler: ^BOOL (NSRect dstRect) {
78- [image drawInRect: dstRect];
100+ NSImage *image = [NSImage imageWithSize: imageTemplate.size
101+ flipped: NO
102+ drawingHandler: ^BOOL (NSRect dstRect) {
103+ [imageTemplate drawInRect: dstRect];
79104 [fillColor set ];
80105 NSRectFillUsingOperation (dstRect, NSCompositingOperationSourceAtop);
81106 return YES ;
82107 }];
83- self.alternateImage = [NSImage imageWithSize: image.size flipped: NO drawingHandler: ^BOOL (NSRect dstRect) {
108+ NSImage *alternateImage = [NSImage imageWithSize: imageTemplate.size
109+ flipped: NO
110+ drawingHandler: ^BOOL (NSRect dstRect) {
84111 [[fillColor colorWithAlphaComponent: 0.2 ] set ];
85112 [[NSBezierPath bezierPathWithOvalInRect: dstRect] fill ];
86- [super . image drawInRect: dstRect];
113+ [image drawInRect: dstRect];
87114 return YES ;
88115 }];
116+ super.image = image;
117+ self.alternateImage = alternateImage;
89118}
90119
91120- (void )setEnabled : (BOOL )enabled
0 commit comments