blob: 78ce35a6aca050ceb954103f96c652ee5b451112 [file] [log] [blame]
Kateryna Kostiuk58276bc2017-06-07 08:50:48 -04001/*
2 * Copyright (C) 2015-2017 Savoir-faire Linux Inc.
3 * Author: Kateryna Kostiuk <kateryna.kostiuk@savoirfairelinux.com>
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 3 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18 */
19
20#import "MessageBubbleView.h"
21#import <CoreGraphics/CoreGraphics.h>
22#import <QuartzCore/QuartzCore.h>
23#import "NSColor+RingTheme.h"
24
25@implementation MessageBubbleView
26
27- (void)drawRect:(NSRect)dirtyRect {
28 [super drawRect:dirtyRect];
29 CGContextRef context = (CGContextRef) [[NSGraphicsContext currentContext] graphicsPort];
30 CGContextSetRGBFillColor(context, 1, 1, 1, 1);
Kateryna Kostiukae660fd2018-04-24 14:10:41 -040031 CGFloat defaultRadius = 16;
32 CGFloat radius = (self.cornerRadius) ? self.cornerRadius : defaultRadius;
33 CGFloat minx = CGRectGetMinX(dirtyRect);
34 CGFloat midx = CGRectGetMidX(dirtyRect);
35 CGFloat maxx = CGRectGetMaxX(dirtyRect);
36 CGFloat miny = CGRectGetMinY(dirtyRect);
37 CGFloat midy = CGRectGetMidY(dirtyRect);
38 CGFloat maxy = CGRectGetMaxY(dirtyRect);
Kateryna Kostiuk58276bc2017-06-07 08:50:48 -040039
40 CGMutablePathRef outlinePath = CGPathCreateMutable();
Kateryna Kostiuk58276bc2017-06-07 08:50:48 -040041 if (self.pointerDirection == LEFT)
42 {
Kateryna Kostiukae660fd2018-04-24 14:10:41 -040043 switch (self.type) {
44 case SINGLE:
45 CGPathMoveToPoint(outlinePath, nil, midx, miny);
46 CGPathAddArcToPoint(outlinePath, nil, maxx, miny, maxx, midy, radius);
47 CGPathAddArcToPoint(outlinePath, nil, maxx, maxy, midx, maxy, radius);
48 CGPathAddArcToPoint(outlinePath, nil, minx, maxy, minx, midy, radius);
49 CGPathAddArcToPoint(outlinePath, nil, minx, miny, midx, miny, radius);
50 break;
51 case FIRST:
52 CGPathMoveToPoint(outlinePath, nil, midx, miny);
53 CGPathAddArcToPoint(outlinePath, nil, maxx, miny, maxx, midy, radius);
54 CGPathAddArcToPoint(outlinePath, nil, maxx, maxy, midx, maxy, radius);
55 CGPathAddArcToPoint(outlinePath, nil, minx, maxy, minx, midy, radius);
56 CGPathAddArcToPoint(outlinePath, nil, minx, miny, midx, miny, 0);
57 break;
58 case MIDDLE:
59 CGPathMoveToPoint(outlinePath, nil, midx, miny);
60 CGPathAddArcToPoint(outlinePath, nil, maxx, miny, maxx, midy, radius);
61 CGPathAddArcToPoint(outlinePath, nil, maxx, maxy, midx, maxy, radius);
62 CGPathAddArcToPoint(outlinePath, nil, minx, maxy, minx, midy, 0);
63 CGPathAddArcToPoint(outlinePath, nil, minx, miny, midx, miny, 0);
64 break;
65 case LAST:
66 CGPathMoveToPoint(outlinePath, nil, midx, miny);
67 CGPathAddArcToPoint(outlinePath, nil, maxx, miny, maxx, midy, radius);
68 CGPathAddArcToPoint(outlinePath, nil, maxx, maxy, midx, maxy, radius);
69 CGPathAddArcToPoint(outlinePath, nil, minx, maxy, minx, midy, 0);
70 CGPathAddArcToPoint(outlinePath, nil, minx, miny, midx, miny, radius);
71 break;
Kateryna Kostiuk58276bc2017-06-07 08:50:48 -040072 }
Kateryna Kostiukae660fd2018-04-24 14:10:41 -040073 } else {
74 switch (self.type) {
75 case SINGLE:
76 CGPathMoveToPoint(outlinePath, nil, midx, miny);
77 CGPathAddArcToPoint(outlinePath, nil, maxx, miny, maxx, midy, radius);
78 CGPathAddArcToPoint(outlinePath, nil, maxx, maxy, midx, maxy, radius);
79 CGPathAddArcToPoint(outlinePath, nil, minx, maxy, minx, midy, radius);
80 CGPathAddArcToPoint(outlinePath, nil, minx, miny, midx, miny, radius);
81 break;
82 case FIRST:
83 CGPathMoveToPoint(outlinePath, nil, midx, miny);
84 CGPathAddArcToPoint(outlinePath, nil, maxx, miny, maxx, midy, 0);
85 CGPathAddArcToPoint(outlinePath, nil, maxx, maxy, midx, maxy, radius);
86 CGPathAddArcToPoint(outlinePath, nil, minx, maxy, minx, midy, radius);
87 CGPathAddArcToPoint(outlinePath, nil, minx, miny, midx, miny, radius);
88 break;
89 case MIDDLE:
90 CGPathMoveToPoint(outlinePath, nil, midx, miny);
91 CGPathAddArcToPoint(outlinePath, nil, maxx, miny, maxx, midy, 0);
92 CGPathAddArcToPoint(outlinePath, nil, maxx, maxy, midx, maxy, 0);
93 CGPathAddArcToPoint(outlinePath, nil, minx, maxy, minx, midy, radius);
94 CGPathAddArcToPoint(outlinePath, nil, minx, miny, midx, miny, radius);
95 break;
96 case LAST:
97 CGPathMoveToPoint(outlinePath, nil, midx, miny);
98 CGPathAddArcToPoint(outlinePath, nil, maxx, miny, maxx, midy, radius);
99 CGPathAddArcToPoint(outlinePath, nil, maxx, maxy, midx, maxy, 0);
100 CGPathAddArcToPoint(outlinePath, nil, minx, maxy, minx, midy, radius);
101 CGPathAddArcToPoint(outlinePath, nil, minx, miny, midx, miny, radius);
102 break;
Kateryna Kostiuk58276bc2017-06-07 08:50:48 -0400103 }
Kateryna Kostiuk58276bc2017-06-07 08:50:48 -0400104 }
Kateryna Kostiukae660fd2018-04-24 14:10:41 -0400105 CGPathCloseSubpath(outlinePath);
Kateryna Kostiuk58276bc2017-06-07 08:50:48 -0400106 CGContextAddPath(context, outlinePath);
107 CGContextFillPath(context);
Kateryna Kostiuk58276bc2017-06-07 08:50:48 -0400108 CGContextAddPath(context, outlinePath);
109 CGContextClip(context);
110 if(self.bgColor) {
111 CGContextSetFillColorWithColor(context, self.bgColor.CGColor);
112 CGContextStrokePath(context);
113 NSRectFill(dirtyRect);
114 }
115}
Kateryna Kostiukae660fd2018-04-24 14:10:41 -0400116
Kateryna Kostiuk58276bc2017-06-07 08:50:48 -0400117@end