diff --git a/Packages/OnyxKit/Sources/AudioProvider/MixerView.swift b/Packages/OnyxKit/Sources/AudioProvider/MixerView.swift index 51a6058..65f0618 100644 --- a/Packages/OnyxKit/Sources/AudioProvider/MixerView.swift +++ b/Packages/OnyxKit/Sources/AudioProvider/MixerView.swift @@ -198,7 +198,6 @@ private struct ProcessRow: View { resetButton } .contentShape(.rect) - .help(group.name) .contextMenu { if managed { Button { mixer.setManaged(false, for: group.bundleID) } label: { @@ -252,18 +251,34 @@ private struct ProcessRow: View { @ViewBuilder private var icon: some View { // Auch Hilfsprozesse bekommen das Symbol ihres Programms. - if let image = ProcessNaming.icon(bundleID: group.bundleID, - pid: group.processes.first?.pid ?? 0) { - Image(nsImage: image) - .resizable() - .frame(width: 26, height: 26) - .opacity(managed ? 1 : 0.65) - } else { - Image(systemName: "app.dashed") - .font(.system(size: 15)) - .foregroundStyle(Onyx.Color.textTertiary) - .frame(width: 26, height: 26) + Group { + if let image = ProcessNaming.icon(bundleID: group.bundleID, + pid: group.processes.first?.pid ?? 0) { + Image(nsImage: image) + .resizable() + .opacity(managed ? 1 : 0.65) + } else { + Image(systemName: "app.dashed") + .font(.system(size: 15)) + .foregroundStyle(Onyx.Color.textTertiary) + } } + .frame(width: 26, height: 26) + // Der Name hängt am Symbol, nicht an der Zeile: die Zeile besteht zum + // größten Teil aus Regler und Knöpfen, und die verschlucken den + // Hinweis. Am Symbol kommt er an — und dort sucht man ihn auch, wenn + // man das Programm nicht erkennt. + .help(tooltip) + } + + /// Name des Programms, bei mehreren Tonquellen mit ihrer Anzahl. + /// + /// Chrome erscheint als eine Zeile, gibt seinen Ton aber über mehrere + /// Hilfsprozesse aus. Die Zahl erklärt, warum ein Regler mehr als einen + /// Prozess bewegt. + private var tooltip: String { + guard group.processes.count > 1 else { return group.name } + return "\(group.name) (\(group.processes.count))" } }