Eigenes Symbol für den Mixer in der Menüleiste

Die Datei lag im Projektstamm; von dort wird nichts mitgeliefert. Jetzt in
Onyx/ und damit im Bundle.

Gezeichnet wird sie in `labelColor`, nicht in Weiß: unter einer hellen
Menüleiste wäre ein weißes Symbol unsichtbar. Auf dunklem Grund ist
labelColor weiß, also genau das Gewünschte — und auf hellem Grund schwarz,
statt zu verschwinden.

Eigene Vorlagen lassen sich nicht wie SF-Symbole einfärben: dort greift die
Symbolkonfiguration nicht, und `color.set()` allein färbt ein Template-Bild
ohnehin nicht. Der Weg ist, das Bild zu zeichnen und die Farbe mit
`sourceAtop` darüberzulegen — das trifft die deckenden Bildpunkte und lässt
den Rest frei.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Scarriffle
2026-08-13 13:23:21 +02:00
parent c0c5809c96
commit 43ce40676b
4 changed files with 48 additions and 3 deletions

View File

@@ -108,8 +108,23 @@ private final class MixerStatusView: NSView {
// liegt oft ein heller Schreibtischhintergrund, und ein zu 55 % blasses
// Glyph ist dort praktisch weg. Ob der Mixer läuft, erfährt man beim
// Klick dafür muss man das Symbol aber erst finden.
MenuBarText.drawSymbol("slider.horizontal.3", color: .labelColor,
in: NSRect(x: bounds.midX - 7.5, y: bounds.midY - 7.5,
width: 15, height: 15))
let rect = NSRect(x: bounds.midX - 8, y: bounds.midY - 8, width: 16, height: 16)
if let glyph = Self.glyph {
// `labelColor` und nicht Weiß: unter einer hellen Menüleiste wäre
// ein weißes Symbol unsichtbar. Auf dunklem Grund ist labelColor
// weiß, also genau das Gewünschte.
MenuBarText.drawTemplate(glyph, color: .labelColor, in: rect)
return
}
MenuBarText.drawSymbol("slider.horizontal.3", color: .labelColor, in: rect)
}
/// Die eigene Vorlage aus dem Bundle. Einmal geladen und behalten das
/// Zeichnen läuft bei jeder Änderung, das Einlesen einer SVG nicht.
private static let glyph: NSImage? = {
guard let url = Bundle.main.url(forResource: "sound-waves", withExtension: "svg")
else { return nil }
return NSImage(contentsOf: url)
}()
}