1+ import Combine
12import Defaults
23import 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)
0 commit comments