import SwiftUI import FlixyDesign import FlixyPlayback /// Auswahl von Ton- und Untertitelspur. struct TrackPickerSheet: View { let model: PlayerModel @Environment(\.dismiss) private var dismiss @Environment(\.flixyAccent) private var accent var body: some View { NavigationStack { List { if !model.audioTracks.isEmpty { Section("player.audioTracks") { ForEach(model.audioTracks) { track in row( title: track.displayName, isSelected: model.selectedAudioTrack == track ) { model.selectAudioTrack(track) } } } } if !model.subtitleTracks.isEmpty { Section("player.subtitleTracks") { // „Aus" gehört in dieselbe Liste wie die Spuren, nicht // als eigener Schalter daneben: es ist eine Auswahl // unter mehreren, keine getrennte Eigenschaft. row( title: String(localized: "player.subtitlesOff"), isSelected: model.selectedSubtitleTrack == nil ) { model.selectSubtitleTrack(nil) } ForEach(model.subtitleTracks) { track in row( title: track.displayName, isSelected: model.selectedSubtitleTrack == track ) { model.selectSubtitleTrack(track) } } } } } .scrollContentBackground(.hidden) .background(Color.flixyCanvas) .navigationTitle(Text("player.tracks")) .navigationBarTitleDisplayMode(.inline) .toolbar { ToolbarItem(placement: .confirmationAction) { Button("action.close") { dismiss() } } } } .presentationDetents([.medium]) } private func row(title: String, isSelected: Bool, action: @escaping () -> Void) -> some View { Button(action: action) { HStack { Text(title) .foregroundStyle(Color.flixyTextPrimary) Spacer() if isSelected { Image(systemName: "checkmark").foregroundStyle(accent) } } .contentShape(.rect) } .buttonStyle(.plain) .listRowBackground(Color.flixySurface) .accessibilityAddTraits(isSelected ? [.isButton, .isSelected] : .isButton) } }