first commit
This commit is contained in:
@@ -0,0 +1,92 @@
|
||||
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<LevelComplicationEntry>) -> 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])
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user