78 lines
2.1 KiB
Swift
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))
|
|
}
|
|
}
|