Kateryna Kostiuk | 958cd07 | 2017-07-14 15:56:35 -0400 | [diff] [blame] | 1 | /* |
Sébastien Blin | 029ffa8 | 2019-01-02 17:43:48 -0500 | [diff] [blame] | 2 | * Copyright (C) 2017-2019 Savoir-faire Linux Inc. |
Kateryna Kostiuk | 958cd07 | 2017-07-14 15:56:35 -0400 | [diff] [blame] | 3 | * Author: Kateryna Kostiuk <kateryna.kostiuk@savoirfairelinux.com> |
| 4 | * |
| 5 | * This program is free software; you can redistribute it and/or modify |
| 6 | * it under the terms of the GNU General Public License as published by |
| 7 | * the Free Software Foundation; either version 3 of the License, or |
| 8 | * (at your option) any later version. |
| 9 | * |
| 10 | * This program is distributed in the hope that it will be useful, |
| 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| 13 | * GNU General Public License for more details. |
| 14 | * |
| 15 | * You should have received a copy of the GNU General Public License |
| 16 | * along with this program; if not, write to the Free Software |
| 17 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |
| 18 | */ |
| 19 | |
| 20 | #import "HoverButton.h" |
| 21 | #import "NSColor+RingTheme.h" |
| 22 | |
| 23 | @implementation HoverButton |
Kateryna Kostiuk | 958cd07 | 2017-07-14 15:56:35 -0400 | [diff] [blame] | 24 | -(void) awakeFromNib { |
| 25 | [super awakeFromNib]; |
Kateryna Kostiuk | e28a038 | 2019-10-25 16:29:08 -0400 | [diff] [blame^] | 26 | [self updateParameters]; |
Kateryna Kostiuk | 958cd07 | 2017-07-14 15:56:35 -0400 | [diff] [blame] | 27 | } |
| 28 | |
Kateryna Kostiuk | 1f8c125 | 2018-07-30 18:18:57 -0400 | [diff] [blame] | 29 | -(instancetype)initWithFrame:(NSRect)frameRect { |
| 30 | self = [super initWithFrame: frameRect]; |
Kateryna Kostiuk | e28a038 | 2019-10-25 16:29:08 -0400 | [diff] [blame^] | 31 | [self updateParameters]; |
Kateryna Kostiuk | 1f8c125 | 2018-07-30 18:18:57 -0400 | [diff] [blame] | 32 | return self; |
| 33 | } |
| 34 | |
Kateryna Kostiuk | e28a038 | 2019-10-25 16:29:08 -0400 | [diff] [blame^] | 35 | -(void)updateParameters { |
| 36 | if(!self.imageHoverLightColor) { |
| 37 | self.imageHoverLightColor = self.imageHoverColor ? self.imageHoverColor : self.imageLightColor; |
| 38 | } |
| 39 | if(!self.imageHoverDarkColor) { |
| 40 | self.imageHoverDarkColor = self.imageHoverColor ? self.imageHoverColor : self.imageDarkColor; |
| 41 | } |
| 42 | self.imageHoverColor = self.isDarkMode ? self.imageHoverDarkColor : self.imageHoverLightColor; |
| 43 | |
| 44 | if(!self.hoverLightColor) { |
| 45 | self.hoverLightColor = self.hoverColor ? self.hoverColor : self.bgColor; |
| 46 | } |
| 47 | if(!self.hoverDarkColor) { |
| 48 | self.hoverDarkColor = self.bgColor; |
| 49 | } |
| 50 | self.hoverColor = self.isDarkMode ? self.hoverDarkColor : self.hoverLightColor; |
| 51 | if(!self.mouseOutsideLightColor) { |
| 52 | self.mouseOutsideLightColor = self.mouseOutsideColor ? self.mouseOutsideColor : self.bgColor; |
| 53 | } |
| 54 | if(!self.mouseOutsideDarkColor) { |
| 55 | self.mouseOutsideDarkColor = self.bgColor; |
| 56 | } |
| 57 | self.mouseOutsideColor = self.isDarkMode ? self.mouseOutsideDarkColor : self.mouseOutsideLightColor; |
| 58 | if(self.moiuseOutsideImageLightColor) { |
| 59 | self.moiuseOutsideImageLightColor = self.moiuseOutsideImageColor ? self.moiuseOutsideImageColor : self.imageLightColor; |
| 60 | } |
| 61 | if(!self.moiuseOutsideImageDarkColor) { |
| 62 | self.moiuseOutsideImageDarkColor = self.moiuseOutsideImageColor ? self.moiuseOutsideImageColor : self.imageDarkColor; |
| 63 | } |
| 64 | self.moiuseOutsideImageColor = self.isDarkMode ? self.moiuseOutsideImageDarkColor : self.moiuseOutsideImageLightColor; |
| 65 | } |
| 66 | |
Kateryna Kostiuk | 958cd07 | 2017-07-14 15:56:35 -0400 | [diff] [blame] | 67 | -(void)mouseEntered:(NSEvent *)theEvent { |
Kateryna Kostiuk | 88a6ee8 | 2019-09-10 17:55:08 -0400 | [diff] [blame] | 68 | if (self.animating) { |
| 69 | [self stopBlinkAnimation]; |
| 70 | self.animating = true; |
| 71 | } |
Kateryna Kostiuk | db95b47 | 2018-04-17 16:35:57 -0400 | [diff] [blame] | 72 | if(self.isEnabled) { |
| 73 | self.bgColor = self.hoverColor; |
| 74 | } |
Kateryna Kostiuk | 88a6ee8 | 2019-09-10 17:55:08 -0400 | [diff] [blame] | 75 | if(self.imageHoverColor) { |
| 76 | self.imageColor = self.imageHoverColor; |
| 77 | } |
Kateryna Kostiuk | e28a038 | 2019-10-25 16:29:08 -0400 | [diff] [blame^] | 78 | if (self.imageIncreaseOnHover && self.enabled) { |
Kateryna Kostiuk | 88a6ee8 | 2019-09-10 17:55:08 -0400 | [diff] [blame] | 79 | self.imageInsets -= self.imageIncreaseOnHover; |
| 80 | } |
Kateryna Kostiuk | e28a038 | 2019-10-25 16:29:08 -0400 | [diff] [blame^] | 81 | if (self.textIncreaseOnHover && self.enabled && self.fontSize) { |
| 82 | self.fontSize += self.textIncreaseOnHover; |
| 83 | } |
Kateryna Kostiuk | 958cd07 | 2017-07-14 15:56:35 -0400 | [diff] [blame] | 84 | [super setNeedsDisplay:YES]; |
| 85 | [super mouseEntered:theEvent]; |
| 86 | } |
| 87 | |
| 88 | -(void)mouseExited:(NSEvent *)theEvent { |
| 89 | self.bgColor = self.mouseOutsideColor; |
Kateryna Kostiuk | 88a6ee8 | 2019-09-10 17:55:08 -0400 | [diff] [blame] | 90 | if (self.animating) { |
| 91 | [self startBlinkAnimationfrom:[NSColor buttonBlinkColorColor] to:[NSColor whiteColor] scaleFactor: 1.0 duration: 1.5]; |
| 92 | } |
| 93 | if(self.imagePressedColor && self.pressed) { |
| 94 | self.imageColor = self.imagePressedColor; |
| 95 | } else if ( self.moiuseOutsideImageColor) { |
| 96 | self.imageColor = self.moiuseOutsideImageColor; |
| 97 | } |
Kateryna Kostiuk | e28a038 | 2019-10-25 16:29:08 -0400 | [diff] [blame^] | 98 | if (self.imageIncreaseOnHover && self.enabled) { |
Kateryna Kostiuk | 88a6ee8 | 2019-09-10 17:55:08 -0400 | [diff] [blame] | 99 | self.imageInsets += self.imageIncreaseOnHover; |
| 100 | } |
Kateryna Kostiuk | e28a038 | 2019-10-25 16:29:08 -0400 | [diff] [blame^] | 101 | if (self.textIncreaseOnHover && self.enabled && self.fontSize) { |
| 102 | self.fontSize -= self.textIncreaseOnHover; |
| 103 | } |
Kateryna Kostiuk | 958cd07 | 2017-07-14 15:56:35 -0400 | [diff] [blame] | 104 | [super setNeedsDisplay:YES]; |
| 105 | [super mouseExited:theEvent]; |
| 106 | } |
| 107 | |
| 108 | - (void)ensureTrackingArea { |
| 109 | if (trackingArea == nil) { |
| 110 | trackingArea = [[NSTrackingArea alloc] initWithRect:NSZeroRect |
| 111 | options:NSTrackingInVisibleRect |
| 112 | | NSTrackingActiveAlways |
| 113 | | NSTrackingMouseEnteredAndExited owner:self userInfo:nil]; |
| 114 | } |
| 115 | } |
| 116 | |
| 117 | - (void)updateTrackingAreas { |
| 118 | [super updateTrackingAreas]; |
| 119 | [self ensureTrackingArea]; |
| 120 | if (![[self trackingAreas] containsObject:trackingArea]) { |
| 121 | [self addTrackingArea:trackingArea]; |
| 122 | } |
| 123 | } |
| 124 | |
Kateryna Kostiuk | e28a038 | 2019-10-25 16:29:08 -0400 | [diff] [blame^] | 125 | -(void) onAppearanceChanged { |
| 126 | [super onAppearanceChanged]; |
| 127 | self.imageHoverColor = self.isDarkMode ? self.imageHoverDarkColor : self.imageHoverLightColor; |
| 128 | self.hoverColor = self.isDarkMode ? self.hoverDarkColor : self.hoverLightColor; |
| 129 | self.mouseOutsideColor = self.isDarkMode ? self.mouseOutsideDarkColor : self.mouseOutsideLightColor; |
| 130 | self.moiuseOutsideImageColor = self.isDarkMode ? self.moiuseOutsideImageDarkColor : self.moiuseOutsideImageLightColor; |
Kateryna Kostiuk | 958cd07 | 2017-07-14 15:56:35 -0400 | [diff] [blame] | 131 | } |
| 132 | |
Kateryna Kostiuk | 958cd07 | 2017-07-14 15:56:35 -0400 | [diff] [blame] | 133 | @end |