From 8301ed0780b3f9185284d9d4c1a0aadb24c5a661 Mon Sep 17 00:00:00 2001 From: Daniel Barber Date: Fri, 2 Aug 2019 15:23:44 -0400 Subject: [PATCH] Refactor MPDReducer away These actions should not go through ReSwift. * Remove Alamofire reference * Upgrade ReSwift to 5 --- Cartfile | 2 +- Cartfile.resolved | 8 +-- Persephone.xcodeproj/project.pbxproj | 22 ++---- Persephone/App.swift | 3 +- Persephone/AppDelegate.swift | 44 +++++++----- Persephone/Controllers/AlbumDetailView.swift | 14 ++-- .../Controllers/MPDServerController.swift | 65 ++--------------- .../Controllers/MPDServerDelegate.swift | 55 ++++++++++++++ .../Controllers/QueueViewController.swift | 8 +-- Persephone/Controllers/WindowController.swift | 16 ++--- Persephone/DataSources/QueueDataSource.swift | 4 +- Persephone/Info.plist | 2 +- Persephone/State/Actions/MPDActions.swift | 59 --------------- Persephone/State/AppState.swift | 1 - Persephone/State/MPDState.swift | 11 --- Persephone/State/Reducers/AppReducer.swift | 1 - Persephone/State/Reducers/MPDReducer.swift | 71 ------------------- 17 files changed, 119 insertions(+), 267 deletions(-) create mode 100644 Persephone/Controllers/MPDServerDelegate.swift delete mode 100644 Persephone/State/Actions/MPDActions.swift delete mode 100644 Persephone/State/MPDState.swift delete mode 100644 Persephone/State/Reducers/MPDReducer.swift diff --git a/Cartfile b/Cartfile index 65c902d..7feddde 100644 --- a/Cartfile +++ b/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" diff --git a/Cartfile.resolved b/Cartfile.resolved index 035ec4b..06f673b 100644 --- a/Cartfile.resolved +++ b/Cartfile.resolved @@ -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" diff --git a/Persephone.xcodeproj/project.pbxproj b/Persephone.xcodeproj/project.pbxproj index cafb356..17e0b48 100644 --- a/Persephone.xcodeproj/project.pbxproj +++ b/Persephone.xcodeproj/project.pbxproj @@ -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 = ""; }; E4405191227644340090CD6F /* MPDServerController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPDServerController.swift; sourceTree = ""; }; E44051932278765A0090CD6F /* App.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = App.swift; sourceTree = ""; }; - E4405195227879960090CD6F /* MPDActions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPDActions.swift; sourceTree = ""; }; - E440519722787CB40090CD6F /* MPDState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPDState.swift; sourceTree = ""; }; - E440519922787CF60090CD6F /* MPDReducer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPDReducer.swift; sourceTree = ""; }; E440519B227BAF2E0090CD6F /* UIActions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIActions.swift; sourceTree = ""; }; E440519D227BB0720090CD6F /* UIReducer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIReducer.swift; sourceTree = ""; }; E440519F227BB0AB0090CD6F /* UIState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIState.swift; sourceTree = ""; }; @@ -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 = ""; }; E450AD9022262C780091BED3 /* SwiftyJSON.framework.dSYM */ = {isa = PBXFileReference; lastKnownFileType = wrapper.dsym; name = SwiftyJSON.framework.dSYM; path = Carthage/Build/Mac/SwiftyJSON.framework.dSYM; sourceTree = ""; }; E450AD9422262DF10091BED3 /* CoverArtQueue.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CoverArtQueue.swift; sourceTree = ""; }; - E450AD96222633920091BED3 /* Alamofire.framework.dSYM */ = {isa = PBXFileReference; lastKnownFileType = wrapper.dsym; name = Alamofire.framework.dSYM; path = Carthage/Build/Mac/Alamofire.framework.dSYM; sourceTree = ""; }; - E450AD97222633920091BED3 /* Alamofire.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Alamofire.framework; path = Carthage/Build/Mac/Alamofire.framework; sourceTree = ""; }; E450AD9E2229B9BC0091BED3 /* PersephoneBridgingHeader.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PersephoneBridgingHeader.h; sourceTree = ""; }; E450AD9F2229E7C90091BED3 /* PMKFoundation.framework.dSYM */ = {isa = PBXFileReference; lastKnownFileType = wrapper.dsym; name = PMKFoundation.framework.dSYM; path = Carthage/Build/Mac/PMKFoundation.framework.dSYM; sourceTree = ""; }; E450ADA02229E7C90091BED3 /* PMKFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = PMKFoundation.framework; path = Carthage/Build/Mac/PMKFoundation.framework; sourceTree = ""; }; @@ -330,6 +322,7 @@ E4B11BBD2275EDAA0075461B /* PlayerActions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PlayerActions.swift; sourceTree = ""; }; E4B11BBF2275EE150075461B /* QueueActions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QueueActions.swift; sourceTree = ""; }; E4B11BC12275EE410075461B /* AlbumListActions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AlbumListActions.swift; sourceTree = ""; }; + E4B5AE7D22F4C49600CCEC65 /* MPDServerDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPDServerDelegate.swift; sourceTree = ""; }; E4C8B53B22342005009A20F3 /* PreferencesWindowController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PreferencesWindowController.swift; sourceTree = ""; }; E4C8B53D22349002009A20F3 /* MPDIdle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPDIdle.swift; sourceTree = ""; }; E4D3BFA522B419C000C56F48 /* QueueViewController+NSOutlineViewDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "QueueViewController+NSOutlineViewDelegate.swift"; sourceTree = ""; }; @@ -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 = ""; @@ -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 */, diff --git a/Persephone/App.swift b/Persephone/App.swift index 39e8615..f3e493e 100644 --- a/Persephone/App.swift +++ b/Persephone/App.swift @@ -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) } diff --git a/Persephone/AppDelegate.swift b/Persephone/AppDelegate.swift index 58b8ff7..691932a 100644 --- a/Persephone/AppDelegate.swift +++ b/Persephone/AppDelegate.swift @@ -23,7 +23,7 @@ class AppDelegate: NSObject, @IBOutlet weak var addSelectedSongToQueueMenuItem: NSMenuItem! func applicationDidFinishLaunching(_ aNotification: Notification) { - App.mpdServerController.connect() + connectToMPDServer() instantiateUserNotificationsController() mediaKeyTap = MediaKeyTap(delegate: self) @@ -36,12 +36,22 @@ class AppDelegate: NSObject, } } + func connectToMPDServer() { + let mpdServer = App.store.state.preferencesState.mpdServer + + App.mpdClient.connect( + host: mpdServer.hostOrDefault, + port: mpdServer.portOrDefault + ) + } + func instantiateUserNotificationsController() { + _ = 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) } } diff --git a/Persephone/Controllers/AlbumDetailView.swift b/Persephone/Controllers/AlbumDetailView.swift index 6e76e6e..f7ca636 100644 --- a/Persephone/Controllers/AlbumDetailView.swift +++ b/Persephone/Controllers/AlbumDetailView.swift @@ -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) { diff --git a/Persephone/Controllers/MPDServerController.swift b/Persephone/Controllers/MPDServerController.swift index 1bff238..b357071 100644 --- a/Persephone/Controllers/MPDServerController.swift +++ b/Persephone/Controllers/MPDServerController.swift @@ -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 + ) } } diff --git a/Persephone/Controllers/MPDServerDelegate.swift b/Persephone/Controllers/MPDServerDelegate.swift new file mode 100644 index 0000000..404bf13 --- /dev/null +++ b/Persephone/Controllers/MPDServerDelegate.swift @@ -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)) + } + } +} diff --git a/Persephone/Controllers/QueueViewController.swift b/Persephone/Controllers/QueueViewController.swift index 21e4572..660aa7f 100644 --- a/Persephone/Controllers/QueueViewController.swift +++ b/Persephone/Controllers/QueueViewController.swift @@ -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) } } } diff --git a/Persephone/Controllers/WindowController.swift b/Persephone/Controllers/WindowController.swift index dda0f41..c920afd 100644 --- a/Persephone/Controllers/WindowController.swift +++ b/Persephone/Controllers/WindowController.swift @@ -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) } } diff --git a/Persephone/DataSources/QueueDataSource.swift b/Persephone/DataSources/QueueDataSource.swift index 4ee13e9..28a4adf 100644 --- a/Persephone/DataSources/QueueDataSource.swift +++ b/Persephone/DataSources/QueueDataSource.swift @@ -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 } } diff --git a/Persephone/Info.plist b/Persephone/Info.plist index 8d5bbfe..66b5dd7 100644 --- a/Persephone/Info.plist +++ b/Persephone/Info.plist @@ -17,7 +17,7 @@ CFBundlePackageType APPL CFBundleShortVersionString - 0.12.0-alpha + 0.13.0-alpha CFBundleVersion 1 LSApplicationCategoryType diff --git a/Persephone/State/Actions/MPDActions.swift b/Persephone/State/Actions/MPDActions.swift deleted file mode 100644 index c6d9a78..0000000 --- a/Persephone/State/Actions/MPDActions.swift +++ /dev/null @@ -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 -} diff --git a/Persephone/State/AppState.swift b/Persephone/State/AppState.swift index 70fd2b5..cec9ba0 100644 --- a/Persephone/State/AppState.swift +++ b/Persephone/State/AppState.swift @@ -13,6 +13,5 @@ struct AppState: StateType { var queueState = QueueState() var albumListState = AlbumListState() var preferencesState = PreferencesState() - var mpdState = MPDState() var uiState = UIState() } diff --git a/Persephone/State/MPDState.swift b/Persephone/State/MPDState.swift deleted file mode 100644 index 30cbfd1..0000000 --- a/Persephone/State/MPDState.swift +++ /dev/null @@ -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 {} diff --git a/Persephone/State/Reducers/AppReducer.swift b/Persephone/State/Reducers/AppReducer.swift index c66228a..ed0a499 100644 --- a/Persephone/State/Reducers/AppReducer.swift +++ b/Persephone/State/Reducers/AppReducer.swift @@ -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) ) } diff --git a/Persephone/State/Reducers/MPDReducer.swift b/Persephone/State/Reducers/MPDReducer.swift deleted file mode 100644 index 56d2dbe..0000000 --- a/Persephone/State/Reducers/MPDReducer.swift +++ /dev/null @@ -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 -}