From c0c5809c9673e429b1b4c800b0a32cccac74a737 Mon Sep 17 00:00:00 2001 From: Scarriffle Date: Thu, 13 Aug 2026 13:18:27 +0200 Subject: [PATCH] =?UTF-8?q?R=C3=BCcksetzknopf=20im=20Mixer,=20mit=20reserv?= =?UTF-8?q?iertem=20Platz?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ein kleiner Pfeil je Programm stellt die Lautstärke auf 100 % zurück. Er erscheint nur, wenn der Wert davon abweicht — es gibt sonst nichts zurückzusetzen. Der Platz dafür ist trotzdem **immer** reserviert. Ein Knopf, der auftaucht und dabei den Regler schmaler macht, verschiebt genau das, was man gerade bedient: man zieht auf 90 %, der Knopf erscheint, der Regler schrumpft, und der Griff sitzt woanders als die Hand. Co-Authored-By: Claude Opus 5 --- .../AudioProvider/Localizable.xcstrings | 16 ++++++++++ .../Sources/AudioProvider/MixerView.swift | 29 +++++++++++++++++++ 2 files changed, 45 insertions(+) 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 {