// // ParamView.swift // ShedCalc // // Created by Jacky Jack on 28/07/2026. // import SwiftUI struct ParamView: View { //@StateObject private var viewModel = ParamModel() @Environment(ParamModel.self) var paramModel var body: some View { @Bindable var paramModel = paramModel VStack { HStack { Text("Set shed dimensions") } HStack { Text("Width") TextField("Width", value: Binding( get: { paramModel.width }, set: { newValue in if !newValue.isNaN && !newValue.isInfinite && newValue > 0.5 { paramModel.width = newValue } } ), format: .number.precision(.fractionLength(2))) } HStack { Text("Length") TextField("Length", value: Binding( get: { paramModel.length }, set: { newValue in if !newValue.isNaN && !newValue.isInfinite && newValue > 0.5 { paramModel.length = newValue } } ), format: .number.precision(.fractionLength(2))) } HStack { Text("Height") TextField("Height", value: Binding( get: { paramModel.height }, set: { newValue in if !newValue.isNaN && !newValue.isInfinite && newValue > 0.5 { paramModel.height = newValue } } ), format: .number.precision(.fractionLength(2))) } HStack { Text("Spacing") TextField("Spacing", value: Binding( get: { paramModel.beamSpace }, set: { newValue in if !newValue.isNaN && !newValue.isInfinite && newValue > 0.15 { paramModel.beamSpace = newValue } } ), format: .number.precision(.fractionLength(2))) } HStack { Text("Total floor area: \(paramModel.floorArea(), specifier: "%.2f") m^2") } HStack { Text("Total roof area: \(paramModel.roofArea(), specifier: "%.2f") m^2") } HStack { Text("Total wall beams: \(paramModel.totalWallBeams()) ") } HStack { Text("Set Timber Prices") } HStack { Text("OSB per sheet price") TextField("per sheet", value: Binding( get: { paramModel.OSBSheetPrice }, set: { newValue in if !newValue.isNaN && !newValue.isInfinite && newValue > 0.15 { paramModel.beamSpace = newValue } } ), format: .number) } HStack { Text("Beam price per meter") TextField("per meter", value: Binding( get: { paramModel.timberBeamPrice }, set: { newValue in if !newValue.isNaN && !newValue.isInfinite && newValue > 0.0 { paramModel.timberBeamPrice = newValue } } ), format: .number) Text("Piece size") TextField("per meter", value: Binding( get: { paramModel.timberLengthSize }, set: { newValue in if !newValue.isNaN && !newValue.isInfinite && newValue > 0.0 { paramModel.timberLengthSize = newValue } } ), format: .number) } HStack { Text("Felt price") TextField("per meter", value: $paramModel.feltPrice, format: .number) Text("Felt width") TextField("per meter", value: $paramModel.feltWidth, format: .number) Text("Felt length") TextField("per meter", value: $paramModel.feltLength, format: .number) } HStack { Text("Cladding dimensions and price") } HStack { Text("Cladding price per meter") TextField("", value: $paramModel.claddingPrice, format: .number) Text("Length") TextField("", value: $paramModel.claddingLength, format: .number) Text("Width") TextField("", value: $paramModel.claddingWidth, format: .number) Text("Overlap") TextField("", value: $paramModel.claddingOverlap, format: .number) } } } }