vlc | branch: master | Marvin Scholz <[email protected]> | Tue Jun 13 23:26:55 
2017 +0200| [4872354cac250d2512d51a1c246f615196792a13] | committer: Marvin 
Scholz

macOS: Add VLCHUDSegmentedCell

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

 .../package/macosx/VLC.xcodeproj/project.pbxproj   |   6 +
 modules/gui/macosx/Makefile.am                     |   1 +
 modules/gui/macosx/VLCHUDSegmentedCell.h           |  50 +++
 modules/gui/macosx/VLCHUDSegmentedCell.m           | 338 +++++++++++++++++++++
 4 files changed, 395 insertions(+)

diff --git a/extras/package/macosx/VLC.xcodeproj/project.pbxproj 
b/extras/package/macosx/VLC.xcodeproj/project.pbxproj
index f902ca7019..8a09ae8089 100644
--- a/extras/package/macosx/VLC.xcodeproj/project.pbxproj
+++ b/extras/package/macosx/VLC.xcodeproj/project.pbxproj
@@ -83,6 +83,7 @@
                6BBB05DA1EEFEA29003A1019 /* VLCHUDOutlineView.m in Sources */ = 
{isa = PBXBuildFile; fileRef = 6BBB05D91EEFEA29003A1019 /* VLCHUDOutlineView.m 
*/; };
                6BBB05DD1EEFEADF003A1019 /* VLCHUDTableHeaderCell.m in Sources 
*/ = {isa = PBXBuildFile; fileRef = 6BBB05DC1EEFEADF003A1019 /* 
VLCHUDTableHeaderCell.m */; };
                6BBB05E01EEFF165003A1019 /* VLCHUDTableCornerView.m in Sources 
*/ = {isa = PBXBuildFile; fileRef = 6BBB05DF1EEFF165003A1019 /* 
VLCHUDTableCornerView.m */; };
+               6BBB05E31EF08181003A1019 /* VLCHUDSegmentedCell.m in Sources */ 
= {isa = PBXBuildFile; fileRef = 6BBB05E21EF08181003A1019 /* 
VLCHUDSegmentedCell.m */; };
                6BF093F91EE0182B0049D8B0 /* VLCTimeField.m in Sources */ = {isa 
= PBXBuildFile; fileRef = 6BF093F81EE0182B0049D8B0 /* VLCTimeField.m */; };
 /* End PBXBuildFile section */
 
@@ -690,6 +691,8 @@
                6BBB05DC1EEFEADF003A1019 /* VLCHUDTableHeaderCell.m */ = {isa = 
PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path 
= VLCHUDTableHeaderCell.m; sourceTree = "<group>"; };
                6BBB05DE1EEFF165003A1019 /* VLCHUDTableCornerView.h */ = {isa = 
PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = 
VLCHUDTableCornerView.h; sourceTree = "<group>"; };
                6BBB05DF1EEFF165003A1019 /* VLCHUDTableCornerView.m */ = {isa = 
PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path 
= VLCHUDTableCornerView.m; sourceTree = "<group>"; };
+               6BBB05E11EF08181003A1019 /* VLCHUDSegmentedCell.h */ = {isa = 
PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = 
VLCHUDSegmentedCell.h; sourceTree = "<group>"; };
+               6BBB05E21EF08181003A1019 /* VLCHUDSegmentedCell.m */ = {isa = 
PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path 
= VLCHUDSegmentedCell.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>"; };
@@ -1611,6 +1614,8 @@
                                6BBB05DF1EEFF165003A1019 /* 
VLCHUDTableCornerView.m */,
                                6BBB05DB1EEFEADF003A1019 /* 
VLCHUDTableHeaderCell.h */,
                                6BBB05DC1EEFEADF003A1019 /* 
VLCHUDTableHeaderCell.m */,
+                               6BBB05E11EF08181003A1019 /* 
VLCHUDSegmentedCell.h */,
+                               6BBB05E21EF08181003A1019 /* 
VLCHUDSegmentedCell.m */,
                        );
                        name = "HUD UI Classes";
                        sourceTree = "<group>";
