macosx: Fix initializing the Cells in Slider subclasses
[vlc.git] / modules / gui / macosx / VLCDefaultValueSlider.m
1 /*****************************************************************************
2  * VLCDefaultValueSlider.m: Custom NSSlider which allows a defaultValue
3  *****************************************************************************
4  * Copyright (C) 2016 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 #import "VLCDefaultValueSlider.h"
25 #import "VLCDefaultValueSliderCell.h"
26
27 @implementation VLCDefaultValueSlider
28
29 - (instancetype)initWithCoder:(NSCoder *)coder
30 {
31     self = [super initWithCoder:coder];
32     if (self) {
33         if (![self.cell isKindOfClass:[VLCDefaultValueSliderCell class]]) {
34             self.cell = [[VLCDefaultValueSliderCell alloc] init];
35         }
36         _isScrollable = YES;
37     }
38     return self;
39 }
40
41 + (Class)cellClass
42 {
43     return [VLCDefaultValueSliderCell class];
44 }
45
46 - (void)scrollWheel:(NSEvent *)event
47 {
48     if (!_isScrollable)
49         return [super scrollWheel:event];
50     double increment;
51     CGFloat deltaY = [event scrollingDeltaY];
52     double range = [self maxValue] - [self minValue];
53
54     // Scroll less for high precision, else it's too fast
55     if (event.hasPreciseScrollingDeltas) {
56         increment = (range * 0.002) * deltaY;
57     } else {
58         if (deltaY == 0.0)
59             return;
60         increment = (range * 0.01 * deltaY);
61     }
62
63     // If scrolling is inversed, increment in other direction
64     if (!event.isDirectionInvertedFromDevice)
65         increment = -increment;
66
67     [self setDoubleValue:self.doubleValue - increment];
68     [self sendAction:self.action to:self.target];
69 }
70
71 - (void)setDefaultValue:(double)value
72 {
73     [(VLCDefaultValueSliderCell *)self.cell setDefaultValue:value];
74 }
75
76 - (double)defaultValue
77 {
78     return [(VLCDefaultValueSliderCell *)self.cell defaultValue];
79 }
80
81 - (void)setUsesBrightArtwork:(BOOL)brightArtwork
82 {
83     // TODO!
84 }
85
86 @end