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

@@ -78,6 +78,31 @@ public enum MenuBarText {
return fittedSize(of: image, height: height).width
}
/// Zeichnet ein beliebiges Bild in der gewünschten Farbe.
///
/// Für eigene Vorlagen statt SF-Symbole: dort greift die
/// Symbolkonfiguration nicht, und `color.set()` allein färbt ein
/// Template-Bild nicht. Der Weg ist, das Bild zu zeichnen und die Farbe
/// mit `sourceAtop` darüberzulegen das trifft genau die deckenden
/// Bildpunkte und lässt den Rest frei.
public static func drawTemplate(_ image: NSImage, color: NSColor, in rect: NSRect) {
let natural = image.size
let fitted: NSSize = natural.height > 0
? NSSize(width: (natural.width / natural.height) * rect.height, height: rect.height)
: rect.size
let target = NSRect(x: rect.midX - fitted.width / 2,
y: rect.midY - fitted.height / 2,
width: fitted.width, height: fitted.height)
let tinted = NSImage(size: target.size, flipped: false) { bounds in
image.draw(in: bounds, from: .zero, operation: .sourceOver, fraction: 1)
color.set()
bounds.fill(using: .sourceAtop)
return true
}
tinted.draw(in: target)
}
private static func symbol(_ name: String, color: NSColor, height: CGFloat) -> NSImage? {
guard let image = NSImage(systemSymbolName: name, accessibilityDescription: nil)
else { return nil }