blob: 91856df5b0f2e8685ed06745b0f0763ecaededc8 [file] [log] [blame]
Kateryna Kostiuk958cd072017-07-14 15:56:35 -04001/*
Sébastien Blin029ffa82019-01-02 17:43:48 -05002 * Copyright (C) 2017-2019 Savoir-faire Linux Inc.
Kateryna Kostiuk958cd072017-07-14 15:56:35 -04003 * 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 Kostiuk958cd072017-07-14 15:56:35 -040024-(void) awakeFromNib {
25 [super awakeFromNib];
Kateryna Kostiuke28a0382019-10-25 16:29:08 -040026 [self updateParameters];
Kateryna Kostiuk958cd072017-07-14 15:56:35 -040027}
28
Kateryna Kostiuk1f8c1252018-07-30 18:18:57 -040029-(instancetype)initWithFrame:(NSRect)frameRect {
30 self = [super initWithFrame: frameRect];
Kateryna Kostiuke28a0382019-10-25 16:29:08 -040031 [self updateParameters];
Kateryna Kostiuk1f8c1252018-07-30 18:18:57 -040032 return self;
33}
34
Kateryna Kostiuke28a0382019-10-25 16:29:08 -040035-(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 Kostiuk958cd072017-07-14 15:56:35 -040067-(void)mouseEntered:(NSEvent *)theEvent {
Kateryna Kostiuk88a6ee82019-09-10 17:55:08 -040068 if (self.animating) {
69 [self stopBlinkAnimation];
70 self.animating = true;
71 }
Kateryna Kostiukdb95b472018-04-17 16:35:57 -040072 if(self.isEnabled) {
73 self.bgColor = self.hoverColor;
74 }
Kateryna Kostiuk88a6ee82019-09-10 17:55:08 -040075 if(self.imageHoverColor) {
76 self.imageColor = self.imageHoverColor;
77 }
Kateryna Kostiuke28a0382019-10-25 16:29:08 -040078 if (self.imageIncreaseOnHover && self.enabled) {
Kateryna Kostiuk88a6ee82019-09-10 17:55:08 -040079 self.imageInsets -= self.imageIncreaseOnHover;
80 }
Kateryna Kostiuke28a0382019-10-25 16:29:08 -040081 if (self.textIncreaseOnHover && self.enabled && self.fontSize) {
82 self.fontSize += self.textIncreaseOnHover;
83 }
Kateryna Kostiuk958cd072017-07-14 15:56:35 -040084 [super setNeedsDisplay:YES];
85 [super mouseEntered:theEvent];
86}
87
88-(void)mouseExited:(NSEvent *)theEvent {
89 self.bgColor = self.mouseOutsideColor;
Kateryna Kostiuk88a6ee82019-09-10 17:55:08 -040090 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 Kostiuke28a0382019-10-25 16:29:08 -040098 if (self.imageIncreaseOnHover && self.enabled) {
Kateryna Kostiuk88a6ee82019-09-10 17:55:08 -040099 self.imageInsets += self.imageIncreaseOnHover;
100 }
Kateryna Kostiuke28a0382019-10-25 16:29:08 -0400101 if (self.textIncreaseOnHover && self.enabled && self.fontSize) {
102 self.fontSize -= self.textIncreaseOnHover;
103 }
Kateryna Kostiuk958cd072017-07-14 15:56:35 -0400104 [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 Kostiuke28a0382019-10-25 16:29:08 -0400125-(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 Kostiuk958cd072017-07-14 15:56:35 -0400131}
132
Kateryna Kostiuk958cd072017-07-14 15:56:35 -0400133@end