mirror of
https://github.com/danbee/persephone
synced 2025-03-04 08:39:11 +00:00
Merge pull request #34 from danbee/refactor-out-mpd-reducer
Refactor MPDReducer away
This commit is contained in:
commit
f616ae4fea
2
Cartfile
2
Cartfile
@ -2,5 +2,5 @@ github "SwiftyJSON/SwiftyJSON" ~> 4.0
|
||||
github "PromiseKit/Foundation" ~> 3.0
|
||||
github "nhurden/MediaKeyTap"
|
||||
github "krzyzanowskim/CryptoSwift"
|
||||
github "ReSwift/ReSwift" "mjarvis/swift-5.0"
|
||||
github "ReSwift/ReSwift"
|
||||
github "tonyarnold/Differ"
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
github "PromiseKit/Foundation" "3.3.2"
|
||||
github "ReSwift/ReSwift" "bc5943ad9493fc7fbad5200f690be538db8e86fb"
|
||||
github "PromiseKit/Foundation" "3.3.3"
|
||||
github "ReSwift/ReSwift" "5.0.0"
|
||||
github "SwiftyJSON/SwiftyJSON" "4.3.0"
|
||||
github "krzyzanowskim/CryptoSwift" "1.0.0"
|
||||
github "mxcl/PromiseKit" "6.8.4"
|
||||
github "mxcl/PromiseKit" "6.10.0"
|
||||
github "nhurden/MediaKeyTap" "2.2.1"
|
||||
github "tonyarnold/Differ" "1.4.2"
|
||||
github "tonyarnold/Differ" "1.4.3"
|
||||
|
||||
@ -46,9 +46,6 @@
|
||||
E43B67AD229194CD007DCF55 /* AlbumTracksDataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = E43B67AC229194CD007DCF55 /* AlbumTracksDataSource.swift */; };
|
||||
E4405192227644340090CD6F /* MPDServerController.swift in Sources */ = {isa = PBXBuildFile; fileRef = E4405191227644340090CD6F /* MPDServerController.swift */; };
|
||||
E44051942278765A0090CD6F /* App.swift in Sources */ = {isa = PBXBuildFile; fileRef = E44051932278765A0090CD6F /* App.swift */; };
|
||||
E4405196227879960090CD6F /* MPDActions.swift in Sources */ = {isa = PBXBuildFile; fileRef = E4405195227879960090CD6F /* MPDActions.swift */; };
|
||||
E440519822787CB40090CD6F /* MPDState.swift in Sources */ = {isa = PBXBuildFile; fileRef = E440519722787CB40090CD6F /* MPDState.swift */; };
|
||||
E440519A22787CF60090CD6F /* MPDReducer.swift in Sources */ = {isa = PBXBuildFile; fileRef = E440519922787CF60090CD6F /* MPDReducer.swift */; };
|
||||
E440519C227BAF2E0090CD6F /* UIActions.swift in Sources */ = {isa = PBXBuildFile; fileRef = E440519B227BAF2E0090CD6F /* UIActions.swift */; };
|
||||
E440519E227BB0720090CD6F /* UIReducer.swift in Sources */ = {isa = PBXBuildFile; fileRef = E440519D227BB0720090CD6F /* UIReducer.swift */; };
|
||||
E44051A0227BB0AB0090CD6F /* UIState.swift in Sources */ = {isa = PBXBuildFile; fileRef = E440519F227BB0AB0090CD6F /* UIState.swift */; };
|
||||
@ -56,7 +53,6 @@
|
||||
E450AD8F22262C620091BED3 /* PromiseKit.framework.dSYM in Resources */ = {isa = PBXBuildFile; fileRef = E450AD8E22262C620091BED3 /* PromiseKit.framework.dSYM */; };
|
||||
E450AD9122262C780091BED3 /* SwiftyJSON.framework.dSYM in Resources */ = {isa = PBXBuildFile; fileRef = E450AD9022262C780091BED3 /* SwiftyJSON.framework.dSYM */; };
|
||||
E450AD9522262DF10091BED3 /* CoverArtQueue.swift in Sources */ = {isa = PBXBuildFile; fileRef = E450AD9422262DF10091BED3 /* CoverArtQueue.swift */; };
|
||||
E450AD98222633920091BED3 /* Alamofire.framework.dSYM in Resources */ = {isa = PBXBuildFile; fileRef = E450AD96222633920091BED3 /* Alamofire.framework.dSYM */; };
|
||||
E450ADA12229E7C90091BED3 /* PMKFoundation.framework.dSYM in Resources */ = {isa = PBXBuildFile; fileRef = E450AD9F2229E7C90091BED3 /* PMKFoundation.framework.dSYM */; };
|
||||
E451E36B22BD214D008BE9B2 /* DraggedSongType.swift in Sources */ = {isa = PBXBuildFile; fileRef = E451E36A22BD214D008BE9B2 /* DraggedSongType.swift */; };
|
||||
E451E36E22BD2501008BE9B2 /* DraggedSong.swift in Sources */ = {isa = PBXBuildFile; fileRef = E451E36C22BD23DB008BE9B2 /* DraggedSong.swift */; };
|
||||
@ -117,6 +113,7 @@
|
||||
E4B11BBE2275EDAA0075461B /* PlayerActions.swift in Sources */ = {isa = PBXBuildFile; fileRef = E4B11BBD2275EDAA0075461B /* PlayerActions.swift */; };
|
||||
E4B11BC02275EE150075461B /* QueueActions.swift in Sources */ = {isa = PBXBuildFile; fileRef = E4B11BBF2275EE150075461B /* QueueActions.swift */; };
|
||||
E4B11BC22275EE410075461B /* AlbumListActions.swift in Sources */ = {isa = PBXBuildFile; fileRef = E4B11BC12275EE410075461B /* AlbumListActions.swift */; };
|
||||
E4B5AE7E22F4C49600CCEC65 /* MPDServerDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = E4B5AE7D22F4C49600CCEC65 /* MPDServerDelegate.swift */; };
|
||||
E4C8B53C22342005009A20F3 /* PreferencesWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = E4C8B53B22342005009A20F3 /* PreferencesWindowController.swift */; };
|
||||
E4C8B53E22349002009A20F3 /* MPDIdle.swift in Sources */ = {isa = PBXBuildFile; fileRef = E4C8B53D22349002009A20F3 /* MPDIdle.swift */; };
|
||||
E4D3BFA622B419C000C56F48 /* QueueViewController+NSOutlineViewDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = E4D3BFA522B419C000C56F48 /* QueueViewController+NSOutlineViewDelegate.swift */; };
|
||||
@ -267,9 +264,6 @@
|
||||
E43B67AC229194CD007DCF55 /* AlbumTracksDataSource.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AlbumTracksDataSource.swift; sourceTree = "<group>"; };
|
||||
E4405191227644340090CD6F /* MPDServerController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPDServerController.swift; sourceTree = "<group>"; };
|
||||
E44051932278765A0090CD6F /* App.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = App.swift; sourceTree = "<group>"; };
|
||||
E4405195227879960090CD6F /* MPDActions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPDActions.swift; sourceTree = "<group>"; };
|
||||
E440519722787CB40090CD6F /* MPDState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPDState.swift; sourceTree = "<group>"; };
|
||||
E440519922787CF60090CD6F /* MPDReducer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPDReducer.swift; sourceTree = "<group>"; };
|
||||
E440519B227BAF2E0090CD6F /* UIActions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIActions.swift; sourceTree = "<group>"; };
|
||||
E440519D227BB0720090CD6F /* UIReducer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIReducer.swift; sourceTree = "<group>"; };
|
||||
E440519F227BB0AB0090CD6F /* UIState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIState.swift; sourceTree = "<group>"; };
|
||||
@ -279,8 +273,6 @@
|
||||
E450AD8E22262C620091BED3 /* PromiseKit.framework.dSYM */ = {isa = PBXFileReference; lastKnownFileType = wrapper.dsym; name = PromiseKit.framework.dSYM; path = Carthage/Build/Mac/PromiseKit.framework.dSYM; sourceTree = "<group>"; };
|
||||
E450AD9022262C780091BED3 /* SwiftyJSON.framework.dSYM */ = {isa = PBXFileReference; lastKnownFileType = wrapper.dsym; name = SwiftyJSON.framework.dSYM; path = Carthage/Build/Mac/SwiftyJSON.framework.dSYM; sourceTree = "<group>"; };
|
||||
E450AD9422262DF10091BED3 /* CoverArtQueue.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CoverArtQueue.swift; sourceTree = "<group>"; };
|
||||
E450AD96222633920091BED3 /* Alamofire.framework.dSYM */ = {isa = PBXFileReference; lastKnownFileType = wrapper.dsym; name = Alamofire.framework.dSYM; path = Carthage/Build/Mac/Alamofire.framework.dSYM; sourceTree = "<group>"; };
|
||||
E450AD97222633920091BED3 /* Alamofire.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Alamofire.framework; path = Carthage/Build/Mac/Alamofire.framework; sourceTree = "<group>"; };
|
||||
E450AD9E2229B9BC0091BED3 /* PersephoneBridgingHeader.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PersephoneBridgingHeader.h; sourceTree = "<group>"; };
|
||||
E450AD9F2229E7C90091BED3 /* PMKFoundation.framework.dSYM */ = {isa = PBXFileReference; lastKnownFileType = wrapper.dsym; name = PMKFoundation.framework.dSYM; path = Carthage/Build/Mac/PMKFoundation.framework.dSYM; sourceTree = "<group>"; };
|
||||
E450ADA02229E7C90091BED3 /* PMKFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = PMKFoundation.framework; path = Carthage/Build/Mac/PMKFoundation.framework; sourceTree = "<group>"; };
|
||||
@ -330,6 +322,7 @@
|
||||
E4B11BBD2275EDAA0075461B /* PlayerActions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PlayerActions.swift; sourceTree = "<group>"; };
|
||||
E4B11BBF2275EE150075461B /* QueueActions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QueueActions.swift; sourceTree = "<group>"; };
|
||||
E4B11BC12275EE410075461B /* AlbumListActions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AlbumListActions.swift; sourceTree = "<group>"; };
|
||||
E4B5AE7D22F4C49600CCEC65 /* MPDServerDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPDServerDelegate.swift; sourceTree = "<group>"; };
|
||||
E4C8B53B22342005009A20F3 /* PreferencesWindowController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PreferencesWindowController.swift; sourceTree = "<group>"; };
|
||||
E4C8B53D22349002009A20F3 /* MPDIdle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPDIdle.swift; sourceTree = "<group>"; };
|
||||
E4D3BFA522B419C000C56F48 /* QueueViewController+NSOutlineViewDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "QueueViewController+NSOutlineViewDelegate.swift"; sourceTree = "<group>"; };
|
||||
@ -510,8 +503,6 @@
|
||||
E45E4FDD225168DA004B537F /* CryptoSwift.framework.dSYM */,
|
||||
E450ADA02229E7C90091BED3 /* PMKFoundation.framework */,
|
||||
E450AD9F2229E7C90091BED3 /* PMKFoundation.framework.dSYM */,
|
||||
E450AD97222633920091BED3 /* Alamofire.framework */,
|
||||
E450AD96222633920091BED3 /* Alamofire.framework.dSYM */,
|
||||
E450AD8C22262C590091BED3 /* PromiseKit.framework */,
|
||||
E450AD8E22262C620091BED3 /* PromiseKit.framework.dSYM */,
|
||||
E450AD8522262AE60091BED3 /* SwiftyJSON.framework */,
|
||||
@ -648,7 +639,6 @@
|
||||
E4B11B74226CC4D30075461B /* QueueReducer.swift */,
|
||||
E4B11B78226D346B0075461B /* AlbumListReducer.swift */,
|
||||
E4FF718F227601B400D4C412 /* PreferencesReducer.swift */,
|
||||
E440519922787CF60090CD6F /* MPDReducer.swift */,
|
||||
E440519D227BB0720090CD6F /* UIReducer.swift */,
|
||||
);
|
||||
path = Reducers;
|
||||
@ -665,7 +655,6 @@
|
||||
E4B11B67226A4FA00075461B /* QueueState.swift */,
|
||||
E4B11B69226A4FBC0075461B /* AlbumListState.swift */,
|
||||
E4FF718D2276010E00D4C412 /* PreferencesState.swift */,
|
||||
E440519722787CB40090CD6F /* MPDState.swift */,
|
||||
);
|
||||
path = State;
|
||||
sourceTree = "<group>";
|
||||
@ -677,7 +666,6 @@
|
||||
E4B11BBD2275EDAA0075461B /* PlayerActions.swift */,
|
||||
E4B11BBF2275EE150075461B /* QueueActions.swift */,
|
||||
E4FF71912276029000D4C412 /* PreferencesActions.swift */,
|
||||
E4405195227879960090CD6F /* MPDActions.swift */,
|
||||
E440519B227BAF2E0090CD6F /* UIActions.swift */,
|
||||
);
|
||||
path = Actions;
|
||||
@ -713,6 +701,7 @@
|
||||
E47E2FD4222071FD00F747E6 /* AlbumViewItem.swift */,
|
||||
E47E2FD022205C4600F747E6 /* MainSplitViewController.swift */,
|
||||
E4405191227644340090CD6F /* MPDServerController.swift */,
|
||||
E4B5AE7D22F4C49600CCEC65 /* MPDServerDelegate.swift */,
|
||||
E4E8CC912204F4B80024217A /* QueueViewController.swift */,
|
||||
E4D3BFA522B419C000C56F48 /* QueueViewController+NSOutlineViewDelegate.swift */,
|
||||
E4B11BB52275374B0075461B /* UserNotificationsController.swift */,
|
||||
@ -882,7 +871,6 @@
|
||||
E45E4FDA22515D87004B537F /* CHANGELOG.md in Resources */,
|
||||
E43B67AB22909793007DCF55 /* AlbumDetailView.xib in Resources */,
|
||||
E45E4FDC22515D87004B537F /* Cartfile in Resources */,
|
||||
E450AD98222633920091BED3 /* Alamofire.framework.dSYM in Resources */,
|
||||
E489E3A522B9D31800CA8CBD /* DraggedSongView.xib in Resources */,
|
||||
E40786202110CE70006887B1 /* Assets.xcassets in Resources */,
|
||||
E45E4FDF225168DA004B537F /* CryptoSwift.framework.dSYM in Resources */,
|
||||
@ -947,7 +935,6 @@
|
||||
E4B11B68226A4FA00075461B /* QueueState.swift in Sources */,
|
||||
E4928E0B2218D62A001D4BEA /* CGColor.swift in Sources */,
|
||||
E4D3BFA622B419C000C56F48 /* QueueViewController+NSOutlineViewDelegate.swift in Sources */,
|
||||
E4405196227879960090CD6F /* MPDActions.swift in Sources */,
|
||||
E4405192227644340090CD6F /* MPDServerController.swift in Sources */,
|
||||
E4C8B53E22349002009A20F3 /* MPDIdle.swift in Sources */,
|
||||
E4F6B460221E119B00ACF42A /* QueueDataSource.swift in Sources */,
|
||||
@ -956,7 +943,6 @@
|
||||
E41E5307223C019100173814 /* MPDClient+Status.swift in Sources */,
|
||||
E41E5310223EF6CE00173814 /* CoverArtService+Remote.swift in Sources */,
|
||||
E41E530B223C033700173814 /* MPDClient+Album.swift in Sources */,
|
||||
E440519822787CB40090CD6F /* MPDState.swift in Sources */,
|
||||
E42410B62241B956005ED6DF /* MPDClient+Database.swift in Sources */,
|
||||
E4235640228623D2001216D6 /* QueueSongTitleView.swift in Sources */,
|
||||
E451E36E22BD2501008BE9B2 /* DraggedSong.swift in Sources */,
|
||||
@ -1001,6 +987,7 @@
|
||||
E41E52FF223BF95E00173814 /* MPDClient+Transport.swift in Sources */,
|
||||
E47E2FD322205D2500F747E6 /* MainWindow.swift in Sources */,
|
||||
E47E2FD122205C4600F747E6 /* MainSplitViewController.swift in Sources */,
|
||||
E4B5AE7E22F4C49600CCEC65 /* MPDServerDelegate.swift in Sources */,
|
||||
E4B11BB8227538FA0075461B /* CurrentCoverArtView.swift in Sources */,
|
||||
E4E8CC9A22075D370024217A /* MPDSong.swift in Sources */,
|
||||
E4120D6C22AD8139004CB1F8 /* QueueView.swift in Sources */,
|
||||
@ -1023,7 +1010,6 @@
|
||||
E4A3A6A122A457B600EA2C40 /* AlbumDetailSongListView.swift in Sources */,
|
||||
E4B11B53226928F20075461B /* AppState.swift in Sources */,
|
||||
E435E3E4221CD75D00184CFC /* NSImage.swift in Sources */,
|
||||
E440519A22787CF60090CD6F /* MPDReducer.swift in Sources */,
|
||||
E4B11B6A226A4FBC0075461B /* AlbumListState.swift in Sources */,
|
||||
E41E5305223BFB0700173814 /* MPDClient+Error.swift in Sources */,
|
||||
E435E3E2221CD4E200184CFC /* NSFont.swift in Sources */,
|
||||
|
||||
@ -14,5 +14,6 @@ struct App {
|
||||
static let trackTimer = TrackTimer()
|
||||
static let userNotificationsController = UserNotificationsController()
|
||||
static let mpdServerController = MPDServerController()
|
||||
static let mpdClient = MPDClient(withDelegate: mpdServerController)
|
||||
static let mpdServerDelegate = MPDServerDelegate()
|
||||
static let mpdClient = MPDClient(withDelegate: mpdServerDelegate)
|
||||
}
|
||||
|
||||
@ -23,8 +23,8 @@ class AppDelegate: NSObject,
|
||||
@IBOutlet weak var addSelectedSongToQueueMenuItem: NSMenuItem!
|
||||
|
||||
func applicationDidFinishLaunching(_ aNotification: Notification) {
|
||||
App.mpdServerController.connect()
|
||||
instantiateUserNotificationsController()
|
||||
connectToMPDServer()
|
||||
instantiateControllers()
|
||||
|
||||
mediaKeyTap = MediaKeyTap(delegate: self)
|
||||
mediaKeyTap?.start()
|
||||
@ -36,12 +36,22 @@ class AppDelegate: NSObject,
|
||||
}
|
||||
}
|
||||
|
||||
func instantiateUserNotificationsController() {
|
||||
func connectToMPDServer() {
|
||||
let mpdServer = App.store.state.preferencesState.mpdServer
|
||||
|
||||
App.mpdClient.connect(
|
||||
host: mpdServer.hostOrDefault,
|
||||
port: mpdServer.portOrDefault
|
||||
)
|
||||
}
|
||||
|
||||
func instantiateControllers() {
|
||||
_ = App.mpdServerController
|
||||
_ = App.userNotificationsController
|
||||
}
|
||||
|
||||
func applicationWillTerminate(_ aNotification: Notification) {
|
||||
App.mpdServerController.disconnect()
|
||||
App.mpdClient.disconnect()
|
||||
}
|
||||
|
||||
func applicationDockMenu(_ sender: NSApplication) -> NSMenu? {
|
||||
@ -112,36 +122,36 @@ class AppDelegate: NSObject,
|
||||
func handle(mediaKey: MediaKey, event: KeyEvent) {
|
||||
switch mediaKey {
|
||||
case .playPause:
|
||||
App.store.dispatch(MPDPlayPauseAction())
|
||||
App.mpdClient.playPause()
|
||||
case .next, .fastForward:
|
||||
App.store.dispatch(MPDNextTrackAction())
|
||||
App.mpdClient.nextTrack()
|
||||
case .previous, .rewind:
|
||||
App.store.dispatch(MPDPrevTrackAction())
|
||||
App.mpdClient.prevTrack()
|
||||
}
|
||||
}
|
||||
|
||||
@IBAction func updateDatabase(_ sender: NSMenuItem) {
|
||||
App.store.dispatch(MPDUpdateDatabaseAction())
|
||||
App.mpdClient.updateDatabase()
|
||||
}
|
||||
|
||||
@IBAction func playPauseMenuAction(_ sender: NSMenuItem) {
|
||||
App.store.dispatch(MPDPlayPauseAction())
|
||||
App.mpdClient.playPause()
|
||||
}
|
||||
@IBAction func stopMenuAction(_ sender: NSMenuItem) {
|
||||
App.store.dispatch(MPDStopAction())
|
||||
App.mpdClient.stop()
|
||||
}
|
||||
@IBAction func nextTrackMenuAction(_ sender: NSMenuItem) {
|
||||
App.store.dispatch(MPDNextTrackAction())
|
||||
App.mpdClient.nextTrack()
|
||||
}
|
||||
@IBAction func prevTrackMenuAction(_ sender: NSMenuItem) {
|
||||
App.store.dispatch(MPDPrevTrackAction())
|
||||
App.mpdClient.prevTrack()
|
||||
}
|
||||
|
||||
@IBAction func removeQueueSongMenuAction(_ sender: NSMenuItem) {
|
||||
guard let queueItem = App.store.state.uiState.selectedQueueItem
|
||||
else { return }
|
||||
|
||||
App.store.dispatch(MPDRemoveTrack(queuePos: queueItem.queuePos))
|
||||
App.mpdClient.removeSong(at: queueItem.queuePos)
|
||||
App.store.dispatch(SetSelectedQueueItem(selectedQueueItem: nil))
|
||||
}
|
||||
@IBAction func clearQueueMenuAction(_ sender: NSMenuItem) {
|
||||
@ -155,7 +165,7 @@ class AppDelegate: NSObject,
|
||||
let result = alert.runModal()
|
||||
|
||||
if result == .alertFirstButtonReturn {
|
||||
App.store.dispatch(MPDClearQueue())
|
||||
App.mpdClient.clearQueue()
|
||||
}
|
||||
}
|
||||
|
||||
@ -164,8 +174,8 @@ class AppDelegate: NSObject,
|
||||
else { return }
|
||||
|
||||
let queueLength = App.store.state.queueState.queue.count
|
||||
App.store.dispatch(MPDAppendTrack(song: song.mpdSong))
|
||||
App.store.dispatch(MPDPlayTrack(queuePos: queueLength))
|
||||
App.mpdClient.appendSong(song.mpdSong)
|
||||
App.mpdClient.playTrack(at: queueLength)
|
||||
}
|
||||
@IBAction func playSelectedSongNextAction(_ sender: NSMenuItem) {
|
||||
let queuePos = App.store.state.queueState.queuePos
|
||||
@ -174,15 +184,13 @@ class AppDelegate: NSObject,
|
||||
queuePos > -1
|
||||
else { return }
|
||||
|
||||
App.store.dispatch(
|
||||
MPDAddSongToQueue(songUri: song.mpdSong.uriString, queuePos: queuePos + 1)
|
||||
)
|
||||
App.mpdClient.addSongToQueue(songUri: song.mpdSong.uriString, at: queuePos + 1)
|
||||
}
|
||||
@IBAction func addSelectedSongToQueueAction(_ sender: NSMenuItem) {
|
||||
guard let song = App.store.state.uiState.selectedSong
|
||||
else { return }
|
||||
|
||||
App.store.dispatch(MPDAppendTrack(song: song.mpdSong))
|
||||
App.mpdClient.appendSong(song.mpdSong)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -67,7 +67,7 @@ class AlbumDetailView: NSViewController {
|
||||
@IBAction func playAlbum(_ sender: NSButton) {
|
||||
guard let album = album else { return }
|
||||
|
||||
App.store.dispatch(MPDPlayAlbum(album: album.mpdAlbum))
|
||||
App.mpdClient.playAlbum(album.mpdAlbum)
|
||||
}
|
||||
|
||||
@IBAction func playSong(_ sender: AlbumDetailSongListView) {
|
||||
@ -75,8 +75,8 @@ class AlbumDetailView: NSViewController {
|
||||
else { return }
|
||||
|
||||
let queueLength = App.store.state.queueState.queue.count
|
||||
App.store.dispatch(MPDAppendTrack(song: song.mpdSong))
|
||||
App.store.dispatch(MPDPlayTrack(queuePos: queueLength))
|
||||
App.mpdClient.appendSong(song.mpdSong)
|
||||
App.mpdClient.playTrack(at: queueLength)
|
||||
}
|
||||
|
||||
@IBAction func menuActionPlaySong(_ sender: NSMenuItem) {
|
||||
@ -84,8 +84,8 @@ class AlbumDetailView: NSViewController {
|
||||
else { return }
|
||||
|
||||
let queueLength = App.store.state.queueState.queue.count
|
||||
App.store.dispatch(MPDAppendTrack(song: song.mpdSong))
|
||||
App.store.dispatch(MPDPlayTrack(queuePos: queueLength))
|
||||
App.mpdClient.appendSong(song.mpdSong)
|
||||
App.mpdClient.playTrack(at: queueLength)
|
||||
}
|
||||
|
||||
@IBAction func menuActionPlayNext(_ sender: Any) {
|
||||
@ -95,7 +95,7 @@ class AlbumDetailView: NSViewController {
|
||||
let queuePos = App.store.state.queueState.queuePos
|
||||
|
||||
if queuePos > -1 {
|
||||
App.store.dispatch(MPDAddSongToQueue(songUri: song.mpdSong.uriString, queuePos: queuePos + 1))
|
||||
App.mpdClient.addSongToQueue(songUri: song.mpdSong.uriString, at: queuePos + 1)
|
||||
}
|
||||
}
|
||||
|
||||
@ -103,7 +103,7 @@ class AlbumDetailView: NSViewController {
|
||||
guard let song = dataSource.albumSongs[albumTracksView.clickedRow].song
|
||||
else { return }
|
||||
|
||||
App.store.dispatch(MPDAppendTrack(song: song.mpdSong))
|
||||
App.mpdClient.appendSong(song.mpdSong)
|
||||
}
|
||||
|
||||
func getAlbumSongs(for album: Album) {
|
||||
|
||||
@ -15,71 +15,16 @@ class MPDServerController {
|
||||
$0.select { $0.preferencesState.mpdServer }
|
||||
}
|
||||
}
|
||||
|
||||
func connect() {
|
||||
DispatchQueue.main.async {
|
||||
App.store.dispatch(MPDConnectAction())
|
||||
}
|
||||
}
|
||||
|
||||
func disconnect() {
|
||||
DispatchQueue.main.async {
|
||||
App.store.dispatch(MPDDisconnectAction())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
extension MPDServerController: StoreSubscriber {
|
||||
typealias StoreSubscriberStateType = MPDServer
|
||||
|
||||
func newState(state: MPDServer) {
|
||||
disconnect()
|
||||
connect()
|
||||
}
|
||||
}
|
||||
|
||||
extension MPDServerController: MPDClientDelegate {
|
||||
func didConnect(mpdClient: MPDClient) {}
|
||||
|
||||
func willDisconnect(mpdClient: MPDClient) {
|
||||
DispatchQueue.main.async {
|
||||
App.store.dispatch(UpdateAlbumListAction(albums: []))
|
||||
}
|
||||
}
|
||||
|
||||
func didUpdateStatus(mpdClient: MPDClient, status: MPDClient.MPDStatus) {
|
||||
DispatchQueue.main.async {
|
||||
App.store.dispatch(UpdateStatusAction(status: status))
|
||||
}
|
||||
}
|
||||
|
||||
func willStartDatabaseUpdate(mpdClient: MPDClient) {
|
||||
DispatchQueue.main.async {
|
||||
App.store.dispatch(DatabaseUpdateStartedAction())
|
||||
}
|
||||
}
|
||||
|
||||
func didFinishDatabaseUpdate(mpdClient: MPDClient) {
|
||||
DispatchQueue.main.async {
|
||||
App.store.dispatch(DatabaseUpdateFinishedAction())
|
||||
}
|
||||
}
|
||||
|
||||
func didUpdateQueue(mpdClient: MPDClient, queue: [MPDClient.MPDSong]) {
|
||||
DispatchQueue.main.async {
|
||||
App.store.dispatch(UpdateQueueAction(queue: queue))
|
||||
}
|
||||
}
|
||||
|
||||
func didUpdateQueuePos(mpdClient: MPDClient, song: Int) {
|
||||
DispatchQueue.main.async {
|
||||
App.store.dispatch(UpdateQueuePosAction(queuePos: song))
|
||||
}
|
||||
}
|
||||
|
||||
func didLoadAlbums(mpdClient: MPDClient, albums: [MPDClient.MPDAlbum]) {
|
||||
DispatchQueue.main.async {
|
||||
App.store.dispatch(UpdateAlbumListAction(albums: albums))
|
||||
}
|
||||
App.mpdClient.disconnect()
|
||||
App.mpdClient.connect(
|
||||
host: state.hostOrDefault,
|
||||
port: state.portOrDefault
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
55
Persephone/Controllers/MPDServerDelegate.swift
Normal file
55
Persephone/Controllers/MPDServerDelegate.swift
Normal file
@ -0,0 +1,55 @@
|
||||
//
|
||||
// MPDServerDelegate.swift
|
||||
// Persephone
|
||||
//
|
||||
// Created by Daniel Barber on 2019/8/02.
|
||||
// Copyright © 2019 Dan Barber. All rights reserved.
|
||||
//
|
||||
|
||||
import Foundation
|
||||
|
||||
class MPDServerDelegate: MPDClientDelegate {
|
||||
func didConnect(mpdClient: MPDClient) {}
|
||||
|
||||
func willDisconnect(mpdClient: MPDClient) {
|
||||
DispatchQueue.main.async {
|
||||
App.store.dispatch(UpdateAlbumListAction(albums: []))
|
||||
}
|
||||
}
|
||||
|
||||
func didUpdateStatus(mpdClient: MPDClient, status: MPDClient.MPDStatus) {
|
||||
DispatchQueue.main.async {
|
||||
App.store.dispatch(UpdateStatusAction(status: status))
|
||||
}
|
||||
}
|
||||
|
||||
func willStartDatabaseUpdate(mpdClient: MPDClient) {
|
||||
DispatchQueue.main.async {
|
||||
App.store.dispatch(DatabaseUpdateStartedAction())
|
||||
}
|
||||
}
|
||||
|
||||
func didFinishDatabaseUpdate(mpdClient: MPDClient) {
|
||||
DispatchQueue.main.async {
|
||||
App.store.dispatch(DatabaseUpdateFinishedAction())
|
||||
}
|
||||
}
|
||||
|
||||
func didUpdateQueue(mpdClient: MPDClient, queue: [MPDClient.MPDSong]) {
|
||||
DispatchQueue.main.async {
|
||||
App.store.dispatch(UpdateQueueAction(queue: queue))
|
||||
}
|
||||
}
|
||||
|
||||
func didUpdateQueuePos(mpdClient: MPDClient, song: Int) {
|
||||
DispatchQueue.main.async {
|
||||
App.store.dispatch(UpdateQueuePosAction(queuePos: song))
|
||||
}
|
||||
}
|
||||
|
||||
func didLoadAlbums(mpdClient: MPDClient, albums: [MPDClient.MPDAlbum]) {
|
||||
DispatchQueue.main.async {
|
||||
App.store.dispatch(UpdateAlbumListAction(albums: albums))
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -36,7 +36,7 @@ class QueueViewController: NSViewController {
|
||||
let queuePos = queueView.selectedRow - 1
|
||||
|
||||
if queuePos >= 0 {
|
||||
App.store.dispatch(MPDRemoveTrack(queuePos: queuePos))
|
||||
App.mpdClient.removeSong(at: queuePos)
|
||||
}
|
||||
default:
|
||||
super.keyDown(with: event)
|
||||
@ -47,7 +47,7 @@ class QueueViewController: NSViewController {
|
||||
let queuePos = queueView.selectedRow - 1
|
||||
|
||||
if queuePos >= 0 {
|
||||
App.store.dispatch(MPDPlayTrack(queuePos: queuePos))
|
||||
App.mpdClient.playTrack(at: queuePos)
|
||||
}
|
||||
}
|
||||
|
||||
@ -55,14 +55,14 @@ class QueueViewController: NSViewController {
|
||||
let queuePos = queueView.clickedRow - 1
|
||||
|
||||
if queuePos >= 0 {
|
||||
App.store.dispatch(MPDPlayTrack(queuePos: queuePos))
|
||||
App.mpdClient.playTrack(at: queuePos)
|
||||
}
|
||||
}
|
||||
@IBAction func removeSongMenuAction(_ sender: NSMenuItem) {
|
||||
let queuePos = queueView.clickedRow - 1
|
||||
|
||||
if queuePos >= 0 {
|
||||
App.store.dispatch(MPDRemoveTrack(queuePos: queuePos))
|
||||
App.mpdClient.removeSong(at: queuePos)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -47,7 +47,7 @@ class WindowController: NSWindowController {
|
||||
override func keyDown(with event: NSEvent) {
|
||||
switch event.keyCode {
|
||||
case NSEvent.keyCodeSpace:
|
||||
App.store.dispatch(MPDPlayPauseAction())
|
||||
App.mpdClient.playPause()
|
||||
default:
|
||||
nextResponder?.keyDown(with: event)
|
||||
}
|
||||
@ -130,7 +130,7 @@ class WindowController: NSWindowController {
|
||||
case .leftMouseUp:
|
||||
let seekTime = Float(sender.integerValue) / 1000
|
||||
|
||||
App.store.dispatch(MPDSeekCurrentSong(timeInSeconds: seekTime))
|
||||
App.mpdClient.seekCurrentSong(timeInSeconds: seekTime)
|
||||
default:
|
||||
break
|
||||
}
|
||||
@ -142,22 +142,22 @@ class WindowController: NSWindowController {
|
||||
|
||||
switch transportAction {
|
||||
case .prevTrack:
|
||||
App.store.dispatch(MPDPrevTrackAction())
|
||||
App.mpdClient.prevTrack()
|
||||
case .playPause:
|
||||
App.store.dispatch(MPDPlayPauseAction())
|
||||
App.mpdClient.playPause()
|
||||
case .stop:
|
||||
App.store.dispatch(MPDStopAction())
|
||||
App.mpdClient.stop()
|
||||
case .nextTrack:
|
||||
App.store.dispatch(MPDNextTrackAction())
|
||||
App.mpdClient.nextTrack()
|
||||
}
|
||||
}
|
||||
|
||||
@IBAction func handleShuffleButton(_ sender: NSButton) {
|
||||
App.store.dispatch(MPDSetShuffleAction(shuffleState: sender.state == .on))
|
||||
App.mpdClient.setShuffleState(shuffleState: sender.state == .on)
|
||||
}
|
||||
|
||||
@IBAction func handleRepeatButton(_ sender: NSButton) {
|
||||
App.store.dispatch(MPDSetRepeatAction(repeatState: sender.state == .on))
|
||||
App.mpdClient.setRepeatState(repeatState: sender.state == .on)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -92,10 +92,10 @@ class QueueDataSource: NSObject, NSOutlineViewDataSource {
|
||||
guard queuePos != newQueuePos
|
||||
else { return false }
|
||||
|
||||
App.store.dispatch(MPDMoveSongInQueue(oldQueuePos: queuePos, newQueuePos: newQueuePos))
|
||||
App.mpdClient.moveSongInQueue(at: queuePos, to: newQueuePos)
|
||||
return true
|
||||
case let .albumSongItem(uri):
|
||||
App.store.dispatch(MPDAddSongToQueue(songUri: uri, queuePos: newQueuePos))
|
||||
App.mpdClient.addSongToQueue(songUri: uri, at: newQueuePos)
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
@ -17,7 +17,7 @@
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>APPL</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>0.12.0-alpha</string>
|
||||
<string>0.13.0-alpha</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>1</string>
|
||||
<key>LSApplicationCategoryType</key>
|
||||
|
||||
@ -1,59 +0,0 @@
|
||||
//
|
||||
// MPDActions.swift
|
||||
// Persephone
|
||||
//
|
||||
// Created by Daniel Barber on 2019/4/30.
|
||||
// Copyright © 2019 Dan Barber. All rights reserved.
|
||||
//
|
||||
|
||||
import ReSwift
|
||||
|
||||
struct MPDConnectAction: Action {}
|
||||
struct MPDDisconnectAction: Action {}
|
||||
|
||||
struct MPDPlayPauseAction: Action {}
|
||||
struct MPDStopAction: Action {}
|
||||
struct MPDNextTrackAction: Action {}
|
||||
struct MPDPrevTrackAction: Action {}
|
||||
|
||||
struct MPDClearQueue: Action {}
|
||||
|
||||
struct MPDMoveSongInQueue: Action {
|
||||
let oldQueuePos: Int
|
||||
let newQueuePos: Int
|
||||
}
|
||||
|
||||
struct MPDAddSongToQueue: Action {
|
||||
let songUri: String
|
||||
let queuePos: Int
|
||||
}
|
||||
|
||||
struct MPDAppendTrack: Action {
|
||||
let song: MPDClient.MPDSong
|
||||
}
|
||||
|
||||
struct MPDRemoveTrack: Action {
|
||||
let queuePos: Int
|
||||
}
|
||||
|
||||
struct MPDPlayTrack: Action {
|
||||
let queuePos: Int
|
||||
}
|
||||
|
||||
struct MPDPlayAlbum: Action {
|
||||
let album: MPDClient.MPDAlbum
|
||||
}
|
||||
|
||||
struct MPDSeekCurrentSong: Action {
|
||||
let timeInSeconds: Float
|
||||
}
|
||||
|
||||
struct MPDUpdateDatabaseAction: Action {}
|
||||
|
||||
struct MPDSetShuffleAction: Action {
|
||||
let shuffleState: Bool
|
||||
}
|
||||
|
||||
struct MPDSetRepeatAction: Action {
|
||||
let repeatState: Bool
|
||||
}
|
||||
@ -13,6 +13,5 @@ struct AppState: StateType {
|
||||
var queueState = QueueState()
|
||||
var albumListState = AlbumListState()
|
||||
var preferencesState = PreferencesState()
|
||||
var mpdState = MPDState()
|
||||
var uiState = UIState()
|
||||
}
|
||||
|
||||
@ -1,11 +0,0 @@
|
||||
//
|
||||
// MPDState.swift
|
||||
// Persephone
|
||||
//
|
||||
// Created by Daniel Barber on 2019/4/30.
|
||||
// Copyright © 2019 Dan Barber. All rights reserved.
|
||||
//
|
||||
|
||||
import ReSwift
|
||||
|
||||
struct MPDState: StateType {}
|
||||
@ -14,7 +14,6 @@ func appReducer(action: Action, state: AppState?) -> AppState {
|
||||
queueState: queueReducer(action: action, state: state?.queueState),
|
||||
albumListState: albumListReducer(action: action, state: state?.albumListState),
|
||||
preferencesState: preferencesReducer(action: action, state: state?.preferencesState),
|
||||
mpdState: mpdReducer(action: action, state: state?.mpdState),
|
||||
uiState: uiReducer(action: action, state: state?.uiState)
|
||||
)
|
||||
}
|
||||
|
||||
@ -1,71 +0,0 @@
|
||||
//
|
||||
// MPDReducer.swift
|
||||
// Persephone
|
||||
//
|
||||
// Created by Daniel Barber on 2019/4/30.
|
||||
// Copyright © 2019 Dan Barber. All rights reserved.
|
||||
//
|
||||
|
||||
import ReSwift
|
||||
|
||||
func mpdReducer(action: Action, state: MPDState?) -> MPDState {
|
||||
let state = state ?? MPDState()
|
||||
|
||||
switch action {
|
||||
case is MPDConnectAction:
|
||||
let mpdServer = App.store.state.preferencesState.mpdServer
|
||||
App.mpdClient.connect(
|
||||
host: mpdServer.hostOrDefault,
|
||||
port: mpdServer.portOrDefault
|
||||
)
|
||||
case is MPDDisconnectAction:
|
||||
App.mpdClient.disconnect()
|
||||
|
||||
case is MPDPlayPauseAction:
|
||||
App.mpdClient.playPause()
|
||||
case is MPDStopAction:
|
||||
App.mpdClient.stop()
|
||||
case is MPDNextTrackAction:
|
||||
App.mpdClient.nextTrack()
|
||||
case is MPDPrevTrackAction:
|
||||
App.mpdClient.prevTrack()
|
||||
|
||||
case is MPDClearQueue:
|
||||
App.mpdClient.clearQueue()
|
||||
|
||||
case let action as MPDMoveSongInQueue:
|
||||
App.mpdClient.moveSongInQueue(at: action.oldQueuePos, to: action.newQueuePos)
|
||||
|
||||
case let action as MPDAddSongToQueue:
|
||||
App.mpdClient.addSongToQueue(songUri: action.songUri, at: action.queuePos)
|
||||
|
||||
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)
|
||||
|
||||
case let action as MPDPlayAlbum:
|
||||
App.mpdClient.playAlbum(action.album)
|
||||
|
||||
case let action as MPDSeekCurrentSong:
|
||||
App.mpdClient.seekCurrentSong(timeInSeconds: action.timeInSeconds)
|
||||
|
||||
case let action as MPDSetShuffleAction:
|
||||
App.mpdClient.setShuffleState(shuffleState: action.shuffleState)
|
||||
|
||||
case let action as MPDSetRepeatAction:
|
||||
App.mpdClient.setRepeatState(repeatState: action.repeatState)
|
||||
|
||||
case is MPDUpdateDatabaseAction:
|
||||
App.mpdClient.updateDatabase()
|
||||
|
||||
default:
|
||||
break
|
||||
}
|
||||
|
||||
return state
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user