co-maps/iphone/Maps/UI/Routing/RoutingOptionsView.swift
2025-11-22 13:58:55 +01:00

150 lines
6.3 KiB
Swift

import SwiftUI
/// View for the routing options
struct RoutingOptionsView: View {
// MARK: Properties
/// The dismiss action of the environment
@Environment(\.dismiss) private var dismiss
/// If toll roads should be avoided during routing
@State var shouldAvoidTollRoadsWhileRouting: Bool = false
/// If unpaved roads should be avoided during routing
@State var shouldAvoidUnpavedRoadsWhileRouting: Bool = false
/// If paved roads should be avoided during routing
@State var shouldAvoidPavedRoadsWhileRouting: Bool = false
/// If ferries should be avoided during routing
@State var shouldAvoidFerriesWhileRouting: Bool = false
/// If motorways should be avoided during routing
@State var shouldAvoidMotorwaysWhileRouting: Bool = false
/// If steps should be avoided during routing
@State var shouldAvoidStepsWhileRouting: Bool = false
/// The actual view
var body: some View {
NavigationView {
List {
Section {
Toggle(isOn: $shouldAvoidTollRoadsWhileRouting) {
Label {
Text("avoid_tolls")
} icon: {
Image(shouldAvoidTollRoadsWhileRouting ? "tolls.slash" : "tolls")
.foregroundStyle(.secondary)
}
}
.tint(.accent)
Toggle(isOn: $shouldAvoidUnpavedRoadsWhileRouting) {
Label {
Text("avoid_unpaved")
} icon: {
Image(shouldAvoidUnpavedRoadsWhileRouting ? "unpaved.slash" : "unpaved")
.foregroundStyle(.secondary)
}
}
.tint(.accent)
.disabled(shouldAvoidPavedRoadsWhileRouting)
Toggle(isOn: $shouldAvoidPavedRoadsWhileRouting) {
Label {
Text("avoid_paved")
} icon: {
Image(shouldAvoidPavedRoadsWhileRouting ? "paved.slash" : "paved")
.foregroundStyle(.secondary)
}
}
.tint(.accent)
.disabled(shouldAvoidUnpavedRoadsWhileRouting)
Toggle(isOn: $shouldAvoidMotorwaysWhileRouting) {
Label {
Text("avoid_motorways")
} icon: {
Image(shouldAvoidMotorwaysWhileRouting ? "motorways.slash" : "motorways")
.foregroundStyle(.secondary)
}
}
.tint(.accent)
Toggle(isOn: $shouldAvoidFerriesWhileRouting) {
Label {
Text("avoid_ferry")
} icon: {
Image(shouldAvoidFerriesWhileRouting ? "ferries.slash" : "ferries")
.foregroundStyle(.secondary)
}
}
.tint(.accent)
Toggle(isOn: $shouldAvoidStepsWhileRouting) {
Label {
Text("avoid_steps")
} icon: {
Image(shouldAvoidStepsWhileRouting ? "steps.slash" : "steps")
.foregroundStyle(.secondary)
}
}
.tint(.accent)
}
}
.navigationTitle(String(localized: "driving_options_title"))
.navigationBarTitleDisplayMode(.inline)
.toolbar {
ToolbarItem(placement: .confirmationAction) {
Button {
dismiss()
} label: {
Text("close")
}
}
}
}
.navigationViewStyle(StackNavigationViewStyle())
.onAppear {
shouldAvoidTollRoadsWhileRouting = Settings.shouldAvoidTollRoadsWhileRouting
shouldAvoidUnpavedRoadsWhileRouting = Settings.shouldAvoidUnpavedRoadsWhileRouting
shouldAvoidPavedRoadsWhileRouting = Settings.shouldAvoidPavedRoadsWhileRouting
shouldAvoidFerriesWhileRouting = Settings.shouldAvoidFerriesWhileRouting
shouldAvoidMotorwaysWhileRouting = Settings.shouldAvoidMotorwaysWhileRouting
shouldAvoidStepsWhileRouting = Settings.shouldAvoidStepsWhileRouting
}
.onChange(of: shouldAvoidTollRoadsWhileRouting) { changedShouldAvoidTollRoadsWhileRouting in
Settings.shouldAvoidTollRoadsWhileRouting = changedShouldAvoidTollRoadsWhileRouting
}
.onChange(of: shouldAvoidUnpavedRoadsWhileRouting) { changedShouldAvoidUnpavedRoadsWhileRouting in
Settings.shouldAvoidUnpavedRoadsWhileRouting = changedShouldAvoidUnpavedRoadsWhileRouting
if changedShouldAvoidUnpavedRoadsWhileRouting {
shouldAvoidPavedRoadsWhileRouting = false
}
}
.onChange(of: shouldAvoidPavedRoadsWhileRouting) { changedShouldAvoidPavedRoadsWhileRouting in
Settings.shouldAvoidPavedRoadsWhileRouting = changedShouldAvoidPavedRoadsWhileRouting
if changedShouldAvoidPavedRoadsWhileRouting {
shouldAvoidUnpavedRoadsWhileRouting = false
}
}
.onChange(of: shouldAvoidFerriesWhileRouting) { changedShouldAvoidFerriesWhileRouting in
Settings.shouldAvoidFerriesWhileRouting = changedShouldAvoidFerriesWhileRouting
}
.onChange(of: shouldAvoidMotorwaysWhileRouting) { changedShouldAvoidMotorwaysWhileRouting in
Settings.shouldAvoidMotorwaysWhileRouting = changedShouldAvoidMotorwaysWhileRouting
}
.onChange(of: shouldAvoidStepsWhileRouting) { changedShouldAvoidStepsWhileRouting in
Settings.shouldAvoidStepsWhileRouting = changedShouldAvoidStepsWhileRouting
}
.accentColor(.toolbarAccent)
}
}