VLCHUDTextFieldCell.m 4.21 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143
/*****************************************************************************
 * VLCHUDTextFieldCell.m: Custom textfield cell UI for dark HUD Panels
 *****************************************************************************
 * Copyright (C) 2016 VLC authors and VideoLAN
 * $Id$
 *
 * Authors: Marvin Scholz <epirat07 -at- gmail -dot- com>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
 *****************************************************************************/

#import "VLCHUDTextFieldCell.h"

@implementation VLCHUDTextFieldCell {
    BOOL myCustomDrawsBackground;
    BOOL myCustomDrawsBorder;
}

- (instancetype) initWithCoder:(NSCoder *)coder
{
    self = [super initWithCoder:coder];
    if (self) {
        [self setupSelf];
    }

    return self;
}

- (instancetype) initTextCell:(NSString *)aString
{
    self = [super initTextCell:aString];
    if (self) {
        [self setupSelf];
    }

    return self;
}

- (instancetype) initImageCell:(NSImage *)image
{
    self = [super initImageCell:image];
    if (self) {
        [self setupSelf];
    }

    return self;
}

- (void)setupSelf
{
    myCustomDrawsBorder = self.bordered || self.bezeled;
    myCustomDrawsBackground = self.drawsBackground;
    _enabledTextColor  = [NSColor greenColor];
    _disabledTextColor = [NSColor blueColor];
    _enabledBorderColor = [NSColor yellowColor];
    _disabledBorderColor = [NSColor greenColor];
    _enabledBackgroundColor = [NSColor purpleColor];
    _disabledBackgroundColor = [NSColor blackColor];
    _borderWidth = 1.0;

    /* Disable border, enable bezeled, disable background
     * in case we need background (TextField instead of Label)
     *
     * This is kind of redundant, as enabling bezeled will
     * disable bordered anyway, but I've done it for clarity.
     *
     * ORDER IS IMPORTANT!
     * Disabling background and enabling bezeled afterwards
     * will re-enable background!
     */
    if (self.drawsBackground) {
        [self setBordered:NO];
        [self setBezeled:YES];
        [self setDrawsBackground:NO];
    } else {
        [self setBordered:NO];
        [self setBezeled:NO];
        [self setDrawsBackground:NO];
    }
}

- (NSText *)setUpFieldEditorAttributes:(NSText *)text
{
    NSText *newText = [super setUpFieldEditorAttributes:text];

    // Set the text color for entered text
    [newText setTextColor:_enabledTextColor];

    // Set the cursor color
    [(NSTextView *)newText setInsertionPointColor:_enabledTextColor];
    return newText;
}


- (void)drawWithFrame:(NSRect)cellFrame inView:(NSView *)controlView
{
    NSRect borderRect = NSInsetRect(cellFrame, _borderWidth, _borderWidth);

    if (self.enabled) {
        [_enabledBackgroundColor setFill];
        [_enabledBorderColor setStroke];
        [self setTextColor:_enabledTextColor];
    } else {
        [_disabledBackgroundColor setFill];
        [_disabledBorderColor setStroke];
        [self setTextColor:_disabledTextColor];
    }

    // Draw background
    if (myCustomDrawsBackground) {
        NSRectFill(cellFrame);
    }

    // Draw Border
    if (myCustomDrawsBorder) {
        NSBezierPath *borderPath = [NSBezierPath bezierPathWithRect:borderRect];
        [borderPath setLineWidth:_borderWidth];
        [borderPath stroke];
    }

    /* Call draw interior to position text correctly
     *
     * For this to work, bezeled has to be enabled and drawsBackground
     * needs to be disabled, else we still get a background drawn.
     * When using bordered instead of bezeled, we get wrong cursor position.
     */
    [self drawInteriorWithFrame:cellFrame inView:controlView];
}


@end