vlc | branch: master | Marvin Scholz <[email protected]> | Tue Jun 13 11:31:38 
2017 +0200| [ae034811e7c3bcb0870bc1eb66bccaa9942d587d] | committer: Marvin 
Scholz

macOS: Add VLCHUDScroller

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=ae034811e7c3bcb0870bc1eb66bccaa9942d587d
---

 .../package/macosx/VLC.xcodeproj/project.pbxproj   |   6 +
 modules/gui/macosx/Makefile.am                     |   1 +
 modules/gui/macosx/VLCHUDScroller.h                |  54 ++
 modules/gui/macosx/VLCHUDScroller.m                | 737 +++++++++++++++++++++
 4 files changed, 798 insertions(+)

diff --git a/extras/package/macosx/VLC.xcodeproj/project.pbxproj 
b/extras/package/macosx/VLC.xcodeproj/project.pbxproj
index 24b295a2d6..b649216205 100644
--- a/extras/package/macosx/VLC.xcodeproj/project.pbxproj
+++ b/extras/package/macosx/VLC.xcodeproj/project.pbxproj
@@ -79,6 +79,7 @@
                6B81662A1EBFC34300C26F1B /* VLCDefaultValueSliderCell.m in 
Sources */ = {isa = PBXBuildFile; fileRef = 6B6A499D1DFD9B23009128AC /* 
VLCDefaultValueSliderCell.m */; };
                6B81662B1EBFC35D00C26F1B /* VLCVoutWindowController.m in 
Sources */ = {isa = PBXBuildFile; fileRef = E0C2583F161B593D00185AAD /* 
VLCVoutWindowController.m */; };
                6B81662C1EBFC38100C26F1B /* VLCUIWidgets.m in Sources */ = {isa 
= PBXBuildFile; fileRef = 5CCED71514C0D4A90057F8D1 /* VLCUIWidgets.m */; };
+               6B9FD0391EEB5D8A0085151F /* VLCHUDScroller.m in Sources */ = 
{isa = PBXBuildFile; fileRef = 6B9FD0381EEB5D8A0085151F /* VLCHUDScroller.m */; 
};
                6BF093F91EE0182B0049D8B0 /* VLCTimeField.m in Sources */ = {isa 
= PBXBuildFile; fileRef = 6BF093F81EE0182B0049D8B0 /* VLCTimeField.m */; };
 /* End PBXBuildFile section */
 
@@ -678,6 +679,8 @@
                6B846FE31CF5D88C00112E54 /* VLCHUDSliderCell.m */ = {isa = 
PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path 
= VLCHUDSliderCell.m; sourceTree = "<group>"; };
                6B846FE91CF5DBFF00112E54 /* VLCHUDTextFieldCell.h */ = {isa = 
PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = 
VLCHUDTextFieldCell.h; sourceTree = "<group>"; };
                6B846FEA1CF5DBFF00112E54 /* VLCHUDTextFieldCell.m */ = {isa = 
PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path 
= VLCHUDTextFieldCell.m; sourceTree = "<group>"; };
+               6B9FD0371EEB5D8A0085151F /* VLCHUDScroller.h */ = {isa = 
PBXFileReference; lastKnownFileType = sourcecode.c.h; path = VLCHUDScroller.h; 
sourceTree = "<group>"; };
+               6B9FD0381EEB5D8A0085151F /* VLCHUDScroller.m */ = {isa = 
PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = 
VLCHUDScroller.m; sourceTree = "<group>"; };
                6BBBB8A71D108A17001BD9BA /* VLCRendererDialog.h */ = {isa = 
PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = 
VLCRendererDialog.h; sourceTree = "<group>"; };
                6BBBB8A81D108A17001BD9BA /* VLCRendererDialog.m */ = {isa = 
PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path 
= VLCRendererDialog.m; sourceTree = "<group>"; };
                6BBBB8B01D10A994001BD9BA /* VLCRendererItem.h */ = {isa = 
PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = 
VLCRendererItem.h; sourceTree = "<group>"; };
@@ -1591,6 +1594,8 @@
                                6B846FE11CF5D88C00112E54 /* 
VLCHUDRadiobuttonCell.m */,
                                6B846FE21CF5D88C00112E54 /* VLCHUDSliderCell.h 
*/,
                                6B846FE31CF5D88C00112E54 /* VLCHUDSliderCell.m 
*/,
+                               6B9FD0371EEB5D8A0085151F /* VLCHUDScroller.h */,
+                               6B9FD0381EEB5D8A0085151F /* VLCHUDScroller.m */,
                        );
                        name = "HUD UI Classes";
                        sourceTree = "<group>";
@@ -1872,6 +1877,7 @@
                                1C3113AB1E508C6900D4DD76 /* 
VLCExtensionsDialogProvider.m in Sources */,
                                1C3113AD1E508C6900D4DD76 /* 
VLCExtensionsManager.m in Sources */,
                                1C3113AF1E508C6900D4DD76 /* 
VLCFSPanelController.m in Sources */,
+                               6B9FD0391EEB5D8A0085151F /* VLCHUDScroller.m in 
Sources */,
                                1C3113B11E508C6900D4DD76 /* 
VLCFSPanelDraggableView.m in Sources */,
                                1C3113B41E508C6900D4DD76 /* VLCInputManager.m 
in Sources */,
                                1C3113B61E508C6900D4DD76 /* VLCMain+OldPrefs.m 
in Sources */,
diff --git a/modules/gui/macosx/Makefile.am b/modules/gui/macosx/Makefile.am
index bc367b5f8b..ca2ccdec51 100644
--- a/modules/gui/macosx/Makefile.am
+++ b/modules/gui/macosx/Makefile.am
@@ -77,6 +77,7 @@ libmacosx_plugin_la_SOURCES = \
        gui/macosx/VLCHUDCheckboxCell.h gui/macosx/VLCHUDCheckboxCell.m \
        gui/macosx/VLCHUDRadiobuttonCell.h gui/macosx/VLCHUDRadiobuttonCell.m \
        gui/macosx/VLCHUDTextFieldCell.h gui/macosx/VLCHUDTextFieldCell.m \
