Rücksetzknopf im Mixer, mit reserviertem Platz

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 <noreply@anthropic.com>
This commit is contained in:
Scarriffle
2026-08-13 13:18:27 +02:00
parent c44bb3af30
commit c0c5809c96
2 changed files with 45 additions and 0 deletions

View File

@@ -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": { "mixer.section.apps": {
"localizations": { "localizations": {
"de": { "de": {

View File

@@ -175,6 +175,8 @@ private struct ProcessRow: View {
: Onyx.Color.textTertiary) : Onyx.Color.textTertiary)
// Feste Breite, sonst wandert der Regler beim Ziehen. // Feste Breite, sonst wandert der Regler beim Ziehen.
.frame(width: 36, alignment: .trailing) .frame(width: 36, alignment: .trailing)
resetButton
} }
.contentShape(.rect) .contentShape(.rect)
.help(group.name) .help(group.name)
@@ -188,6 +190,33 @@ private struct ProcessRow: View {
.animation(Onyx.Motion.value, value: managed) .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 /// Wie viele Wellen am Lautsprecher folgt der Lautstärke, wie überall
/// sonst in macOS auch. /// sonst in macOS auch.
private var speakerSymbol: String { private var speakerSymbol: String {