Files
Gas-Tank-AR-App/GasTankAR/Views/TankAR/MeasurementListView.swift
Dennis Nemec b8536d4182 Add tank catalog with USDZ models and tank selection
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>
2026-09-26 19:12:39 +02:00

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) }
)
}
}