@@ -1927,6 +1932,7 @@
                                1C3113E71E508C6900D4DD76 /* VLCPlaylistView.m 
in Sources */,
                                1C3113E91E508C6900D4DD76 /* 
VLCScrollingClipView.m in Sources */,
                                1C3113EB1E508C6900D4DD76 /* VLCStatusBarIcon.m 
in Sources */,
+                               6BBB05E31EF08181003A1019 /* 
VLCHUDSegmentedCell.m in Sources */,
                                1C3113ED1E508C6900D4DD76 /* 
VLCTimeSelectionPanelController.m in Sources */,
                        );
                        runOnlyForDeploymentPostprocessing = 0;
diff --git a/modules/gui/macosx/Makefile.am b/modules/gui/macosx/Makefile.am
index 59a73a8219..4e074ecd05 100644
--- a/modules/gui/macosx/Makefile.am
+++ b/modules/gui/macosx/Makefile.am
@@ -81,6 +81,7 @@ libmacosx_plugin_la_SOURCES = \
        gui/macosx/VLCHUDOutlineView.h gui/macosx/VLCHUDOutlineView.m \
        gui/macosx/VLCHUDTableCornerView.h gui/macosx/VLCHUDTableCornerView.m \
        gui/macosx/VLCHUDTableHeaderCell.h gui/macosx/VLCHUDTableHeaderCell.m \
