133 lines
4.7 KiB
Swift
133 lines
4.7 KiB
Swift
//
|
|
// EnhancedPlayerPickerView.swift
|
|
// Mobile Music Assistant
|
|
//
|
|
// Created by Sven Hanold on 26.03.26.
|
|
//
|
|
|
|
import SwiftUI
|
|
|
|
enum PlayerSelection {
|
|
case localPlayer
|
|
case remotePlayer(MAPlayer)
|
|
}
|
|
|
|
struct EnhancedPlayerPickerView: View {
|
|
@Environment(\.dismiss) private var dismiss
|
|
let players: [MAPlayer]
|
|
let supportsLocalPlayback: Bool
|
|
let onSelect: (PlayerSelection) -> Void
|
|
|
|
var body: some View {
|
|
NavigationStack {
|
|
List {
|
|
// Local iPhone Player
|
|
if supportsLocalPlayback {
|
|
Section {
|
|
Button {
|
|
onSelect(.localPlayer)
|
|
dismiss()
|
|
} label: {
|
|
HStack {
|
|
Image(systemName: "iphone")
|
|
.foregroundStyle(.blue)
|
|
|
|
VStack(alignment: .leading, spacing: 4) {
|
|
Text("This iPhone")
|
|
.font(.headline)
|
|
.foregroundStyle(.primary)
|
|
|
|
Text("Play directly on this device")
|
|
.font(.caption)
|
|
.foregroundStyle(.secondary)
|
|
}
|
|
|
|
Spacer()
|
|
|
|
Image(systemName: "chevron.right")
|
|
.foregroundStyle(.secondary)
|
|
.font(.caption)
|
|
}
|
|
}
|
|
} header: {
|
|
Text("Local Playback")
|
|
}
|
|
}
|
|
|
|
// Remote Players
|
|
if !players.isEmpty {
|
|
Section {
|
|
ForEach(players) { player in
|
|
Button {
|
|
onSelect(.remotePlayer(player))
|
|
dismiss()
|
|
} label: {
|
|
HStack {
|
|
VStack(alignment: .leading, spacing: 4) {
|
|
Text(player.name)
|
|
.font(.headline)
|
|
.foregroundStyle(.primary)
|
|
|
|
HStack(spacing: 6) {
|
|
Image(systemName: stateIcon(for: player.state))
|
|
.foregroundStyle(stateColor(for: player.state))
|
|
.font(.caption)
|
|
Text(player.state.rawValue.capitalized)
|
|
.font(.caption)
|
|
.foregroundStyle(.secondary)
|
|
}
|
|
}
|
|
|
|
Spacer()
|
|
|
|
Image(systemName: "chevron.right")
|
|
.foregroundStyle(.secondary)
|
|
.font(.caption)
|
|
}
|
|
}
|
|
.disabled(!player.available)
|
|
}
|
|
} header: {
|
|
Text("Remote Players")
|
|
}
|
|
}
|
|
}
|
|
.navigationTitle("Play on...")
|
|
.navigationBarTitleDisplayMode(.inline)
|
|
.toolbar {
|
|
ToolbarItem(placement: .cancellationAction) {
|
|
Button("Cancel") {
|
|
dismiss()
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
private func stateIcon(for state: PlayerState) -> String {
|
|
switch state {
|
|
case .playing: return "play.circle.fill"
|
|
case .paused: return "pause.circle.fill"
|
|
case .idle: return "stop.circle"
|
|
case .off: return "power.circle"
|
|
}
|
|
}
|
|
|
|
private func stateColor(for state: PlayerState) -> Color {
|
|
switch state {
|
|
case .playing: return .green
|
|
case .paused: return .orange
|
|
case .idle: return .gray
|
|
case .off: return .red
|
|
}
|
|
}
|
|
}
|
|
|
|
#Preview {
|
|
EnhancedPlayerPickerView(
|
|
players: [],
|
|
supportsLocalPlayback: true,
|
|
onSelect: { _ in }
|
|
)
|
|
}
|