NSStatusItem menu-bar helper: MenuBarAgent (click/menu modes, dynamic icon/menu updates) + MenuBarItem (.action/.label/.separator) + MenuBarIcon. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
42 lines
1.4 KiB
Swift
42 lines
1.4 KiB
Swift
#if canImport(AppKit)
|
|
import AppKit
|
|
|
|
/// Describes the icon displayed in the macOS menu bar.
|
|
public enum MenuBarIcon {
|
|
case sfSymbol(_ name: String, accessibilityDescription: String)
|
|
case named(_ name: String, accessibilityDescription: String)
|
|
case image(_ image: NSImage)
|
|
case coloredImage(_ image: NSImage)
|
|
|
|
/// Resolves the enum case into a concrete `NSImage` suitable for use as a status item icon.
|
|
func resolve() -> NSImage {
|
|
switch self {
|
|
case .sfSymbol(let name, let accessibilityDescription):
|
|
guard let image = NSImage(
|
|
systemSymbolName: name,
|
|
accessibilityDescription: accessibilityDescription
|
|
) else {
|
|
fatalError("SF Symbol '\(name)' not found")
|
|
}
|
|
image.isTemplate = true
|
|
return image
|
|
|
|
case .named(let name, let accessibilityDescription):
|
|
guard let image = NSImage(named: name) else {
|
|
fatalError("Named image '\(name)' not found in bundle")
|
|
}
|
|
image.accessibilityDescription = accessibilityDescription
|
|
image.isTemplate = true
|
|
return image
|
|
|
|
case .image(let image):
|
|
image.isTemplate = true
|
|
return image
|
|
|
|
case .coloredImage(let image):
|
|
image.isTemplate = false
|
|
return image
|
|
}
|
|
}
|
|
}
|
|
#endif
|