diff --git a/Cable/BatteriesView.swift b/Cable/BatteriesView.swift index 247286c..6f5b8dc 100644 --- a/Cable/BatteriesView.swift +++ b/Cable/BatteriesView.swift @@ -1,6 +1,7 @@ import SwiftUI struct BatteriesView: View { + @Binding var editMode: EditMode let system: ElectricalSystem let batteries: [SavedBattery] let onEdit: (SavedBattery) -> Void @@ -120,6 +121,7 @@ struct BatteriesView: View { init( system: ElectricalSystem, batteries: [SavedBattery], + editMode: Binding = .constant(.inactive), onEdit: @escaping (SavedBattery) -> Void = { _ in }, onDelete: @escaping (IndexSet) -> Void = { _ in } ) { @@ -127,6 +129,7 @@ struct BatteriesView: View { self.batteries = batteries self.onEdit = onEdit self.onDelete = onDelete + self._editMode = editMode } var body: some View { @@ -145,6 +148,7 @@ struct BatteriesView: View { batteryRow(for: battery) } .buttonStyle(.plain) + .disabled(editMode == .active) .listRowInsets(.init(top: 12, leading: 16, bottom: 12, trailing: 16)) .listRowSeparator(.hidden) .listRowBackground(Color.clear) @@ -153,6 +157,7 @@ struct BatteriesView: View { } .listStyle(.plain) .scrollContentBackground(.hidden) + .environment(\.editMode, $editMode) } } .frame(maxWidth: .infinity, maxHeight: .infinity) @@ -599,6 +604,7 @@ private enum BatteriesViewPreviewData { #Preview { BatteriesView( system: BatteriesViewPreviewData.system, - batteries: BatteriesViewPreviewData.batteries + batteries: BatteriesViewPreviewData.batteries, + editMode: .constant(.inactive) ) } diff --git a/Cable/LoadsView.swift b/Cable/LoadsView.swift index 9ba995c..93e5d31 100644 --- a/Cable/LoadsView.swift +++ b/Cable/LoadsView.swift @@ -64,9 +64,11 @@ struct LoadsView: View { BatteriesView( system: system, batteries: savedBatteries, + editMode: $editMode, onEdit: { editBattery($0) }, onDelete: deleteBatteries ) + .environment(\.editMode, $editMode) .tag(ComponentTab.batteries) .tabItem { Label( @@ -91,7 +93,6 @@ struct LoadsView: View { ) } } - .environment(\.editMode, $editMode) } } .navigationBarTitleDisplayMode(.inline) @@ -145,11 +146,9 @@ struct LoadsView: View { .disabled(selectedComponentTab == .chargers) if selectedComponentTab == .components { EditButton() - .environment(\.editMode, $editMode) .disabled(savedLoads.isEmpty) } else if selectedComponentTab == .batteries { EditButton() - .environment(\.editMode, $editMode) .disabled(savedBatteries.isEmpty) } } @@ -236,11 +235,12 @@ struct LoadsView: View { } } } - .onChange(of: selectedComponentTab) { newValue in + .onChange(of: selectedComponentTab) { oldValue, newValue in if newValue == .chargers { editMode = .inactive } } + .environment(\.editMode, $editMode) } private var summarySection: some View { @@ -326,6 +326,7 @@ struct LoadsView: View { loadRow(for: load) } .buttonStyle(.plain) + .disabled(editMode == .active) .listRowInsets(.init(top: 12, leading: 16, bottom: 12, trailing: 16)) .listRowSeparator(.hidden) .listRowBackground(Color.clear) @@ -335,6 +336,7 @@ struct LoadsView: View { .listStyle(.plain) .scrollContentBackground(.hidden) .accessibilityIdentifier("loads-list") + .environment(\.editMode, $editMode) } .background(Color(.systemGroupedBackground)) } @@ -375,44 +377,7 @@ struct LoadsView: View { .foregroundStyle(.secondary) } - ViewThatFits(in: .horizontal) { - HStack(spacing: 12) { - metricBadge( - label: fuseMetricLabel, - value: "\(recommendedFuse(for: load)) A", - tint: .pink - ) - metricBadge( - label: cableMetricLabel, - value: wireGaugeString(for: load), - tint: .teal - ) - metricBadge( - label: lengthMetricLabel, - value: lengthString(for: load), - tint: .orange - ) - Spacer() - } - - VStack(alignment: .leading, spacing: 8) { - metricBadge( - label: fuseMetricLabel, - value: "\(recommendedFuse(for: load)) A", - tint: .pink - ) - metricBadge( - label: cableMetricLabel, - value: wireGaugeString(for: load), - tint: .teal - ) - metricBadge( - label: lengthMetricLabel, - value: lengthString(for: load), - tint: .orange - ) - } - } + metricsSection(for: load) } .padding(.vertical, 16) .padding(.horizontal, 16) @@ -455,6 +420,59 @@ struct LoadsView: View { } } + @ViewBuilder + private func metricsSection(for load: SavedLoad) -> some View { + if editMode == .active { + horizontalMetrics(for: load) + } else { + ViewThatFits(in: .horizontal) { + horizontalMetrics(for: load) + verticalMetrics(for: load) + } + } + } + + private func horizontalMetrics(for load: SavedLoad) -> some View { + HStack(spacing: 12) { + metricBadge( + label: fuseMetricLabel, + value: "\(recommendedFuse(for: load)) A", + tint: .pink + ) + metricBadge( + label: cableMetricLabel, + value: wireGaugeString(for: load), + tint: .teal + ) + metricBadge( + label: lengthMetricLabel, + value: lengthString(for: load), + tint: .orange + ) + Spacer(minLength: 0) + } + } + + private func verticalMetrics(for load: SavedLoad) -> some View { + VStack(alignment: .leading, spacing: 8) { + metricBadge( + label: fuseMetricLabel, + value: "\(recommendedFuse(for: load)) A", + tint: .pink + ) + metricBadge( + label: cableMetricLabel, + value: wireGaugeString(for: load), + tint: .teal + ) + metricBadge( + label: lengthMetricLabel, + value: lengthString(for: load), + tint: .orange + ) + } + } + private var fuseMetricLabel: String { NSLocalizedString( "loads.metric.fuse", @@ -809,3 +827,4 @@ struct LoadsView: View { case chargers } } + diff --git a/Cable/de.lproj/Localizable.strings b/Cable/de.lproj/Localizable.strings index df47b35..df26b85 100644 --- a/Cable/de.lproj/Localizable.strings +++ b/Cable/de.lproj/Localizable.strings @@ -150,7 +150,7 @@ "loads.overview.status.missing_details.plural" = "Verbraucher"; "loads.overview.status.missing_details.banner" = "Konfiguration deiner Verbraucher abschließen"; "loads.metric.fuse" = "Sicherung"; -"loads.metric.cable" = "Querschnitt"; +"loads.metric.cable" = "Schnitt"; "loads.metric.length" = "Länge"; "battery.bank.header.title" = "Batteriebank";