Skip to content

Commit 0573e9a

Browse files
Fixed it
1 parent 855c815 commit 0573e9a

4 files changed

Lines changed: 61 additions & 58 deletions

File tree

Pika/ButtonStyles/SwapButtonStyle.swift

Lines changed: 39 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -38,47 +38,48 @@ struct SwapButtonStyle: ButtonStyle {
3838
}
3939
configuration.label
4040
}
41-
}
42-
.padding(.horizontal, 8)
43-
.padding(.vertical, 8)
44-
.mask(RoundedRectangle(cornerRadius: 100.0, style: .continuous))
45-
.background(
46-
ZStack {
47-
RoundedRectangle(cornerRadius: 100.0, style: .continuous)
48-
.fill(bgColor)
49-
.shadow(
50-
color: Color.black.opacity(0.2),
51-
radius: configuration.isPressed ? 1 : 2,
52-
x: 0,
53-
y: configuration.isPressed ? 1 : 2
54-
)
55-
.overlay(
56-
RoundedRectangle(cornerRadius: 100.0, style: .continuous)
57-
.stroke(fgColor.opacity(0.1))
58-
)
59-
}
60-
)
61-
.onHover { hover in
62-
onHoverChange?(hover)
63-
if hover {
64-
if hoverTask == nil {
65-
hoverTask = Task {
66-
try? await Task.sleep(for: .milliseconds(100))
67-
isHovered = true
68-
hoverTask = nil
41+
}.animation(.easeInOut, value: isHovered)
42+
.padding(.horizontal, 8)
43+
.padding(.vertical, 8)
44+
.mask(RoundedRectangle(cornerRadius: 100.0, style: .continuous))
45+
.background(
46+
ZStack {
47+
RoundedRectangle(cornerRadius: 100.0, style: .continuous)
48+
.fill(bgColor)
49+
.shadow(
50+
color: Color.black.opacity(0.2),
51+
radius: configuration.isPressed ? 1 : 2,
52+
x: 0,
53+
y: configuration.isPressed ? 1 : 2
54+
)
55+
.overlay(
56+
RoundedRectangle(cornerRadius: 100.0, style: .continuous)
57+
.stroke(fgColor.opacity(0.1))
58+
)
59+
}
60+
)
61+
.onHover { hover in
62+
onHoverChange?(hover)
63+
if hover {
64+
if hoverTask == nil {
65+
hoverTask = Task {
66+
try? await Task.sleep(for: .milliseconds(100))
67+
isHovered = true
68+
hoverTask = nil
69+
}
6970
}
71+
} else {
72+
hoverTask?.cancel()
73+
hoverTask = nil
74+
isHovered = false
7075
}
71-
} else {
72-
hoverTask?.cancel()
73-
hoverTask = nil
74-
isHovered = false
7576
}
76-
}
77-
.opacity(isVisible ? (configuration.isPressed ? 0.8 : 1.0) : 0.0)
78-
.foregroundColor(fgColor.opacity(0.8))
79-
.frame(height: 32.0)
80-
.animation(.easeInOut, value: isVisible)
81-
.animation(.easeInOut, value: configuration.isPressed)
77+
.animation(.easeInOut, value: isHovered)
78+
.opacity(isVisible ? (configuration.isPressed ? 0.8 : 1.0) : 0.0)
79+
.foregroundColor(fgColor.opacity(0.8))
80+
.frame(height: 32.0)
81+
.animation(.easeInOut, value: isVisible)
82+
.animation(.easeInOut, value: configuration.isPressed)
8283
}
8384
}
8485

Pika/Views/ContentView.swift

Lines changed: 20 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import Combine
12
import Defaults
23
import SwiftUI
34

@@ -10,26 +11,24 @@ struct ContentView: View {
1011
let pasteboard = NSPasteboard.general
1112

1213
@State var swapVisible: Bool = false
13-
@State private var swapHideTask: Task<Void, Never>?
14-
@State private var swapButtonHovered: Bool = false
14+
@State private var swapTimerSubscription: Cancellable?
15+
@State private var swapTimer = Timer.publish(every: 0.25, on: .main, in: .common)
1516
@State private var angle: Double = 0
1617

1718
var body: some View {
1819
VStack(alignment: .trailing, spacing: 0) {
1920
Divider()
2021
ColorPickers()
2122
.onHover { hover in
22-
if hover {
23-
swapHideTask?.cancel()
24-
swapHideTask = nil
25-
swapVisible = true
26-
} else if swapHideTask == nil && !swapButtonHovered {
27-
swapHideTask = Task {
28-
try? await Task.sleep(for: .milliseconds(250))
29-
swapVisible = false
30-
swapHideTask = nil
31-
}
32-
}
23+
guard hover else { return }
24+
swapVisible = true
25+
swapTimerSubscription?.cancel()
26+
swapTimerSubscription = nil
27+
}
28+
.onReceive(swapTimer) { _ in
29+
swapVisible = false
30+
swapTimerSubscription?.cancel()
31+
swapTimerSubscription = nil
3332
}
3433
.overlay(
3534
Button(action: {
@@ -43,11 +42,7 @@ struct ContentView: View {
4342
.buttonStyle(SwapButtonStyle(
4443
isVisible: swapVisible,
4544
alt: PikaText.textColorSwap,
46-
ltr: true,
47-
onHoverChange: { hover in
48-
swapButtonHovered = hover
49-
if hover { swapHideTask?.cancel(); swapHideTask = nil }
50-
}
45+
ltr: true
5146
))
5247
.onReceive(NotificationCenter.default.publisher(for: .triggerSwap)) { _ in
5348
swap(&eyedroppers.foreground.color, &eyedroppers.background.color)
@@ -56,6 +51,13 @@ struct ContentView: View {
5651
.padding(16.0)
5752
.frame(maxHeight: .infinity, alignment: .top)
5853
)
54+
.onHover { hover in
55+
guard !hover, swapTimerSubscription == nil else {
56+
return
57+
}
58+
swapTimer = Timer.publish(every: 0.25, on: .main, in: .common)
59+
swapTimerSubscription = swapTimer.connect()
60+
}
5961

6062
Divider()
6163
Footer(foreground: eyedroppers.foreground, background: eyedroppers.background)

Pika/Views/EyedropperButton.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ struct EyedropperButton: View {
9494
hoverTask?.cancel()
9595
hoverTask = nil
9696
hoverVisible = true
97-
} else if hoverTask == nil && !childHovered {
97+
} else if hoverTask == nil, !childHovered {
9898
hoverTask = Task {
9999
try? await Task.sleep(for: .milliseconds(250))
100100
hoverVisible = false

PikaTests/APCAComplianceTests.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ final class APCAComplianceTests: XCTestCase {
3030
let pairs: [(NSColor, NSColor)] = [
3131
(NSColor(r: 0, g: 0, b: 0), NSColor(r: 0, g: 0, b: 0)),
3232
(NSColor(r: 50, g: 50, b: 50), NSColor(r: 240, g: 240, b: 240)),
33-
(NSColor(r: 0, g: 0, b: 0), NSColor(r: 255, g: 255, b: 255))
33+
(NSColor(r: 0, g: 0, b: 0), NSColor(r: 255, g: 255, b: 255)),
3434
]
3535
for (foreground, background) in pairs {
3636
let level = foreground.APCACompliance(with: background).level

0 commit comments

Comments
 (0)