forked from fritob/Camper-Monitor
CamperMonitor (Haupt-Repo) und VanAligneiOS (aus dem gemergten solar-integration-Branch) liefen unter zwei verschiedenen internen Namen, obwohl die App nach aussen längst einheitlich "VanControl Pro" heisst. Jetzt durchgängig VanControl: - Ordner: CamperMonitor/, CamperMonitorWatch/, CamperMonitorComplication/, VanAligneiOSWidget/ → VanControl/, VanControlWatch/, VanControlComplication/, VanControlWidget/ - Xcode-Projekt: CamperMonitor.xcodeproj → VanControl.xcodeproj, alle Targets/Schemes/Produktnamen entsprechend umbenannt - Bundle-Identifier auf Wunsch mitgeändert: de.s0.fototeddy.VanControl* (App noch nicht veröffentlicht); dabei auch die WKCompanionAppBundleIdentifier-Werte korrigiert, die noch das alte de.fritob-Präfix statt des tatsächlichen de.s0.fototeddy-Präfixes trugen - Swift-Dateien/Typen: CamperMonitorApp → VanControlApp, VanAligneiOSWidget* → VanControlWidget* - Config/*-Info.plist umbenannt, README.md/Tools/README.md/run-tests.sh auf die neuen Pfade angepasst Bewusst unverändert: firmware/vanalign und alle Bezüge auf "VanAlign" als Namen der Neigungsmesser-Hardware (eigenständiges Produkt, kein App-Name) sowie der komplette Android/-Ordner. Build (App, Watch, Debug) und Protokoll-Testlauf grün. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
68 lines
2.4 KiB
Swift
68 lines
2.4 KiB
Swift
import SwiftUI
|
||
|
||
/// Die Neigung am Fahrzeug selbst, wie am iPhone – nur auf Uhrgrösse gebracht.
|
||
///
|
||
/// Zwei Ansichten, jede um ihre Achse gekippt: die Seitenansicht für längs
|
||
/// (Front links, Heck rechts) und die Heckansicht für quer. Die Heckansicht
|
||
/// teilt die Blickrichtung des Fahrers, links im Bild ist also links am
|
||
/// Fahrzeug.
|
||
struct WatchVehicleView: View {
|
||
let pitch: Double?
|
||
let roll: Double?
|
||
|
||
/// Wie am iPhone dreifach überhöht – zwei Grad wären sonst kaum zu sehen.
|
||
/// Die angeschriebenen Gradzahlen bleiben echt.
|
||
var body: some View {
|
||
VStack(spacing: 8) {
|
||
panel(image: "VansterSide", angle: pitch, title: "Längs",
|
||
lower: "Front", upper: "Heck", aspect: VehicleTilt.sideAspect)
|
||
panel(image: "VansterRear", angle: roll, title: "Quer",
|
||
lower: "links", upper: "rechts", aspect: VehicleTilt.rearAspect)
|
||
}
|
||
}
|
||
|
||
private func panel(image: String,
|
||
angle: Double?,
|
||
title: String,
|
||
lower: String,
|
||
upper: String,
|
||
aspect: Double) -> some View {
|
||
VStack(spacing: 2) {
|
||
HStack {
|
||
Text(title)
|
||
Spacer()
|
||
Text(angle.map { String(format: "%.1f°", $0) } ?? "–")
|
||
.monospacedDigit()
|
||
.foregroundStyle(VehicleTilt.colour(for: angle))
|
||
}
|
||
.font(.caption2)
|
||
|
||
ZStack {
|
||
// Die Waagerechte als Bezug – ohne sie ist eine kleine Neigung
|
||
// nicht einzuschätzen.
|
||
Rectangle()
|
||
.fill(Color.secondary.opacity(0.35))
|
||
.frame(height: 1)
|
||
|
||
Image(image)
|
||
.resizable()
|
||
.scaledToFit()
|
||
.foregroundStyle(VehicleTilt.colour(for: angle))
|
||
.aspectRatio(aspect, contentMode: .fit)
|
||
.rotationEffect(.degrees(-(angle ?? 0) * VehicleTilt.exaggeration))
|
||
.animation(.spring(duration: 0.4), value: angle)
|
||
.opacity(angle == nil ? 0.3 : 1)
|
||
}
|
||
.frame(height: 52)
|
||
|
||
HStack {
|
||
Text(lower)
|
||
Spacer()
|
||
Text(upper)
|
||
}
|
||
.font(.system(size: 9))
|
||
.foregroundStyle(.secondary)
|
||
}
|
||
}
|
||
}
|