103 lines
3.0 KiB
Swift
103 lines
3.0 KiB
Swift
//
|
||
// TankEditor.swift
|
||
// GasTankAR
|
||
//
|
||
// Created by Dennis Nemec on 25.08.26.
|
||
//
|
||
|
||
import SwiftUI
|
||
|
||
/// Wiederverwendbare Auswahl für die Tank-Eigenschaften (Größe, Farbe,
|
||
/// Aufstellungsart und halbtransparente Darstellung).
|
||
struct TankEditor: View {
|
||
@Binding var tank: Tank
|
||
|
||
var body: some View {
|
||
Picker("Größe", selection: $tank.size) {
|
||
ForEach(TankSize.allCases) { size in
|
||
Text(size.displayName).tag(size)
|
||
}
|
||
}
|
||
|
||
Picker("Farbe", selection: $tank.color) {
|
||
ForEach(TankColor.allCases) { color in
|
||
Text(color.displayName).tag(color)
|
||
}
|
||
}
|
||
|
||
VStack(alignment: .leading, spacing: 8) {
|
||
Text("Aufstellungsart")
|
||
|
||
HStack(spacing: 12) {
|
||
ForEach(TankPlacement.allCases) { placement in
|
||
PlacementOption(
|
||
placement: placement,
|
||
isSelected: tank.placement == placement
|
||
) {
|
||
tank.placement = placement
|
||
}
|
||
}
|
||
}
|
||
}
|
||
.padding(.vertical, 4)
|
||
|
||
Toggle("Halbtransparent (nur Deckel)", isOn: $tank.showLidOnly)
|
||
.disabled(tank.placement != .belowGround)
|
||
.onChange(of: tank.placement) { _, newPlacement in
|
||
// Option nur für unterirdische Tanks sinnvoll – sonst zurücksetzen.
|
||
if newPlacement != .belowGround {
|
||
tank.showLidOnly = false
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
/// Auswahlkachel für eine Aufstellungsart mit Icon und umrahmter Auswahl.
|
||
private struct PlacementOption: View {
|
||
let placement: TankPlacement
|
||
let isSelected: Bool
|
||
let action: () -> Void
|
||
|
||
var body: some View {
|
||
Button(action: action) {
|
||
VStack(spacing: 8) {
|
||
Image(placement.imageName)
|
||
.renderingMode(.template)
|
||
.resizable()
|
||
.scaledToFit()
|
||
.foregroundStyle(Color.accentColor)
|
||
.frame(height: 72)
|
||
.scaleEffect(1.25)
|
||
.padding(8)
|
||
|
||
Text(placement.displayName)
|
||
.font(.caption)
|
||
.foregroundStyle(isSelected ? .primary : .secondary)
|
||
}
|
||
.frame(maxWidth: .infinity)
|
||
.padding(8)
|
||
.background(
|
||
(isSelected ? Color.accentColor.opacity(0.12) : Color.clear),
|
||
in: .rect(cornerRadius: 12)
|
||
)
|
||
.overlay {
|
||
RoundedRectangle(cornerRadius: 12)
|
||
.stroke(
|
||
isSelected ? Color.accentColor : Color.secondary.opacity(0.4),
|
||
lineWidth: isSelected ? 2 : 1
|
||
)
|
||
}
|
||
}
|
||
.buttonStyle(.plain)
|
||
}
|
||
}
|
||
|
||
#Preview {
|
||
@Previewable @State var tank = Tank()
|
||
return Form {
|
||
Section("Tankauswahl") {
|
||
TankEditor(tank: $tank)
|
||
}
|
||
}
|
||
}
|