Files
QueueCube/QueueCube/Views/NowPlayingView.swift
2025-06-10 11:09:44 -07:00

78 lines
2.1 KiB
Swift

//
// NowPlayingView.swift
// QueueCube
//
// Created by James Magahern on 3/3/25.
//
import SwiftUI
@Observable
class NowPlayingViewModel
{
var onPlayPause: (NowPlayingViewModel) -> Void = { _ in }
var onNext: (NowPlayingViewModel) -> Void = { _ in }
var onPrev: (NowPlayingViewModel) -> Void = { _ in }
var onVolumeChange: (NowPlayingViewModel) -> Void = { _ in }
var isPlaying: Bool = false
var title: String = ""
var subtitle: String = ""
var volume: Double = 0.5
}
struct NowPlayingView: View
{
@State var model: NowPlayingViewModel
var body: some View {
content()
.background(background())
}
@ViewBuilder
private func content() -> some View {
HStack {
VStack(alignment: .leading) {
Text(model.title)
.font(.title3)
.lineLimit(1)
Text(model.subtitle)
.foregroundColor(.secondary)
.font(.subheadline)
.lineLimit(1)
}
.padding()
Spacer()
controls()
.padding()
}
}
@ViewBuilder
private func controls() -> some View {
let playPauseImageName = model.isPlaying ? "pause.fill" : "play.fill"
HStack {
Slider(
value: $model.volume,
in: 0.0...1.0,
onEditingChanged: { _ in model.onVolumeChange(model) }
).frame(maxWidth: 100.0)
Button(action: { model.onPrev(model) } ) { Image(systemName: "arrow.left.to.line.compact") }
Button(action: { model.onPlayPause(model) }) { Image(systemName: playPauseImageName) }
Button(action: { model.onNext(model) }) { Image(systemName: "arrow.right.to.line.compact") }
}
}
@ViewBuilder
private func background() -> some View {
RoundedRectangle(cornerRadius: 8.0)
.fill(Color(white: 0.0, opacity: 0.4))
}
}