Introduce TankDefinition/TankCatalog loaded from Tanks.json, bundle the Drachengas USDZ tank models, add tank selection and preview views, and update the AR experience, editor and project views to use the catalog. Includes tests for catalog loading and model selection. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
83 lines
3.0 KiB
Swift
83 lines
3.0 KiB
Swift
//
|
|
// MeasurementListView.swift
|
|
// GasTankAR
|
|
//
|
|
// Created by Dennis Nemec on 28.08.26.
|
|
//
|
|
|
|
import SwiftUI
|
|
|
|
/// Von unten einschwebendes Sheet mit den angelegten Strecken. Ist keine vorhanden,
|
|
/// wird zum Hinzufügen aufgefordert.
|
|
struct MeasurementListView: View {
|
|
let controller: ARSessionController
|
|
/// Startet einen neuen Messvorgang (schließt das Sheet und lässt den Nutzer zwei Punkte wählen).
|
|
let onAddStrecke: () -> Void
|
|
|
|
var body: some View {
|
|
NavigationStack {
|
|
List {
|
|
Section("Tankmaße") {
|
|
Toggle("Alle anzeigen", isOn: allDimensionsBinding)
|
|
|
|
ForEach(TankDimension.allCases) { dimension in
|
|
Toggle(
|
|
dimension.title,
|
|
isOn: dimensionBinding(for: dimension)
|
|
)
|
|
}
|
|
}
|
|
|
|
Section("Eigene Strecken") {
|
|
if controller.measurements.isEmpty {
|
|
Text("Noch keine eigenen Strecken angelegt.")
|
|
.foregroundStyle(.secondary)
|
|
} else {
|
|
ForEach(controller.measurements) { measurement in
|
|
HStack {
|
|
VStack(alignment: .leading, spacing: 2) {
|
|
Text(measurement.name)
|
|
.font(.headline)
|
|
Text(measurement.formattedDistance)
|
|
.font(.subheadline)
|
|
.foregroundStyle(.secondary)
|
|
}
|
|
Spacer()
|
|
Image(systemName: "ruler")
|
|
.foregroundStyle(.secondary)
|
|
}
|
|
}
|
|
.onDelete { controller.deleteMeasurements(at: $0) }
|
|
}
|
|
}
|
|
}
|
|
.navigationTitle("Strecken")
|
|
.navigationBarTitleDisplayMode(.inline)
|
|
.toolbar {
|
|
ToolbarItem(placement: .topBarTrailing) {
|
|
Button("Hinzufügen", systemImage: "plus", action: onAddStrecke)
|
|
}
|
|
}
|
|
}
|
|
.presentationDetents([.medium, .large])
|
|
}
|
|
|
|
private var allDimensionsBinding: Binding<Bool> {
|
|
Binding(
|
|
get: { TankDimension.allCases.allSatisfy { controller.visibleTankDimensions.contains($0) } },
|
|
set: { isVisible in
|
|
for dimension in TankDimension.allCases {
|
|
controller.setTankDimension(dimension, visible: isVisible)
|
|
}
|
|
}
|
|
)
|
|
}
|
|
|
|
private func dimensionBinding(for dimension: TankDimension) -> Binding<Bool> {
|
|
Binding(
|
|
get: { controller.visibleTankDimensions.contains(dimension) },
|
|
set: { controller.setTankDimension(dimension, visible: $0) }
|
|
)
|
|
}
|
|
}
|