feat(macos): delay hover HUD
This commit is contained in:
@@ -22,15 +22,19 @@ final class HoverHUDController {
|
|||||||
private var hostingView: NSHostingView<HoverHUDView>?
|
private var hostingView: NSHostingView<HoverHUDView>?
|
||||||
private var dismissMonitor: Any?
|
private var dismissMonitor: Any?
|
||||||
private var dismissTask: Task<Void, Never>?
|
private var dismissTask: Task<Void, Never>?
|
||||||
|
private var showTask: Task<Void, Never>?
|
||||||
private var anchorProvider: (() -> NSRect?)?
|
private var anchorProvider: (() -> NSRect?)?
|
||||||
|
|
||||||
private let width: CGFloat = 360
|
private let width: CGFloat = 360
|
||||||
private let height: CGFloat = 74
|
private let height: CGFloat = 74
|
||||||
private let padding: CGFloat = 8
|
private let padding: CGFloat = 8
|
||||||
|
private let hoverShowDelay: TimeInterval = 0.18
|
||||||
|
|
||||||
func setSuppressed(_ suppressed: Bool) {
|
func setSuppressed(_ suppressed: Bool) {
|
||||||
self.model.isSuppressed = suppressed
|
self.model.isSuppressed = suppressed
|
||||||
if suppressed {
|
if suppressed {
|
||||||
|
self.showTask?.cancel()
|
||||||
|
self.showTask = nil
|
||||||
self.dismiss(reason: "suppressed")
|
self.dismiss(reason: "suppressed")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -44,8 +48,21 @@ final class HoverHUDController {
|
|||||||
if inside {
|
if inside {
|
||||||
self.dismissTask?.cancel()
|
self.dismissTask?.cancel()
|
||||||
self.dismissTask = nil
|
self.dismissTask = nil
|
||||||
self.present()
|
self.showTask?.cancel()
|
||||||
|
self.showTask = Task { [weak self] in
|
||||||
|
guard let self else { return }
|
||||||
|
try? await Task.sleep(nanoseconds: UInt64(self.hoverShowDelay * 1_000_000_000))
|
||||||
|
await MainActor.run { [weak self] in
|
||||||
|
guard let self else { return }
|
||||||
|
guard !Task.isCancelled else { return }
|
||||||
|
guard self.model.hoveringStatusItem else { return }
|
||||||
|
guard !self.model.isSuppressed else { return }
|
||||||
|
self.present()
|
||||||
|
}
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
|
self.showTask?.cancel()
|
||||||
|
self.showTask = nil
|
||||||
self.scheduleDismiss()
|
self.scheduleDismiss()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -282,4 +299,3 @@ private struct HoverHUDView: View {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user