diff --git a/Persephone/Controllers/QueueViewController.swift b/Persephone/Controllers/QueueViewController.swift index 0c7ed7d..1a9fa09 100644 --- a/Persephone/Controllers/QueueViewController.swift +++ b/Persephone/Controllers/QueueViewController.swift @@ -43,6 +43,12 @@ class QueueViewController: NSViewController, App.store.dispatch(MPDPlayTrack(queuePos: newQueuePos)) } } + + @IBAction func removeSongMenuAction(_ sender: NSMenuItem) { + let row = queueView.clickedRow + + App.store.dispatch(MPDRemoveTrack(queuePos: row - 1)) + } func outlineView( _ outlineView: NSOutlineView, diff --git a/Persephone/MPDClient/Extensions/MPDClient+Command.swift b/Persephone/MPDClient/Extensions/MPDClient+Command.swift index 0934c89..f6bdea2 100644 --- a/Persephone/MPDClient/Extensions/MPDClient+Command.swift +++ b/Persephone/MPDClient/Extensions/MPDClient+Command.swift @@ -62,6 +62,10 @@ extension MPDClient { guard let song = userData["song"] as? MPDSong else { return } sendAppendSong(song) + case .removeSong: + guard let queuePos = userData["queuePos"] as? Int + else { return } + sendRemoveSong(at: queuePos) // Album commands case .fetchAllAlbums: diff --git a/Persephone/MPDClient/Extensions/MPDClient+Queue.swift b/Persephone/MPDClient/Extensions/MPDClient+Queue.swift index 43c4792..1d08788 100644 --- a/Persephone/MPDClient/Extensions/MPDClient+Queue.swift +++ b/Persephone/MPDClient/Extensions/MPDClient+Queue.swift @@ -22,6 +22,10 @@ extension MPDClient { enqueueCommand(command: .appendSong, userData: ["song": song]) } + func removeSong(at queuePos: Int) { + enqueueCommand(command: .removeSong, userData: ["queuePos": queuePos]) + } + func sendPlayTrack(at queuePos: Int) { mpd_run_play_pos(self.connection, UInt32(queuePos)) } @@ -48,4 +52,8 @@ extension MPDClient { func sendAppendSong(_ song: MPDSong) { mpd_run_add(self.connection, song.uri) } + + func sendRemoveSong(at queuePos: Int) { + mpd_run_delete(self.connection, UInt32(queuePos)) + } } diff --git a/Persephone/MPDClient/Models/MPDCommand.swift b/Persephone/MPDClient/Models/MPDCommand.swift index eaa328c..4cb2013 100644 --- a/Persephone/MPDClient/Models/MPDCommand.swift +++ b/Persephone/MPDClient/Models/MPDCommand.swift @@ -31,6 +31,7 @@ extension MPDClient { case playTrack case replaceQueue case appendSong + case removeSong // Album commands case fetchAllAlbums diff --git a/Persephone/Resources/Base.lproj/Main.storyboard b/Persephone/Resources/Base.lproj/Main.storyboard index 572256c..650d657 100644 --- a/Persephone/Resources/Base.lproj/Main.storyboard +++ b/Persephone/Resources/Base.lproj/Main.storyboard @@ -75,6 +75,16 @@ + + + + + + + + + + @@ -694,6 +704,7 @@ + @@ -744,8 +755,18 @@ + + + + + + + + + + - + diff --git a/Persephone/State/Actions/MPDActions.swift b/Persephone/State/Actions/MPDActions.swift index d748a5a..3b26521 100644 --- a/Persephone/State/Actions/MPDActions.swift +++ b/Persephone/State/Actions/MPDActions.swift @@ -20,6 +20,10 @@ struct MPDAppendTrack: Action { let song: MPDClient.MPDSong } +struct MPDRemoveTrack: Action { + let queuePos: Int +} + struct MPDPlayTrack: Action { let queuePos: Int } diff --git a/Persephone/State/Reducers/MPDReducer.swift b/Persephone/State/Reducers/MPDReducer.swift index 81b992f..70780a0 100644 --- a/Persephone/State/Reducers/MPDReducer.swift +++ b/Persephone/State/Reducers/MPDReducer.swift @@ -33,6 +33,9 @@ func mpdReducer(action: Action, state: MPDState?) -> MPDState { case let action as MPDAppendTrack: App.mpdClient.appendSong(action.song) + case let action as MPDRemoveTrack: + App.mpdClient.removeSong(at: action.queuePos) + case let action as MPDPlayTrack: App.mpdClient.playTrack(at: action.queuePos)