import SwiftUI /// Ein Widget im Notch-Panel. /// /// Das Panel kennt ausschließlich dieses Protokoll. Ein neues Widget kommt /// dazu, indem es sich bei der Registry meldet — am Panel selbst ändert sich /// dafür keine Zeile. @MainActor public protocol OnyxWidget: Identifiable, Sendable { /// Stabil über App-Versionen hinweg: dieser Wert steht in der Layout-Datei. var id: String { get } /// Lokalisierter Name für die Einstellungen. var displayName: String { get } var symbolName: String { get } /// Welche Größen dieses Widget sinnvoll ausfüllen kann. var supportedSizes: [WidgetSize] { get } @ViewBuilder func makeView(size: WidgetSize) -> AnyView /// Einstellungen dieses Widgets, falls es welche hat. @ViewBuilder func makeSettingsView() -> AnyView? } public extension OnyxWidget { func makeSettingsView() -> AnyView? { nil } } /// Alle bekannten Widgets. Die App füllt sie beim Start. @MainActor public final class WidgetRegistry { public static let shared = WidgetRegistry() private var widgets: [String: any OnyxWidget] = [:] private var order: [String] = [] private init() {} public func register(_ widget: any OnyxWidget) { if widgets[widget.id] == nil { order.append(widget.id) } widgets[widget.id] = widget } public func widget(id: String) -> (any OnyxWidget)? { widgets[id] } /// In Registrierungsreihenfolge — das ist auch die Reihenfolge in den /// Einstellungen. public var all: [any OnyxWidget] { order.compactMap { widgets[$0] } } public func contains(_ id: String) -> Bool { widgets[id] != nil } }