|
|
|
@ -5,7 +5,6 @@ struct ContentView: View { |
|
|
|
var library: LibraryViewModel |
|
|
|
var library: LibraryViewModel |
|
|
|
var player: PlayerViewModel |
|
|
|
var player: PlayerViewModel |
|
|
|
var scanner: ScannerService |
|
|
|
var scanner: ScannerService |
|
|
|
var audio: AudioService |
|
|
|
|
|
|
|
var playlist: PlaylistViewModel |
|
|
|
var playlist: PlaylistViewModel |
|
|
|
var shazam: ShazamService |
|
|
|
var shazam: ShazamService |
|
|
|
var db: DatabaseService |
|
|
|
var db: DatabaseService |
|
|
|
@ -204,9 +203,6 @@ struct ContentView: View { |
|
|
|
handleDrop(providers) |
|
|
|
handleDrop(providers) |
|
|
|
return true |
|
|
|
return true |
|
|
|
} |
|
|
|
} |
|
|
|
.onChange(of: audio.currentTime) { _, _ in |
|
|
|
|
|
|
|
player.checkHalfway() |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
.onChange(of: library.trackCount) { _, _ in |
|
|
|
.onChange(of: library.trackCount) { _, _ in |
|
|
|
if showHome { loadHomeData() } |
|
|
|
if showHome { loadHomeData() } |
|
|
|
} |
|
|
|
} |
|
|
|
@ -289,10 +285,10 @@ struct ContentView: View { |
|
|
|
private var playerControls: some View { |
|
|
|
private var playerControls: some View { |
|
|
|
PlayerControlsView( |
|
|
|
PlayerControlsView( |
|
|
|
currentTrack: player.currentTrack, |
|
|
|
currentTrack: player.currentTrack, |
|
|
|
isPlaying: audio.isPlaying, |
|
|
|
isPlaying: player.isPlaying, |
|
|
|
currentTime: audio.currentTime, |
|
|
|
currentTime: player.currentTime, |
|
|
|
duration: audio.duration, |
|
|
|
duration: player.duration, |
|
|
|
volume: audio.volume, |
|
|
|
volume: player.volume, |
|
|
|
isShuffled: player.isShuffled, |
|
|
|
isShuffled: player.isShuffled, |
|
|
|
onPlayPause: { |
|
|
|
onPlayPause: { |
|
|
|
if player.currentTrack == nil { |
|
|
|
if player.currentTrack == nil { |
|
|
|
@ -302,23 +298,23 @@ struct ContentView: View { |
|
|
|
player.play(first) |
|
|
|
player.play(first) |
|
|
|
} |
|
|
|
} |
|
|
|
} else { |
|
|
|
} else { |
|
|
|
audio.togglePlayPause() |
|
|
|
player.togglePlayPause() |
|
|
|
} |
|
|
|
} |
|
|
|
}, |
|
|
|
}, |
|
|
|
onNext: { player.next() }, |
|
|
|
onNext: { player.next() }, |
|
|
|
onPrevious: { player.previous() }, |
|
|
|
onPrevious: { player.previous() }, |
|
|
|
onSeek: { audio.seek(to: $0) }, |
|
|
|
onSeek: { player.seek(to: $0) }, |
|
|
|
onScrubStart: { audio.beginScrubbing() }, |
|
|
|
onScrubStart: { player.beginScrubbing() }, |
|
|
|
onScrub: { audio.scrub(to: $0) }, |
|
|
|
onScrub: { player.scrub(to: $0) }, |
|
|
|
onScrubEnd: { audio.endScrubbing(at: $0) }, |
|
|
|
onScrubEnd: { player.endScrubbing(at: $0) }, |
|
|
|
onVolumeChange: { audio.volume = $0 }, |
|
|
|
onVolumeChange: { player.setVolume($0) }, |
|
|
|
onShuffleToggle: { player.toggleShuffle() }, |
|
|
|
onShuffleToggle: { player.toggleShuffle() }, |
|
|
|
onNowPlayingTap: { scrollToPlayingTrigger = UUID() } |
|
|
|
onNowPlayingTap: { scrollToPlayingTrigger = UUID() } |
|
|
|
) |
|
|
|
) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private func installKeyboardMonitor() { |
|
|
|
private func installKeyboardMonitor() { |
|
|
|
keyMonitor = NSEvent.addLocalMonitorForEvents(matching: .keyDown) { [audio, player, library, playlist] event in |
|
|
|
keyMonitor = NSEvent.addLocalMonitorForEvents(matching: .keyDown) { [player, library, playlist] event in |
|
|
|
guard event.modifierFlags.intersection([.command, .control, .option, .shift]).isEmpty else { |
|
|
|
guard event.modifierFlags.intersection([.command, .control, .option, .shift]).isEmpty else { |
|
|
|
return event |
|
|
|
return event |
|
|
|
} |
|
|
|
} |
|
|
|
@ -335,7 +331,7 @@ struct ContentView: View { |
|
|
|
player.play(first) |
|
|
|
player.play(first) |
|
|
|
} |
|
|
|
} |
|
|
|
} else { |
|
|
|
} else { |
|
|
|
audio.togglePlayPause() |
|
|
|
player.togglePlayPause() |
|
|
|
} |
|
|
|
} |
|
|
|
return nil |
|
|
|
return nil |
|
|
|
case 123: // left arrow |
|
|
|
case 123: // left arrow |
|
|
|
|