forked from unom/punktfunk
- Remove the "releases mouse/keyboard" shortcut hint from the stats overlay (kept the capture hint). The release shortcut still lives on the Stream menu and, on macOS, the start-of-stream banner. - Animate the overlay: one shared glass card now wraps the tier content, so a verbosity change MORPHS the card's frame/shape in place instead of cross-fading a fresh card; the enter/exit transition is a scale-up from the HUD's own corner. Driven by .animation(.smooth, value: statsVerbosity). - iOS: give the card a corner radius concentric with the physical display (displayCornerRadius - inset, continuous curve) so it no longer cuts into the very rounded device corner. Reads _displayCornerRadius via KVC with a safe fallback (note: private API — App Store consideration). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
47 lines
1.6 KiB
Swift
47 lines
1.6 KiB
Swift
// The HUD-corner model persisted by Settings and read wherever the overlay is placed
|
|
// (ContentView, StreamHUDView).
|
|
|
|
import SwiftUI
|
|
|
|
/// Which corner the HUD overlay occupies (persisted as `DefaultsKey.hudPlacement`). The raw
|
|
/// values are stable on disk — rename the cases freely, never the strings.
|
|
enum HUDPlacement: String, CaseIterable, Identifiable {
|
|
case topLeading, topTrailing, bottomLeading, bottomTrailing
|
|
|
|
var id: String { rawValue }
|
|
|
|
/// SwiftUI overlay alignment for `.overlay(alignment:)`.
|
|
var alignment: Alignment {
|
|
switch self {
|
|
case .topLeading: return .topLeading
|
|
case .topTrailing: return .topTrailing
|
|
case .bottomLeading: return .bottomLeading
|
|
case .bottomTrailing: return .bottomTrailing
|
|
}
|
|
}
|
|
|
|
/// The HUD's own stack hugs the screen edge it sits against, so its text aligns outward.
|
|
var isTrailing: Bool { self == .topTrailing || self == .bottomTrailing }
|
|
|
|
/// The corner as a `UnitPoint`, so a scale transition grows/shrinks the HUD out of its own
|
|
/// corner rather than its centre.
|
|
var unitPoint: UnitPoint {
|
|
switch self {
|
|
case .topLeading: return .topLeading
|
|
case .topTrailing: return .topTrailing
|
|
case .bottomLeading: return .bottomLeading
|
|
case .bottomTrailing: return .bottomTrailing
|
|
}
|
|
}
|
|
|
|
/// User-facing corner label.
|
|
var label: String {
|
|
switch self {
|
|
case .topLeading: return "Top Left"
|
|
case .topTrailing: return "Top Right"
|
|
case .bottomLeading: return "Bottom Left"
|
|
case .bottomTrailing: return "Bottom Right"
|
|
}
|
|
}
|
|
}
|