+       gui/macosx/VLCHUDSegmentedCell.h gui/macosx/VLCHUDSegmentedCell.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/VLCHUDSegmentedCell.h 
b/modules/gui/macosx/VLCHUDSegmentedCell.h
new file mode 100644
index 0000000000..5899d1ca06
--- /dev/null
+++ b/modules/gui/macosx/VLCHUDSegmentedCell.h
@@ -0,0 +1,50 @@
+//
+//  VLCHUDSegmentedCell.h
+//  BGHUDAppKit
+//
+//  Created by BinaryGod on 7/1/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.
+
+#import <Cocoa/Cocoa.h>
+
+@interface VLCHUDSegmentedCell : NSSegmentedCell
+
+@property (strong) NSShadow *dropShadow;
+@property (strong) NSColor *strokeColor;
+@property (strong) NSGradient *highlightGradient;
+@property (strong) NSGradient *normalGradient;
+@property (strong) NSGradient *disabledNormalGradient;
+@property (strong) NSColor *cellTextColor;
+@property (strong) NSColor *disabledCellTextColor;
+
+-(void)drawInteriorForSegment:(NSInteger)segment withFrame:(NSRect)rect;
+-(BOOL)hasText;
+
+@end
diff --git a/modules/gui/macosx/VLCHUDSegmentedCell.m 
b/modules/gui/macosx/VLCHUDSegmentedCell.m
new file mode 100644
index 0000000000..3051f12fcc
--- /dev/null
+++ b/modules/gui/macosx/VLCHUDSegmentedCell.m
@@ -0,0 +1,338 @@
+//
+//  VLCHUDSegmentedCell.m
+//  BGHUDAppKit
+//
+//  Created by BinaryGod on 7/1/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.
+
+#import "VLCHUDSegmentedCell.h"
+
+@interface NSSegmentedCell (private)
+-(NSRect)rectForSegment:(NSInteger)segment inFrame:(NSRect)frame;
+@end
+
+@implementation VLCHUDSegmentedCell
+
+- (instancetype)initWithCoder:(NSCoder *)decoder
+{
+
+    self = [super initWithCoder:decoder];
+
+    if (self) {
+        _dropShadow = [[NSShadow alloc] init];
+        [_dropShadow setShadowColor:[NSColor blackColor]];
+        [_dropShadow setShadowBlurRadius:2];
+        [_dropShadow setShadowOffset:NSMakeSize(0, -1)];
+
+        _strokeColor = [NSColor colorWithDeviceRed:0.749f green:0.761f 
blue:0.788f alpha:1.0f];
+        _highlightGradient = [[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]];
+        _normalGradient = [[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]];
+        _disabledNormalGradient = [[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]];
+        _cellTextColor = [NSColor whiteColor];
+        _disabledCellTextColor = [NSColor colorWithDeviceRed:1 green:1 blue:1 
alpha:0.5f];
+    }
+
+    return self;
+}
+
+-(NSSegmentStyle)segmentStyle {
+
+    return [super segmentStyle];
+}
+
+-(void)setSegmentStyle:(NSSegmentStyle) style {
+
+    if(style == NSSegmentStyleSmallSquare || style == NSSegmentStyleRounded) {
+
+        [super setSegmentStyle: style];
+    }
+}
+
+- (void)drawWithFrame:(NSRect)frame inView:(NSView *)view {
+
+    NSBezierPath *border;
+
+    switch ([self segmentStyle]) {
+        default: // Silence uninitialized variable warnings
+        case NSSegmentStyleSmallSquare:
+
+            //Adjust frame for shadow
+            frame.origin.x += 1.5f;
+            frame.origin.y += .5f;
+            frame.size.width -= 3;
+            frame.size.height -= 3;
+
+            border = [[NSBezierPath alloc] init];
+            [border appendBezierPathWithRect: frame];
+
+            break;
+
+        case NSSegmentStyleRounded: //NSSegmentStyleTexturedRounded:
+
+            //Adjust frame for shadow
+            frame.origin.x += 1.5f;
+            frame.origin.y += .5f;
+            frame.size.width -= 3;
+            frame.size.height -= 3;
+
+            border = [[NSBezierPath alloc] init];
+
+            [border appendBezierPathWithRoundedRect: frame
+                                            xRadius: 4.0f yRadius: 4.0f];
+            break;
+    }
+
+    //Setup to Draw Border
+    [NSGraphicsContext saveGraphicsState];
+
+    //Set Shadow + Border Color
+    if([self isEnabled])
+    {
+        [_dropShadow set];
+    }
+    [_strokeColor set];
+
+    //Draw Border + Shadow
+    [border stroke];
+
+    [NSGraphicsContext restoreGraphicsState];
+
+    int segCount = 0;
+
+    while (segCount <= [self segmentCount] -1) {
+
+        [self drawSegment: segCount inFrame: frame withView: view];
+        segCount++;
+    }
+}
+
+- (void)drawSegment:(NSInteger)segment inFrame:(NSRect)frame withView:(NSView 
*)view {
+
+    //Calculate rect for this segment
+    NSRect fillRect = [self rectForSegment: segment inFrame: frame];
+    NSBezierPath *fillPath;
+
+    switch ([self segmentStyle]) {
+        default: // Silence uninitialized variable warnings
+        case NSSegmentStyleSmallSquare:
+
+            if(segment == ([self segmentCount] -1)) {
+
+                if(![self hasText]) { fillRect.size.width -= 3; }
+            }
+
+            fillPath = [[NSBezierPath alloc] init];
+            [fillPath appendBezierPathWithRect: fillRect];
+
+            break;
+
+        case NSSegmentStyleRounded: //NSSegmentStyleTexturedRounded:
+
+            //If this is the first segment, draw rounded corners
+            if(segment == 0) {
+
+                fillPath = [[NSBezierPath alloc] init];
+
+                [fillPath appendBezierPathWithRoundedRect: fillRect xRadius: 3 
yRadius: 3];
+
+                //Setup our joining rect
+                NSRect joinRect = fillRect;
+                joinRect.origin.x += 4;
+                joinRect.size.width -= 4;
+
+                [fillPath appendBezierPathWithRect: joinRect];
+
+                //If this is the last segment, draw rounded corners
+            } else if (segment == ([self segmentCount] -1)) {
+
+                fillPath = [[NSBezierPath alloc] init];
+
+                if(![self hasText]) { fillRect.size.width -= 3; }
+
+                [fillPath appendBezierPathWithRoundedRect: fillRect xRadius: 3 
yRadius: 3];
+
+                //Setup our joining rect
+                NSRect joinRect = fillRect;
+                joinRect.size.width -= 4;
+
+                [fillPath appendBezierPathWithRect: joinRect];
+
+            } else {
+                NSAssert(segment != 0 && segment != ([self segmentCount] -1), 
@"should be a middle segment");
+                fillPath = [[NSBezierPath alloc] init];
+                [fillPath appendBezierPathWithRect: fillRect];
+            }
+
+            break;
+    }
+
+    //Fill our pathss
+
+    NSGradient *gradient = nil;
+
+    if([self isEnabled])
+    {
+        if([self selectedSegment] == segment) {
+
+            gradient = _highlightGradient;
+        } else {
+
+            gradient = _normalGradient;
+        }
+    }
+    else {
+        gradient = _disabledNormalGradient;
+    }
+
+    [gradient drawInBezierPath: fillPath angle: 90];
+
+    //Draw Segment dividers ONLY if they are
+    //inside segments
+    if(segment != ([self segmentCount] -1)) {
+
+        [_strokeColor set];
+        [NSBezierPath strokeLineFromPoint: NSMakePoint(fillRect.origin.x + 
fillRect.size.width , fillRect.origin.y)
+                                  toPoint: NSMakePoint(fillRect.origin.x + 
fillRect.size.width, fillRect.origin.y + fillRect.size.height)];
+    }
+
+    [self drawInteriorForSegment: segment withFrame: fillRect];
+}
+
+-(void)drawInteriorForSegment:(NSInteger)segment withFrame:(NSRect)rect {
+
+    NSAttributedString *newTitle;
+
+    //if([self labelForSegment: segment] != nil) {
+
+    NSMutableDictionary *textAttributes = [[NSMutableDictionary alloc] 
initWithCapacity: 0];
+
+    [textAttributes setValue: [NSFont controlContentFontOfSize: [NSFont 
systemFontSizeForControlSize: [self controlSize]]] forKey: NSFontAttributeName];
+    if([self isEnabled])
+    {
+        [textAttributes setValue:_cellTextColor forKey: 
NSForegroundColorAttributeName];
+    }
+    else {
+        [textAttributes setValue:_disabledCellTextColor forKey: 
NSForegroundColorAttributeName];
+    }
+
+
+    if([self labelForSegment: segment]) {
+
+        newTitle = [[NSAttributedString alloc] initWithString: [self 
labelForSegment: segment] attributes: textAttributes];
+    } else {
+
+        newTitle = [[NSAttributedString alloc] initWithString: @"" attributes: 
textAttributes];
+    }
+    //}
+
+    NSRect textRect = rect;
+    NSRect imageRect = rect;
+
+    if([super imageForSegment: segment] != nil) {
+
+        NSImage *image = [self imageForSegment: segment];
+        [image setFlipped: YES];
+
+        if([self imageScalingForSegment: segment] == 
NSImageScaleProportionallyDown) {
+
+            CGFloat resizeRatio = (rect.size.height - 4) / [image size].height;
+
+            [image setScalesWhenResized: YES];
+            [image setSize: NSMakeSize([image size].width * resizeRatio, 
rect.size.height -4)];
+        }
+
+        if([self labelForSegment: segment] != nil && ![[self labelForSegment: 
segment] isEqualToString: @""]) {
+
+            imageRect.origin.y += (NSMidY(rect) - ([image size].height /2));
+            imageRect.origin.x += (NSMidX(rect) - (([image size].width + 
[newTitle size].width + 5) /2));
+            imageRect.size.height = [image size].height;
+            imageRect.size.width = [image size].width;
+
+            textRect.origin.y += (NSMidY(rect) - ([newTitle size].height /2));
+            textRect.origin.x += imageRect.origin.x + [image size].width + 5;
+            textRect.size.height = [newTitle size].height;
+            textRect.size.width = [newTitle size].width;
+            
+            [image drawInRect: imageRect fromRect: NSZeroRect operation: 
NSCompositeSourceAtop fraction: 0.5f];
+            [newTitle drawInRect: textRect];
+            
+        } else {
+            
+            //Draw Image Alone
+            imageRect.origin.y += (NSMidY(rect) - ([image size].height /2));
+            imageRect.origin.x += (NSMidX(rect) - ([image size].width /2));
+            imageRect.size.height = [image size].height;
+            imageRect.size.width = [image size].width;
+            
+            [image drawInRect: imageRect fromRect: NSZeroRect operation: 
NSCompositeSourceAtop fraction:0.5f];
+        }
+    } else {
+        
+        textRect.origin.y += (NSMidY(rect) - ([newTitle size].height /2));
+        textRect.origin.x += (NSMidX(rect) - ([newTitle size].width /2));
+        textRect.size.height = [newTitle size].height;
+        textRect.size.width = [newTitle size].width;
+        
+        if(textRect.origin.x < 3) { textRect.origin.x = 3; }
+        
+        [newTitle drawInRect: textRect];
+    }
+}
+
+-(BOOL)hasText {
+    
+    int i = 0;
+    BOOL flag = NO;
+    
+    while(i <= [self segmentCount] -1) {
+        
+        if([self labelForSegment: i] != nil && ![[self labelForSegment: i] 
isEqualToString: @""]) {
+            
+            flag = YES;
+        }
+        i++;
+    }
+    
+    return flag;
+}
+
+- (BOOL)_canAnimate {
+    
+    return NO;
+}
+
+- (BOOL)_isSliderStyle {
+    return NO;
+}
+
+@end

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

Reply via email to