import SwiftUI import WidgetKit /// Komplikation fürs Zifferblatt: ein Tipp, und die Nivellierung steht da. /// /// Bewusst **ohne Messwert**. Eine Komplikation läuft in einem eigenen Prozess /// und käme an die Werte nur über eine App-Gruppe – die verlangt eine bezahlte /// Entwicklermitgliedschaft. Ein Wert, der beim Blick aufs Zifferblatt /// womöglich Stunden alt ist, wäre ausserdem schlimmer als keiner: Man würde /// ihm glauben. /// /// Die Komplikation tut deshalb genau eine Sache, und die zuverlässig: Sie /// öffnet die App auf der Nivellierung. Von dort sind die Werte live, weil die /// Uhr den Sensor selbst anfunkt. struct LevelComplicationEntry: TimelineEntry { let date: Date } /// Nichts zu planen: Die Anzeige ändert sich nie, also ein einziger Eintrag /// ohne Nachschub. Das kostet die Uhr auch nichts. struct LevelComplicationProvider: TimelineProvider { func placeholder(in context: Context) -> LevelComplicationEntry { LevelComplicationEntry(date: .now) } func getSnapshot(in context: Context, completion: @escaping (LevelComplicationEntry) -> Void) { completion(LevelComplicationEntry(date: .now)) } func getTimeline(in context: Context, completion: @escaping (Timeline) -> Void) { completion(Timeline(entries: [LevelComplicationEntry(date: .now)], policy: .never)) } } struct LevelComplicationView: View { @Environment(\.widgetFamily) private var family var body: some View { switch family { case .accessoryInline: // Eine Zeile Text, mehr lässt diese Familie nicht zu. Label("Nivellierung", systemImage: "level") case .accessoryCorner: Image(systemName: "level") .font(.title2) .widgetLabel("Nivellieren") case .accessoryRectangular: HStack(spacing: 6) { Image(systemName: "level") .font(.title3) VStack(alignment: .leading, spacing: 0) { Text("Nivellierung") .font(.headline) Text("Antippen zum Ausrichten") .font(.caption2) .foregroundStyle(.secondary) } } default: // Rund – auf dem Zifferblatt der knappste Platz, also nur das // Symbol, gross genug zum Treffen. ZStack { AccessoryWidgetBackground() Image(systemName: "level") .font(.title2) } } } } @main struct LevelComplication: Widget { var body: some WidgetConfiguration { StaticConfiguration(kind: "de.fritob.CamperMonitor.complication.level", provider: LevelComplicationProvider()) { _ in LevelComplicationView() // Der Tipp landet nicht irgendwo in der App, sondern auf der // Nivellierung – dafür wertet die App diese Adresse aus. .widgetURL(WatchDeepLink.level) .containerBackground(.clear, for: .widget) } .configurationDisplayName("Nivellierung") .description("Öffnet die Nivellierung direkt vom Zifferblatt.") .supportedFamilies([.accessoryCircular, .accessoryCorner, .accessoryInline, .accessoryRectangular]) } }