61c1312b5960e0860d01cf251ef9804dc33048d8
[vlc.git] / modules / gui / macosx / VLCVolumeSliderCell.m
1 /*****************************************************************************
2  * VLCVolumeSliderCell.m
3  *****************************************************************************
4  * Copyright (C) 2017 VLC authors and VideoLAN
5  * $Id$
6  *
7  * Authors: Marvin Scholz <epirat07 at gmail dot com>
8  *
9  * This program is free software; you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License as published by
11  * the Free Software Foundation; either version 2 of the License, or
12  * (at your option) any later version.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program; if not, write to the Free Software
21  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
22  *****************************************************************************/
23
24
25 #import "VLCVolumeSliderCell.h"
26
27 @implementation VLCVolumeSliderCell
28
29 - (instancetype)init
30 {
31     self = [super init];
32     if (self) {
33         [self setSliderStyleLight];
34     }
35     return self;
36 }
37
38 - (instancetype)initWithCoder:(NSCoder *)coder
39 {
40     self = [super initWithCoder:coder];
41     if (self) {
42         [self setSliderStyleLight];
43     }
44     return self;
45 }
46
47 - (void)setSliderStyleLight
48 {
49     // Color Declarations
50     _gradientColor = [NSColor colorWithCalibratedRed: 0.663 green: 0.663 blue: 0.663 alpha: 1];
51     _gradientColor2 = [NSColor colorWithCalibratedRed: 0.749 green: 0.749 blue: 0.753 alpha: 1];
52     _trackStrokeColor = [NSColor colorWithCalibratedRed: 0.619 green: 0.624 blue: 0.623 alpha: 1];
53     _filledTrackColor = [NSColor colorWithCalibratedRed: 0.55 green: 0.55 blue: 0.55 alpha: 1];
54     _knobFillColor = [NSColor colorWithCalibratedRed: 1 green: 1 blue: 1 alpha: 1];
55     _activeKnobFillColor = [NSColor colorWithCalibratedRed: 0.95 green: 0.95 blue: 0.95 alpha: 1];
56     _shadowColor = [NSColor colorWithCalibratedRed: 0.32 green: 0.32 blue: 0.32 alpha: 1];
57     _knobStrokeColor = [NSColor colorWithCalibratedRed: 0.592 green: 0.596 blue: 0.596 alpha: 1];
58
59     // Gradient Declarations
60     _trackGradient = [[NSGradient alloc] initWithColorsAndLocations:
61                       _gradientColor, 0.0,
62                       [_gradientColor blendedColorWithFraction:0.5 ofColor:_gradientColor2], 0.60,
63                       _gradientColor2, 1.0, nil];
64
65     // Shadow Declarations
66     _knobShadow = [[NSShadow alloc] init];
67     _knobShadow.shadowColor = _shadowColor;
68     _knobShadow.shadowOffset = NSMakeSize(0, 0);
69     _knobShadow.shadowBlurRadius = 2;
70
71     _highlightBackground = [NSColor colorWithCalibratedRed:0.20 green:0.55 blue:0.91 alpha:1.0];
72     NSColor *highlightAccent = [NSColor colorWithCalibratedRed:0.4588235294 green:0.7254901961 blue:0.9882352941 alpha:1.0];
73     _highlightGradient = [[NSGradient alloc] initWithColors:@[
74                                                               _highlightBackground,
75                                                               highlightAccent,
76                                                               _highlightBackground
77                                                               ]];
78 }
79
80 - (void)setSliderStyleDark
81 {
82     // Color Declarations
83     _gradientColor = [NSColor colorWithCalibratedRed: 0.24 green: 0.24 blue: 0.24 alpha: 1];
84     _gradientColor2 = [NSColor colorWithCalibratedRed: 0.15 green: 0.15 blue: 0.15 alpha: 1];
85     _trackStrokeColor = [NSColor colorWithCalibratedRed: 0.23 green: 0.23 blue: 0.23 alpha: 1];
86     _filledTrackColor = [NSColor colorWithCalibratedRed: 0.15 green: 0.15 blue: 0.15 alpha: 1];
87     _knobFillColor = [NSColor colorWithCalibratedRed:0.7 green:0.7 blue:0.7 alpha: 1];
88     _activeKnobFillColor = [NSColor colorWithCalibratedRed: 0.95 green: 0.95 blue: 0.95 alpha: 1];
89     _shadowColor = [NSColor colorWithCalibratedRed: 0.32 green: 0.32 blue: 0.32 alpha: 1];
90     _knobStrokeColor = [NSColor colorWithCalibratedRed:0 green:0 blue:0 alpha:1];
91
92     NSColor* knobGradientColor = [NSColor colorWithSRGBRed: 0.15 green: 0.15 blue: 0.15 alpha: 1];
93     NSColor* knobGradientColor2 = [NSColor colorWithSRGBRed: 0.30 green: 0.30 blue: 0.30 alpha: 1];
94
95     // Gradient Declarations
96     _trackGradient = [[NSGradient alloc] initWithColorsAndLocations:
97                       _gradientColor, 0.0,
98                       [_gradientColor blendedColorWithFraction:0.5 ofColor:_gradientColor2], 0.60,
99                       _gradientColor2, 1.0, nil];
100
101     _knobGradient = [[NSGradient alloc] initWithStartingColor:knobGradientColor
102                                                   endingColor:knobGradientColor2];
103
104
105     // Shadow Declarations
106     _knobShadow = [[NSShadow alloc] init];
107     _knobShadow.shadowColor = _shadowColor;
108     _knobShadow.shadowOffset = NSMakeSize(0, 0);
109     _knobShadow.shadowBlurRadius = 2;
110
111     _highlightBackground = [NSColor colorWithCalibratedRed:0.20 green:0.55 blue:0.91 alpha:1.0];
112     NSColor *highlightAccent = [NSColor colorWithCalibratedRed:0.4588235294 green:0.7254901961 blue:0.9882352941 alpha:1.0];
113     _highlightGradient = [[NSGradient alloc] initWithColors:@[
114                                                               _highlightBackground,
115                                                               highlightAccent,
116                                                               _highlightBackground
117                                                               ]];
118 }
119
120 - (void)drawKnob:(NSRect)knobRect
121 {
122     // Draw knob
123     NSBezierPath* knobPath = [NSBezierPath bezierPathWithOvalInRect:NSInsetRect(knobRect, 5.0, 5.0)];
124     if (self.isHighlighted) {
125         if (_knobGradient) {
126             [_knobGradient drawInBezierPath:knobPath angle:270];
127         } else {
128             [_activeKnobFillColor setFill];
129         }
130     } else {
131         if (_knobGradient) {
132             [_knobGradient drawInBezierPath:knobPath angle:90];
133         } else {
134             [_knobFillColor setFill];
135         }
136     }
137
138     if (!_knobGradient)
139         [knobPath fill];
140
141     [_knobStrokeColor setStroke];
142     knobPath.lineWidth = 0.5;
143
144     [NSGraphicsContext saveGraphicsState];
145     if (self.isHighlighted)
146         [_knobShadow set];
147     [knobPath stroke];
148     [NSGraphicsContext restoreGraphicsState];
149 }
150
151 - (double)myNormalizedDouble
152 {
153     double min = [self minValue];
154     double max = [self maxValue];
155     double current = [self doubleValue];
156
157     max -= min;
158     current -= min;
159
160     return current / max;
161 }
162
163 - (NSRect)knobRectFlipped:(BOOL)flipped
164 {
165     double val = [self myNormalizedDouble];
166     NSRect rect = NSMakeRect((NSWidth(_trackRect) - self.knobThickness) * val, -1, self.knobThickness, self.knobThickness);
167     return [[self controlView] backingAlignedRect:rect options:NSAlignAllEdgesNearest];
168 }
169
170 - (void)drawBarInside:(NSRect)rect flipped:(BOOL)flipped
171 {
172     // Inset rect
173     rect = NSInsetRect(rect, 1.0, 1.0);
174
175     // Empty Track Drawing
176     NSBezierPath* emptyTrackPath = [NSBezierPath bezierPathWithRoundedRect:rect xRadius:1 yRadius:1];
177     [_trackGradient drawInBezierPath:emptyTrackPath angle:-90];
178
179     // Calculate filled track
180     NSRect filledTrackRect = rect;
181     NSRect knobRect = [self knobRectFlipped:NO];
182     filledTrackRect.size.width = knobRect.origin.x + (self.knobThickness / 2);
183
184     // Filled Track Drawing
185     CGFloat filledTrackCornerRadius = 2;
186     NSBezierPath* filledTrackPath = [NSBezierPath bezierPathWithRoundedRect:filledTrackRect
187                                                                     xRadius:filledTrackCornerRadius
188                                                                     yRadius:filledTrackCornerRadius];
189
190     [_filledTrackColor setFill];
191     [filledTrackPath fill];
192
193     [_trackStrokeColor setStroke];
194     emptyTrackPath.lineWidth = 1;
195     [emptyTrackPath stroke];
196 }
197
198 @end