+       gui/macosx/VLCHUDScroller.h gui/macosx/VLCHUDScroller.m \
        gui/macosx/VLCInputManager.h gui/macosx/VLCInputManager.m \
        gui/macosx/VLCMainWindow.h gui/macosx/VLCMainWindow.m \
        gui/macosx/VLCRendererDiscovery.h gui/macosx/VLCRendererDiscovery.m \
diff --git a/modules/gui/macosx/VLCHUDScroller.h 
b/modules/gui/macosx/VLCHUDScroller.h
new file mode 100644
index 0000000000..5dcc00f829
--- /dev/null
+++ b/modules/gui/macosx/VLCHUDScroller.h
@@ -0,0 +1,54 @@
+//  VLCHUDScroller.h
+//  HUDScroller
+//
+//  Created by BinaryGod on 5/22/08.
+//
+//  Copyright (c) 2008, Tim Davis (BinaryMethod.com, [email protected])
+//  All rights reserved.
+//
+//  Redistribution and use in source and binary forms, with or without 
modification,
+//  are permitted provided that the following conditions are met:
+//
+//        Redistributions of source code must retain the above copyright 
notice, this
+//    list of conditions and the following disclaimer.
+//
+//        Redistributions in binary form must reproduce the above copyright 
notice,
+//    this list of conditions and the following disclaimer in the 
documentation and/or
+//    other materials provided with the distribution.
+//
+//        Neither the name of the BinaryMethod.com nor the names of its 
contributors
+//    may be used to endorse or promote products derived from this software 
without
+//    specific prior written permission.
+//
+//    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS 
IS AND
+//    ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
IMPLIED
+//    WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 
DISCLAIMED.
+//    IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY 
DIRECT,
+//    INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 
(INCLUDING,
+//    BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF 
USE, DATA,
+//    OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 
OF LIABILITY,
+//    WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 
OTHERWISE)
+//    ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 
THE
+//    POSSIBILITY OF SUCH DAMAGE.
+
+// Special thanks to Matt Gemmell (http://mattgemmell.com/) for helping me 
solve the
+// transparent drawing issues.  Your awesome man!!!
+
+#import <Cocoa/Cocoa.h>
+
+@interface VLCHUDScroller : NSScroller {
+    NSString *arrowPosition;
+}
+
+@property (strong) NSColor *scrollerStroke;
+@property (strong) NSGradient *scrollerKnobGradient;
+@property (strong) NSGradient *scrollerTrackGradient;
+@property (strong) NSGradient *scrollerArrowNormalGradient;
+@property (strong) NSGradient *scrollerArrowPushedGradient;
+
+- (void)drawDecrementArrow:(bool)highlighted;
+- (void)drawIncrementArrow:(bool)highlighted;
+
+- (bool)isHoriz;
+
+@end
diff --git a/modules/gui/macosx/VLCHUDScroller.m 
b/modules/gui/macosx/VLCHUDScroller.m
new file mode 100644
index 0000000000..9ed98c60d7
--- /dev/null
+++ b/modules/gui/macosx/VLCHUDScroller.m
@@ -0,0 +1,737 @@
+//  VLCHUDScroller.m
+//  HUDScroller
+//
+//  Created by BinaryGod on 5/22/08.
+//
+//  Copyright (c) 2008, Tim Davis (BinaryMethod.com, [email protected])
+//  All rights reserved.
+//
+//  Redistribution and use in source and binary forms, with or without 
modification,
+//  are permitted provided that the following conditions are met:
+//
+//        Redistributions of source code must retain the above copyright 
notice, this
+//    list of conditions and the following disclaimer.
+//
+//        Redistributions in binary form must reproduce the above copyright 
notice,
+//    this list of conditions and the following disclaimer in the 
documentation and/or
+//    other materials provided with the distribution.
+//
+//        Neither the name of the BinaryMethod.com nor the names of its 
contributors
+//    may be used to endorse or promote products derived from this software 
without
+//    specific prior written permission.
+//
+//    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS 
IS AND
+//    ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
IMPLIED
+//    WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 
DISCLAIMED.
+//    IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY 
DIRECT,
+//    INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 
(INCLUDING,
+//    BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF 
USE, DATA,
+//    OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 
OF LIABILITY,
+//    WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 
OTHERWISE)
+//    ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 
THE
+//    POSSIBILITY OF SUCH DAMAGE.
+
+// Special thanks to Matt Gemmell (http://mattgemmell.com/) for helping me 
solve the
+// transparent drawing issues.  Your awesome man!!!
+
+#import "VLCHUDScroller.h"
+
+@implementation VLCHUDScroller
+
+- (instancetype)initWithCoder:(NSCoder *)coder
+{
+    self = [super initWithCoder:coder];
+    if (self) {
+        _scrollerStroke = [NSColor colorWithDeviceRed: 0.749f green: 0.761f 
blue: 0.788f alpha: 1.0f];
+        _scrollerKnobGradient = [[NSGradient alloc] 
initWithStartingColor:[NSColor colorWithDeviceRed:0.631f green:0.639f 
blue:0.655f alpha:1.0f]
+                                                              
endingColor:[NSColor colorWithDeviceRed:0.439f green:0.447f blue:0.471f 
alpha:1.0f]];
+        _scrollerTrackGradient = [[NSGradient alloc] 
initWithStartingColor:[NSColor colorWithDeviceRed:0.137f green:0.137f 
blue:0.137f alpha:.75f]
+                                                               
endingColor:[NSColor colorWithDeviceRed:0.278f green:0.278f blue:0.278f 
alpha:.75f]];
+        _scrollerArrowNormalGradient = [[NSGradient alloc] 
initWithStartingColor:[NSColor colorWithDeviceRed:0.251f green:0.251f 
blue:0.255f alpha:0.5f]
+                                                                     
endingColor:[NSColor colorWithDeviceRed:0.118f green:0.118f blue:0.118f 
alpha:0.5f]];
+        _scrollerArrowPushedGradient = [[NSGradient alloc] 
initWithStartingColor:[NSColor colorWithDeviceRed:0.451f green:0.451f 
blue:0.455f alpha:0.5f]
+                                                                               
                  endingColor:[NSColor colorWithDeviceRed:0.318f green:0.318f 
blue:0.318f alpha:0.5f]];
+    }
+    return self;
+}
+
+#pragma mark Drawing Functions
+
+- (void)drawRect:(NSRect)rect {
+    // See if we should use system default or supplied value
+    if ([self arrowsPosition] == NSScrollerArrowsDefaultSetting) {
+        arrowPosition = [[[NSUserDefaults standardUserDefaults] 
persistentDomainForName:NSGlobalDomain] valueForKey: @"AppleScrollBarVariant"];
+        if (arrowPosition == nil) {
+            arrowPosition = @"DoubleMax";
+        }
+    } else {
+        if ([self arrowsPosition] == NSScrollerArrowsNone) {
+            arrowPosition = @"None";
+        }
+    }
+
+    NSDisableScreenUpdates();
+
+    [[NSColor colorWithCalibratedWhite:0.0f alpha:0.7f] set];
+    NSRectFill([self bounds]);
+
+    // Draw knob-slot.
+    [self drawKnobSlotInRect:[self bounds] highlight:YES];
+
+    // Draw knob
+    [self drawKnob];
+
+    // Draw arrows
+    [self drawArrow:NSScrollerIncrementArrow highlight:([self hitPart] == 
NSScrollerIncrementLine)];
+    [self drawArrow:NSScrollerDecrementArrow highlight:([self hitPart] == 
NSScrollerDecrementLine)];
+
+    [[self window] invalidateShadow];
+
+    NSEnableScreenUpdates();
+}
+
+- (void)drawKnob {
+
+    if(![self isHoriz]) {
+
+        //Draw Knob
+        NSBezierPath *knob = [[NSBezierPath alloc] init];
+        NSRect knobRect = [self rectForPart:NSScrollerKnob];
+
+
+        [knob appendBezierPathWithArcWithCenter:NSMakePoint(knobRect.origin.x 
+ ((knobRect.size.width - .5f) /2), (knobRect.origin.y + ((knobRect.size.width 
-2) /2)))
+                                         radius:(knobRect.size.width -2) /2
+                                     startAngle:180
+                                       endAngle:0];
+
+        [knob appendBezierPathWithArcWithCenter:NSMakePoint(knobRect.origin.x 
+ ((knobRect.size.width - .5f) /2), ((knobRect.origin.y + knobRect.size.height) 
- ((knobRect.size.width -2) /2)))
+                                         radius:(knobRect.size.width -2) /2
+                                     startAngle:0
+                                       endAngle:180];
+
+        [_scrollerStroke set];
+        [knob fill];
+
+        knobRect.origin.x += 1;
+        knobRect.origin.y += 1;
+        knobRect.size.width -= 2;
+        knobRect.size.height -= 2;
+
+        knob = [[NSBezierPath alloc] init];
+
+        [knob appendBezierPathWithArcWithCenter:NSMakePoint(knobRect.origin.x 
+ ((knobRect.size.width - .5f) /2), (knobRect.origin.y + ((knobRect.size.width 
-2) /2)))
+                                         radius:(knobRect.size.width -2) /2
+                                     startAngle:180
+                                       endAngle:0];
+
+        [knob appendBezierPathWithArcWithCenter:NSMakePoint(knobRect.origin.x 
+ ((knobRect.size.width - .5f) /2), ((knobRect.origin.y + knobRect.size.height) 
- ((knobRect.size.width -2) /2)))
+                                         radius:(knobRect.size.width -2) /2
+                                     startAngle:0
+                                       endAngle:180];
+
+        [_scrollerKnobGradient drawInBezierPath:knob angle:0];
+
+    } else {
+
+        //Draw Knob
+        NSBezierPath *knob = [[NSBezierPath alloc] init];
+        NSRect knobRect = [self rectForPart:NSScrollerKnob];
+
+        [knob appendBezierPathWithArcWithCenter:NSMakePoint(knobRect.origin.x 
+ ((knobRect.size.height - .5f) /2), (knobRect.origin.y + 
((knobRect.size.height -1) /2)))
+                                         radius:(knobRect.size.height -1) /2
+                                     startAngle:90
+                                       endAngle:270];
+
+        [knob appendBezierPathWithArcWithCenter:NSMakePoint((knobRect.origin.x 
+ knobRect.size.width) - ((knobRect.size.height - .5f) /2), (knobRect.origin.y 
+ ((knobRect.size.height -1) /2)))
+                                         radius:(knobRect.size.height -1) /2
+                                     startAngle:270
+                                       endAngle:90];
+
+        [_scrollerStroke set];
+        [knob fill];
+
+        knobRect.origin.x += 1;
+        knobRect.origin.y += 1;
+        knobRect.size.width -= 2;
+        knobRect.size.height -= 2;
+
+        knob = [[NSBezierPath alloc] init];
+
+        [knob appendBezierPathWithArcWithCenter:NSMakePoint(knobRect.origin.x 
+ ((knobRect.size.height - .5f) /2), (knobRect.origin.y + 
((knobRect.size.height -1) /2)))
+                                         radius:(knobRect.size.height -1) /2
+                                     startAngle:90
+                                       endAngle:270];
+
+        [knob appendBezierPathWithArcWithCenter:NSMakePoint((knobRect.origin.x 
+ knobRect.size.width) - ((knobRect.size.height - .5f) /2), (knobRect.origin.y 
+ ((knobRect.size.height -1) /2)))
+                                         radius:(knobRect.size.height -1) /2
+                                     startAngle:270
+                                       endAngle:90];
+
+        [_scrollerKnobGradient drawInBezierPath:knob angle:90];
+
+    }
+}
+
+- (void)drawArrow:(NSScrollerArrow)arrow highlightPart:(NSUInteger)part {
+
+    if (arrow == NSScrollerDecrementArrow) {
+
+        if (part == (NSUInteger)-1 || part == 0) {
+            [self drawDecrementArrow: NO];
+        } else {
+            [self drawDecrementArrow: YES];
+        }
+    }
+
+    if (arrow == NSScrollerIncrementArrow) {
+
+        if(part == 1 || part == (NSUInteger)-1) {
+
+            [self drawIncrementArrow: NO];
+        } else {
+
+            [self drawIncrementArrow: YES];
+        }
+    }
+}
+
+- (void)drawKnobSlotInRect:(NSRect)rect highlight:(BOOL)highlight {
+
+    if (![self isHoriz]) {
+
+        // Draw Knob Slot
+        [_scrollerTrackGradient drawInRect:rect angle:0];
+
+        if ([arrowPosition isEqualToString:@"DoubleMax"]) {
+
+            // Adjust rect height for top base
+            rect.size.height = 8;
+
+            // Draw Top Base
+            NSBezierPath *path = [[NSBezierPath alloc] init];
+            NSPoint basePoints[4];
+
+            [path 
appendBezierPathWithArcWithCenter:NSMakePoint(rect.size.width /2, 
rect.size.height + (rect.size.width /2) -5)
+                                             radius:(rect.size.width ) /2
+                                         startAngle:180
+                                           endAngle:0];
+
+            // Add the rest of the points
+            basePoints[3] = NSMakePoint( rect.origin.x, rect.origin.y + 
rect.size.height);
+            basePoints[2] = NSMakePoint( rect.origin.x, rect.origin.y);
+            basePoints[1] = NSMakePoint( rect.origin.x + rect.size.width, 
rect.origin.y);
+            basePoints[0] = NSMakePoint( rect.origin.x + rect.size.width, 
rect.origin.y + rect.size.height);
+
+            [path appendBezierPathWithPoints:basePoints count:4];
+
+            [_scrollerArrowNormalGradient drawInBezierPath:path angle:0];
+
+        } else if ([arrowPosition isEqualToString:@"None"]) {
+
+            // Adjust rect height for top base
+            NSRect topRect = rect;
+            topRect.size.height = 8;
+
+            // Draw Top Base
+            NSBezierPath *path = [[NSBezierPath alloc] init];
+            NSPoint basePoints[4];
+
+            [path 
appendBezierPathWithArcWithCenter:NSMakePoint(topRect.size.width /2, 
topRect.size.height + (topRect.size.width /2) -5)
+                                             radius:(topRect.size.width ) /2
+                                         startAngle:180
+                                           endAngle:0];
+
+            // Add the rest of the points
+            basePoints[3] = NSMakePoint( topRect.origin.x, topRect.origin.y + 
topRect.size.height);
+            basePoints[2] = NSMakePoint( topRect.origin.x, topRect.origin.y);
+            basePoints[1] = NSMakePoint( topRect.origin.x + 
topRect.size.width, topRect.origin.y);
+            basePoints[0] = NSMakePoint( topRect.origin.x + 
topRect.size.width, topRect.origin.y + topRect.size.height);
+
+            [path appendBezierPathWithPoints:basePoints count:4];
+
+            [_scrollerArrowNormalGradient drawInBezierPath:path angle:0];
+
+
+            // Draw Decrement Button
+            NSRect bottomRect = rect;
+            bottomRect.origin.y = rect.size.height - 4;
+            bottomRect.size.height = 4;
+
+            path = [[NSBezierPath alloc] init];
+
+            // Add Notch
+            [path 
appendBezierPathWithArcWithCenter:NSMakePoint((bottomRect.size.width ) /2, 
(bottomRect.origin.y  - ((bottomRect.size.width ) /2) + 1))
+                                             radius:(bottomRect.size.width ) /2
+                                         startAngle:0
+                                           endAngle:180];
+
+            // Add the rest of the points
+            basePoints[0] = NSMakePoint( bottomRect.origin.x, 
bottomRect.origin.y);
+            basePoints[1] = NSMakePoint( bottomRect.origin.x, 
bottomRect.origin.y + bottomRect.size.height);
+            basePoints[2] = NSMakePoint( bottomRect.origin.x + 
bottomRect.size.width, bottomRect.origin.y + bottomRect.size.height);
+            basePoints[3] = NSMakePoint( bottomRect.origin.x + 
bottomRect.size.width, bottomRect.origin.y);
+
+            // Add Points to Path
+            [path appendBezierPathWithPoints:basePoints count:4];
+
+            [_scrollerArrowNormalGradient drawInBezierPath:path angle:0];
+        }
+    } else {
+
+        // Draw Knob Slot
+        [_scrollerTrackGradient drawInRect:rect angle:90];
+
+        if ([arrowPosition isEqualToString:@"DoubleMax"]) {
+
+            // Adjust rect height for top base
+            rect.size.width = 8;
+
+            // Draw Top Base
+            NSBezierPath *path = [[NSBezierPath alloc] init];
+            NSPoint basePoints[4];
+
+            [path 
appendBezierPathWithArcWithCenter:NSMakePoint((rect.size.height /2) +5, 
rect.origin.y + (rect.size.height /2) )
+                                             radius:(rect.size.height ) /2
+                                         startAngle:90
+                                           endAngle:270];
+
+            // Add the rest of the points
+            basePoints[2] = NSMakePoint( rect.origin.x, rect.origin.y + 
rect.size.height);
+            basePoints[1] = NSMakePoint( rect.origin.x, rect.origin.y);
+            basePoints[0] = NSMakePoint( rect.origin.x + rect.size.width, 
rect.origin.y);
+            basePoints[3] = NSMakePoint( rect.origin.x + rect.size.width, 
rect.origin.y + rect.size.height);
+
+            [path appendBezierPathWithPoints:basePoints count:4];
+
+            [_scrollerArrowNormalGradient drawInBezierPath:path angle:0];
+        } else if ([arrowPosition isEqualToString:@"None"]) {
+
+            // Adjust rect height for top base
+            NSRect topRect = rect;
+            topRect.size.width = 8;
+
+            // Draw Top Base
+            NSBezierPath *path = [[NSBezierPath alloc] init];
+            NSPoint basePoints[4];
+
+            [path 
appendBezierPathWithArcWithCenter:NSMakePoint((topRect.size.height /2) +5, 
topRect.origin.y + (topRect.size.height /2) )
+                                             radius:(topRect.size.height ) /2
+                                         startAngle:90
+                                           endAngle:270];
+
+            // Add the rest of the points
+            basePoints[2] = NSMakePoint( topRect.origin.x, topRect.origin.y + 
topRect.size.height);
+            basePoints[1] = NSMakePoint( topRect.origin.x, topRect.origin.y);
+            basePoints[0] = NSMakePoint( topRect.origin.x + 
topRect.size.width, topRect.origin.y);
+            basePoints[3] = NSMakePoint( topRect.origin.x + 
topRect.size.width, topRect.origin.y + topRect.size.height);
+
+            [path appendBezierPathWithPoints:basePoints count:4];
+
+            [_scrollerArrowNormalGradient drawInBezierPath:path angle:0];
+
+            // Bottom Base
+            // Draw Decrement Button
+            NSRect bottomRect = rect;
+            bottomRect.origin.x = rect.size.width - 4;
+            bottomRect.size.width = 4;
+
+            path = [[NSBezierPath alloc] init];
+
+            // Add Notch
+            [path 
appendBezierPathWithArcWithCenter:NSMakePoint(bottomRect.origin.x - 
((bottomRect.size.height ) /2), (bottomRect.origin.y  + 
((bottomRect.size.height ) /2) ))
+                                             radius:(bottomRect.size.height ) 
/2
+                                         startAngle:270
+                                           endAngle:90];
+
+            // Add the rest of the points
+            basePoints[3] = NSMakePoint( bottomRect.origin.x - 
(((bottomRect.size.height ) /2) -1), bottomRect.origin.y);
+            basePoints[0] = NSMakePoint( bottomRect.origin.x - 
(((bottomRect.size.height ) /2) -1), bottomRect.origin.y + 
bottomRect.size.height);
+            basePoints[1] = NSMakePoint( bottomRect.origin.x + 
bottomRect.size.width, bottomRect.origin.y + bottomRect.size.height);
+            basePoints[2] = NSMakePoint( bottomRect.origin.x + 
bottomRect.size.width, bottomRect.origin.y);
+
+            // Add Points to Path
+            [path appendBezierPathWithPoints:basePoints count:4];
+
+            [_scrollerArrowNormalGradient drawInBezierPath:path angle:90];
+        }
+    }
+}
+
+- (void)drawDecrementArrow:(bool)highlighted {
+
+    if (![self isHoriz]) {
+
+        if ([arrowPosition isEqualToString:@"DoubleMax"]) {
+
+            // Draw Decrement Button
+            NSRect rect = [self rectForPart: NSScrollerDecrementLine];
+            NSBezierPath *path = [[NSBezierPath alloc] init];
+            NSPoint basePoints[4];
+
+            // Add Notch
+            [path 
appendBezierPathWithArcWithCenter:NSMakePoint((rect.size.width ) /2, 
(rect.origin.y  - ((rect.size.width ) /2) + 1))
+                                             radius:(rect.size.width ) /2
+                                         startAngle:0
+                                           endAngle:180];
+
+            // Add the rest of the points
+            basePoints[0] = NSMakePoint( rect.origin.x, rect.origin.y);
+            basePoints[1] = NSMakePoint( rect.origin.x, rect.origin.y + 
rect.size.height);
+            basePoints[2] = NSMakePoint( rect.origin.x + rect.size.width, 
rect.origin.y + rect.size.height);
+            basePoints[3] = NSMakePoint( rect.origin.x + rect.size.width, 
rect.origin.y);
+
+            // Add Points to Path
+            [path appendBezierPathWithPoints:basePoints count:4];
+
+            // Fill Path
+            if (!highlighted) {
+                [_scrollerArrowNormalGradient drawInBezierPath:path angle:0];
+            } else {
+                [_scrollerArrowPushedGradient drawInBezierPath:path angle:0];
+            }
+
+            // Create Arrow Glyph
+            NSBezierPath *arrow = [[NSBezierPath alloc] init];
+
+            NSPoint points[3];
+            points[0] = NSMakePoint( rect.size.width /2, rect.origin.y + 
(rect.size.height /2) -3);
+            points[1] = NSMakePoint( (rect.size.width /2) +3.5f, rect.origin.y 
+ (rect.size.height /2) +3);
+            points[2] = NSMakePoint( (rect.size.width /2) -3.5f, rect.origin.y 
+ (rect.size.height /2) +3);
+
+            [arrow appendBezierPathWithPoints:points count:3];
+
+            [_scrollerStroke set];
+            [arrow fill];
+
+            // Create Devider Line
+            [_scrollerStroke set];
+
+            [NSBezierPath strokeLineFromPoint:NSMakePoint(0, (rect.origin.y + 
rect.size.height) +.5f)
+                                      toPoint:NSMakePoint(rect.size.width, 
(rect.origin.y + rect.size.height) +.5f)];
+
+        } else if ([arrowPosition isEqualToString: @"Single"]) {
+
+            NSRect rect = [self rectForPart: NSScrollerDecrementLine];
+
+            NSBezierPath *path = [[NSBezierPath alloc] init];
+            NSPoint basePoints[4];
+
+            [path 
appendBezierPathWithArcWithCenter:NSMakePoint(rect.size.width /2, 
rect.size.height + (rect.size.width /2) -3)
+                                             radius:(rect.size.width ) /2
+                                         startAngle:180
+                                           endAngle:0];
+
+            // Add the rest of the points
+            basePoints[3] = NSMakePoint( rect.origin.x, rect.origin.y + 
rect.size.height);
+            basePoints[2] = NSMakePoint( rect.origin.x, rect.origin.y);
+            basePoints[1] = NSMakePoint( rect.origin.x + rect.size.width, 
rect.origin.y);
+            basePoints[0] = NSMakePoint( rect.origin.x + rect.size.width, 
rect.origin.y + rect.size.height);
+
+            [path appendBezierPathWithPoints: basePoints count: 4];
+
+            // Fill Path
+            if (!highlighted) {
+                [_scrollerArrowNormalGradient drawInBezierPath:path angle:0];
+            } else {
+
+                [_scrollerArrowPushedGradient drawInBezierPath:path angle:0];
+            }
+
+            // Create Arrow Glyph
+            NSBezierPath *arrow = [[NSBezierPath alloc] init];
+
+            NSPoint points[3];
+            points[0] = NSMakePoint( rect.size.width /2, rect.origin.y + 
(rect.size.height /2) -3);
+            points[1] = NSMakePoint( (rect.size.width /2) +3.5f, rect.origin.y 
+ (rect.size.height /2) +3);
+            points[2] = NSMakePoint( (rect.size.width /2) -3.5f, rect.origin.y 
+ (rect.size.height /2) +3);
+
+            [arrow appendBezierPathWithPoints:points count:3];
+
+            [_scrollerStroke set];
+            [arrow fill];
+        }
+    } else {
+
+        if ([arrowPosition isEqualToString: @"DoubleMax"]) {
+
+            // Draw Decrement Button
+            NSRect rect = [self rectForPart:NSScrollerDecrementLine];
+            NSBezierPath *path = [[NSBezierPath alloc] init];
+            NSPoint basePoints[4];
+
+            // Add Notch
+            [path appendBezierPathWithArcWithCenter:NSMakePoint(rect.origin.x 
- ((rect.size.height ) /2), (rect.origin.y  + ((rect.size.height ) /2) ))
+                                             radius:(rect.size.height ) /2
+                                         startAngle:270
+                                           endAngle:90];
+
+            // Add the rest of the points
+            basePoints[3] = NSMakePoint( rect.origin.x - (((rect.size.height ) 
/2) -1), rect.origin.y);
+            basePoints[0] = NSMakePoint( rect.origin.x - (((rect.size.height ) 
/2) -1), rect.origin.y + rect.size.height);
+            basePoints[1] = NSMakePoint( rect.origin.x + rect.size.width, 
rect.origin.y + rect.size.height);
+            basePoints[2] = NSMakePoint( rect.origin.x + rect.size.width, 
rect.origin.y);
+
+            // Add Points to Path
+            [path appendBezierPathWithPoints:basePoints count:4];
+
+            // Fill Path
+            if (!highlighted) {
+                [_scrollerArrowNormalGradient drawInBezierPath:path angle:90];
+            } else {
+                [_scrollerArrowPushedGradient drawInBezierPath:path angle:90];
+            }
+
+            // Create Arrow Glyph
+            NSBezierPath *arrow = [[NSBezierPath alloc] init];
+
+            NSPoint points[3];
+            points[0] = NSMakePoint( rect.origin.x + (rect.size.width /2) -3, 
rect.size.height /2);
+            points[1] = NSMakePoint( rect.origin.x + (rect.size.height /2) +3, 
(rect.size.height /2) +3.5f);
+            points[2] = NSMakePoint( rect.origin.x + (rect.size.height /2) +3, 
(rect.size.height /2) -3.5f);
+
+            [arrow appendBezierPathWithPoints:points count:3];
+
+            [_scrollerStroke set];
+            [arrow fill];
+
+            // Create Devider Line
+            [_scrollerStroke set];
+
+            [NSBezierPath strokeLineFromPoint:NSMakePoint(rect.origin.x + 
rect.size.width -.5f, rect.origin.y)
+                                      toPoint:NSMakePoint(rect.origin.x + 
rect.size.width -.5f, rect.origin.y + rect.size.height)];
+
+        } else if ([arrowPosition isEqualToString: @"Single"]) {
+
+            NSRect rect = [self rectForPart: NSScrollerDecrementLine];
+
+            NSBezierPath *path = [[NSBezierPath alloc] init];
+            NSPoint basePoints[4];
+
+            [path appendBezierPathWithArcWithCenter:NSMakePoint(rect.origin.x 
+ (rect.size.width -2) + ((rect.size.height ) /2), (rect.origin.y  + 
((rect.size.height ) /2) ))
+                                             radius:(rect.size.height ) /2
+                                         startAngle:90
+                                           endAngle:270];
+
+            // Add the rest of the points
+            basePoints[2] = NSMakePoint( rect.origin.x, rect.origin.y + 
rect.size.height);
+            basePoints[1] = NSMakePoint( rect.origin.x, rect.origin.y);
+            basePoints[0] = NSMakePoint( rect.origin.x + rect.size.width, 
rect.origin.y);
+            basePoints[3] = NSMakePoint( rect.origin.x + rect.size.width, 
rect.origin.y + rect.size.height);
+
+            [path appendBezierPathWithPoints: basePoints count: 4];
+
+            // Fill Path
+            if (!highlighted) {
+                [_scrollerArrowNormalGradient drawInBezierPath:path angle:90];
+            } else {
+                [_scrollerArrowPushedGradient drawInBezierPath:path angle:90];
+            }
+
+            // Create Arrow Glyph
+            NSBezierPath *arrow = [[NSBezierPath alloc] init];
+
+            NSPoint points[3];
+            points[0] = NSMakePoint( rect.origin.x + (rect.size.width /2) -3, 
rect.size.height /2);
+            points[1] = NSMakePoint( rect.origin.x + (rect.size.height /2) +3, 
(rect.size.height /2) +3.5f);
+            points[2] = NSMakePoint( rect.origin.x + (rect.size.height /2) +3, 
(rect.size.height /2) -3.5f);
+
+            [arrow appendBezierPathWithPoints:points count:3];
+
+            [_scrollerStroke set];
+            [arrow fill];
+        }
+    }
+}
+
+- (void)drawIncrementArrow:(bool)highlighted {
+
+    if (![self isHoriz]) {
+
+        if ([arrowPosition isEqualToString:@"DoubleMax"]) {
+
+            // Draw Increment Button
+            NSRect rect = [self rectForPart: NSScrollerIncrementLine];
+
+            if(!highlighted) {
+
+                [_scrollerArrowNormalGradient drawInRect:rect angle:0];
+            } else {
+
+                [_scrollerArrowPushedGradient drawInRect:rect angle:0];
+            }
+
+            // Create Arrow Glyph
+            NSBezierPath *arrow = [[NSBezierPath alloc] init];
+
+            NSPoint points[3];
+            points[0] = NSMakePoint( rect.size.width /2, rect.origin.y + 
(rect.size.height /2) +3);
+            points[1] = NSMakePoint( (rect.size.width /2) +3.5f, rect.origin.y 
+ (rect.size.height /2) -3);
+            points[2] = NSMakePoint( (rect.size.width /2) -3.5f, rect.origin.y 
+ (rect.size.height /2) -3);
+
+            [arrow appendBezierPathWithPoints: points count: 3];
+
+            [_scrollerStroke set];
+            [arrow fill];
+        } else if ([arrowPosition isEqualToString:@"Single"]) {
+
+            // Draw Decrement Button
+            NSRect rect = [self rectForPart: NSScrollerIncrementLine];
+            NSBezierPath *path = [[NSBezierPath alloc] init];
+            NSPoint basePoints[4];
+
+            // Add Notch
+            [path 
appendBezierPathWithArcWithCenter:NSMakePoint((rect.size.width ) /2, 
(rect.origin.y  - ((rect.size.width ) /2) + 2))
+                                             radius:(rect.size.width ) /2
+                                         startAngle:0
+                                           endAngle:180];
+
+            // Add the rest of the points
+            basePoints[0] = NSMakePoint( rect.origin.x, rect.origin.y);
+            basePoints[1] = NSMakePoint( rect.origin.x, rect.origin.y + 
rect.size.height);
+            basePoints[2] = NSMakePoint( rect.origin.x + rect.size.width, 
rect.origin.y + rect.size.height);
+            basePoints[3] = NSMakePoint( rect.origin.x + rect.size.width, 
rect.origin.y);
+
+            // Add Points to Path
+            [path appendBezierPathWithPoints:basePoints count:4];
+
+            // Fill Path
+            if (!highlighted) {
+                [_scrollerArrowNormalGradient drawInBezierPath:path angle:0];
+            } else {
+                [_scrollerArrowPushedGradient drawInBezierPath:path angle:0];
+            }
+
+            // Create Arrow Glyph
+            NSBezierPath *arrow = [[NSBezierPath alloc] init];
+
+            NSPoint points[3];
+            points[0] = NSMakePoint( rect.size.width /2, rect.origin.y + 
(rect.size.height /2) +3);
+            points[1] = NSMakePoint( (rect.size.width /2) +3.5f, rect.origin.y 
+ (rect.size.height /2) -3);
+            points[2] = NSMakePoint( (rect.size.width /2) -3.5f, rect.origin.y 
+ (rect.size.height /2) -3);
+
+            [arrow appendBezierPathWithPoints:points count:3];
+
+            [_scrollerStroke set];
+            [arrow fill];
+        }
+    } else {
+
+        if ([arrowPosition isEqualToString:@"DoubleMax"]) {
+
+            // Draw Increment Button
+            NSRect rect = [self rectForPart:NSScrollerIncrementLine];
+
+            if (!highlighted) {
+                [_scrollerArrowNormalGradient drawInRect:rect angle:90];
+            } else {
+                [_scrollerArrowPushedGradient drawInRect:rect angle:90];
+            }
+
+            // Create Arrow Glyph
+            NSBezierPath *arrow = [[NSBezierPath alloc] init];
+
+            NSPoint points[3];
+            points[0] = NSMakePoint( rect.origin.x + (rect.size.width /2) +3, 
rect.size.height /2);
+            points[1] = NSMakePoint( rect.origin.x + (rect.size.height /2) -3, 
(rect.size.height /2) +3.5f);
+            points[2] = NSMakePoint( rect.origin.x + (rect.size.height /2) -3, 
(rect.size.height /2) -3.5f);
+
+            [arrow appendBezierPathWithPoints:points count:3];
+
+            [_scrollerStroke set];
+            [arrow fill];
+        } else if ([arrowPosition isEqualToString:@"Single"]) {
+
+            // Draw Decrement Button
+            NSRect rect = [self rectForPart:NSScrollerIncrementLine];
+            NSBezierPath *path = [[NSBezierPath alloc] init];
+            NSPoint basePoints[4];
+
+            // Add Notch
+            [path appendBezierPathWithArcWithCenter:NSMakePoint(rect.origin.x 
- (((rect.size.height ) /2) -2), (rect.origin.y  + ((rect.size.height ) /2) ))
+                                             radius:(rect.size.height ) /2
+                                         startAngle:270
+                                           endAngle:90];
+
+            // Add the rest of the points
+            basePoints[3] = NSMakePoint( rect.origin.x - (((rect.size.height ) 
/2) -1), rect.origin.y);
+            basePoints[0] = NSMakePoint( rect.origin.x - (((rect.size.height ) 
/2) -1), rect.origin.y + rect.size.height);
+            basePoints[1] = NSMakePoint( rect.origin.x + rect.size.width, 
rect.origin.y + rect.size.height);
+            basePoints[2] = NSMakePoint( rect.origin.x + rect.size.width, 
rect.origin.y);
+
+            // Add Points to Path
+            [path appendBezierPathWithPoints:basePoints count:4];
+
+            // Fill Path
+            if (!highlighted) {
+                [_scrollerArrowNormalGradient drawInBezierPath:path angle:0];
+            } else {
+                [_scrollerArrowPushedGradient drawInBezierPath:path angle:0];
+            }
+
+            // Create Arrow Glyph
+            NSBezierPath *arrow = [[NSBezierPath alloc] init];
+
+            NSPoint points[3];
+            points[0] = NSMakePoint( rect.origin.x + (rect.size.width /2) +3, 
rect.size.height /2);
+            points[1] = NSMakePoint( rect.origin.x + (rect.size.height /2) -3, 
(rect.size.height /2) +3.5f);
+            points[2] = NSMakePoint( rect.origin.x + (rect.size.height /2) -3, 
(rect.size.height /2) -3.5f);
+
+            [arrow appendBezierPathWithPoints:points count:3];
+
+            [_scrollerStroke set];
+            [arrow fill];
+        }
+    }
+}
+
+#pragma mark -
+#pragma mark Helper Methods
+- (NSUsableScrollerParts)usableParts {
+
+    if ([self arrowsPosition] != NSScrollerArrowsNone) {
+
+        if ([self isHoriz]) {
+
+            // Now Figure out if we can actually show all parts
+            CGFloat arrowSpace = NSWidth([self rectForPart: 
NSScrollerIncrementLine]) + NSWidth([self rectForPart: 
NSScrollerDecrementLine]) +
+                NSMidY([self rectForPart: NSScrollerIncrementLine]);
+            CGFloat knobSpace = NSWidth([self rectForPart: NSScrollerKnob]);
+
+            if ((arrowSpace + knobSpace) > NSWidth([self bounds])) {
+
+                if (arrowSpace > NSWidth([self bounds])) {
+                    return NSNoScrollerParts;
+                } else {
+                    return NSOnlyScrollerArrows;
+                }
+            }
+
+        } else {
+
+            // Now Figure out if we can actually show all parts
+            CGFloat arrowSpace = NSHeight([self rectForPart: 
NSScrollerIncrementLine]) + NSHeight([self rectForPart: 
NSScrollerDecrementLine]) +
+                NSMidX([self rectForPart: NSScrollerIncrementLine]);
+            CGFloat knobSpace = NSHeight([self rectForPart: NSScrollerKnob]);
+
+            if ((arrowSpace + knobSpace) > NSHeight([self bounds])) {
+
+                if (arrowSpace > NSHeight([self bounds])) {
+                    return NSNoScrollerParts;
+                } else {
+                    return NSOnlyScrollerArrows;
+                }
+            }
+        }
+    }
+
+    return NSAllScrollerParts;
+}
+
+- (bool)isHoriz {
+    if ([self bounds].size.width > [self bounds].size.height) {
+        return YES;
+    }
+    return NO;
+}
+
+@end


_______________________________________________
vlc-commits mailing list
[email protected]
https://mailman.videolan.org/listinfo/vlc-commits

Reply via email to