diff --git a/Packages/OnyxKit/Sources/AudioProvider/Localizable.xcstrings b/Packages/OnyxKit/Sources/AudioProvider/Localizable.xcstrings index a3e43b2..e1458a7 100644 --- a/Packages/OnyxKit/Sources/AudioProvider/Localizable.xcstrings +++ b/Packages/OnyxKit/Sources/AudioProvider/Localizable.xcstrings @@ -180,6 +180,22 @@ } } }, + "mixer.reset": { + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Zurück auf 100 %" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Back to 100 %" + } + } + } + }, "mixer.section.apps": { "localizations": { "de": { diff --git a/Packages/OnyxKit/Sources/AudioProvider/MixerView.swift b/Packages/OnyxKit/Sources/AudioProvider/MixerView.swift index ba74cfe..69b7f68 100644 --- a/Packages/OnyxKit/Sources/AudioProvider/MixerView.swift +++ b/Packages/OnyxKit/Sources/AudioProvider/MixerView.swift @@ -175,6 +175,8 @@ private struct ProcessRow: View { : Onyx.Color.textTertiary) // Feste Breite, sonst wandert der Regler beim Ziehen. .frame(width: 36, alignment: .trailing) + + resetButton } .contentShape(.rect) .help(group.name) @@ -188,6 +190,33 @@ private struct ProcessRow: View { .animation(Onyx.Motion.value, value: managed) } + /// Zurück auf 100 %. + /// + /// Der Platz dafür ist **immer** reserviert, auch wenn der Knopf nicht zu + /// sehen ist. Ein Knopf, der auftaucht und dabei den Regler schmaler macht, + /// verschiebt genau das, was man gerade bedient — und beim Loslassen springt + /// es zurück. + @ViewBuilder + private var resetButton: some View { + Group { + if managed, abs(volume - 1) > 0.001 { + Button { mixer.setVolume(1, for: group.bundleID) } label: { + Image(systemName: "arrow.counterclockwise") + .font(.system(size: 9, weight: .medium)) + } + .buttonStyle(.plain) + .foregroundStyle(Onyx.Color.textTertiary) + .help(Text("mixer.reset", bundle: .module)) + } else { + Color.clear + } + } + .frame(width: Self.resetSlotWidth, height: 14) + } + + /// Die reservierte Breite des Rücksetzknopfes. + private static let resetSlotWidth: CGFloat = 14 + /// Wie viele Wellen am Lautsprecher — folgt der Lautstärke, wie überall /// sonst in macOS auch. private var speakerSymbol: String {