68 lines
1.9 KiB
Swift
68 lines
1.9 KiB
Swift
//
|
|
// ARProjectPersisting.swift
|
|
// GasTankAR
|
|
//
|
|
// Created by Dennis Nemec on 26.08.26.
|
|
//
|
|
|
|
import ARKit
|
|
import CoreLocation
|
|
import SwiftData
|
|
|
|
/// Abstraktion der Projekt-Persistenz für den AR-Modus (Dependency Inversion):
|
|
/// Der Controller kennt so kein SwiftData und ist unit-testbar.
|
|
@MainActor
|
|
protocol ARProjectPersisting: AnyObject {
|
|
var tank: Tank { get }
|
|
var worldMap: ARWorldMap? { get }
|
|
var tankTransform: [Float]? { get }
|
|
|
|
func saveWorldMap(_ data: Data)
|
|
func saveTankTransform(_ transform: [Float])
|
|
func clearTankTransform()
|
|
func savePhoto(_ imageData: Data, date: Date, coordinate: CLLocationCoordinate2D?)
|
|
}
|
|
|
|
/// SwiftData-Adapter: verbindet das `Project`-Model mit dem `ARProjectPersisting`-Protokoll.
|
|
@MainActor
|
|
final class ProjectPersistenceAdapter: ARProjectPersisting {
|
|
private let project: Project
|
|
private let modelContext: ModelContext
|
|
|
|
init(project: Project, modelContext: ModelContext) {
|
|
self.project = project
|
|
self.modelContext = modelContext
|
|
}
|
|
|
|
var tank: Tank { project.tank }
|
|
var worldMap: ARWorldMap? { project.worldMap }
|
|
var tankTransform: [Float]? { project.tankTransform }
|
|
|
|
func saveWorldMap(_ data: Data) {
|
|
project.worldMapData = data
|
|
try? modelContext.save()
|
|
}
|
|
|
|
func saveTankTransform(_ transform: [Float]) {
|
|
project.tankTransform = transform
|
|
try? modelContext.save()
|
|
}
|
|
|
|
func clearTankTransform() {
|
|
project.tankTransform = nil
|
|
try? modelContext.save()
|
|
}
|
|
|
|
func savePhoto(_ imageData: Data, date: Date, coordinate: CLLocationCoordinate2D?) {
|
|
let photo = ProjectPhoto(
|
|
creationDate: date,
|
|
imageData: imageData,
|
|
latitude: coordinate?.latitude,
|
|
longitude: coordinate?.longitude,
|
|
project: project
|
|
)
|
|
modelContext.insert(photo)
|
|
try? modelContext.save()
|
|
}
|
|
}
|