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
