From 0a318ce81e6aff8d00c6cf9edcf8fd1a24572133 Mon Sep 17 00:00:00 2001 From: Daniel Barber Date: Fri, 11 Oct 2019 13:55:07 -0400 Subject: [PATCH] Working artist browser --- Persephone.xcodeproj/project.pbxproj | 232 +++++++++--------- .../Album Browser}/AlbumCoverButton.swift | 0 .../Album Browser}/AlbumDataSource.swift | 0 ...wController+NSCollectionViewDelegate.swift | 0 .../Album Browser}/AlbumViewController.swift | 9 +- .../Album Browser}/AlbumViewItem.swift | 0 .../Browser/Album Browser}/AlbumViewItem.xib | 2 +- .../AlbumDetailSongListView.swift | 0 .../AlbumDetailSongRowView.swift | 0 .../AlbumDetailView+NSTableViewDelegate.swift | 0 .../Album Detail}/AlbumDetailView.swift | 0 .../Browser/Album Detail}/AlbumDetailView.xib | 50 ++-- .../Album Detail}/AlbumTracksDataSource.swift | 0 .../Artist Browser}/ArtistDataSource.swift | 6 +- .../Artist Browser/ArtistViewController.swift | 63 +++++ .../Artist Browser/ArtistViewItem.swift | 66 +++++ .../Browser/Artist Browser/ArtistViewItem.xib | 80 ++++++ .../Browser}/BrowseController.swift | 0 .../CoverArtPrefsController.swift | 0 .../GeneralPrefsViewController.swift | 1 - .../PreferencesViewController.swift | 0 .../PreferencesWindowController.swift | 0 .../Queue}/CurrentCoverArtView.swift | 0 .../Queue}/QueueDataSource.swift | 0 .../Queue}/QueueSongTitleView.swift | 0 .../Queue}/QueueView.swift | 0 ...ViewController+NSOutlineViewDelegate.swift | 0 .../Queue}/QueueViewController.swift | 0 .../Shared}/DraggedSongView.swift | 0 .../Shared}/DraggedSongView.xib | 0 .../Shared}/Extensions/CGColor.swift | 0 .../Shared}/Extensions/NSEvent.swift | 0 .../Shared}/Extensions/NSFont.swift | 0 .../Shared}/Extensions/NSImage.swift | 0 .../Shared}/Extensions/NSPasteboard.swift | 0 .../Shared}/Extensions/NSPasteboardItem.swift | 0 .../NSUserInterfaceItemIdentifier.swift | 2 + .../Shared}/Extensions/NSView.swift | 0 .../Shared}/Extensions/Notification.swift | 0 .../Layouts/FlexibleGridViewLayout.swift} | 6 +- .../Shared}/MPDServerController.swift | 0 .../Shared}/MPDServerDelegate.swift | 0 .../Shared}/UserNotificationsController.swift | 0 .../Window}/Base.lproj/Main.storyboard | 24 +- .../Window}/MainSplitViewController.swift | 0 .../Window}/MainWindow.swift | 0 .../Window}/WindowController.swift | 0 .../Controllers/ArtistViewController.swift | 59 ----- Persephone/Controllers/ArtistViewItem.swift | 25 -- Persephone/Layouts/ArtistViewLayout.swift | 22 -- Persephone/Models/Artist.swift | 24 ++ Persephone/Resources/ArtistViewItem.xib | 38 --- Persephone/State/ArtistListState.swift | 2 +- Persephone/State/Reducers/ArtistReducer.swift | 2 +- Persephone/Views/AlbumItemView.swift | 17 -- Persephone/Views/ArtistItemView.swift | 15 -- Persephone/Views/BrowseViewButton.swift | 18 -- 57 files changed, 409 insertions(+), 354 deletions(-) rename Persephone/{Views => Components/Browser/Album Browser}/AlbumCoverButton.swift (100%) rename Persephone/{DataSources => Components/Browser/Album Browser}/AlbumDataSource.swift (100%) rename Persephone/{Controllers => Components/Browser/Album Browser}/AlbumViewController+NSCollectionViewDelegate.swift (100%) rename Persephone/{Controllers => Components/Browser/Album Browser}/AlbumViewController.swift (91%) rename Persephone/{Controllers => Components/Browser/Album Browser}/AlbumViewItem.swift (100%) rename Persephone/{Resources => Components/Browser/Album Browser}/AlbumViewItem.xib (98%) rename Persephone/{Views => Components/Browser/Album Detail}/AlbumDetailSongListView.swift (100%) rename Persephone/{Views => Components/Browser/Album Detail}/AlbumDetailSongRowView.swift (100%) rename Persephone/{Controllers => Components/Browser/Album Detail}/AlbumDetailView+NSTableViewDelegate.swift (100%) rename Persephone/{Controllers => Components/Browser/Album Detail}/AlbumDetailView.swift (100%) rename Persephone/{Resources => Components/Browser/Album Detail}/AlbumDetailView.xib (96%) rename Persephone/{DataSources => Components/Browser/Album Detail}/AlbumTracksDataSource.swift (100%) rename Persephone/{DataSources => Components/Browser/Artist Browser}/ArtistDataSource.swift (82%) create mode 100644 Persephone/Components/Browser/Artist Browser/ArtistViewController.swift create mode 100644 Persephone/Components/Browser/Artist Browser/ArtistViewItem.swift create mode 100644 Persephone/Components/Browser/Artist Browser/ArtistViewItem.xib rename Persephone/{Controllers => Components/Browser}/BrowseController.swift (100%) rename Persephone/{Preferences/Controllers => Components/Preferences}/CoverArtPrefsController.swift (100%) rename Persephone/{Preferences/Controllers => Components/Preferences}/GeneralPrefsViewController.swift (98%) rename Persephone/{Preferences/Controllers => Components/Preferences}/PreferencesViewController.swift (100%) rename Persephone/{Preferences/Controllers => Components/Preferences}/PreferencesWindowController.swift (100%) rename Persephone/{Views => Components/Queue}/CurrentCoverArtView.swift (100%) rename Persephone/{DataSources => Components/Queue}/QueueDataSource.swift (100%) rename Persephone/{Views => Components/Queue}/QueueSongTitleView.swift (100%) rename Persephone/{Views => Components/Queue}/QueueView.swift (100%) rename Persephone/{Controllers => Components/Queue}/QueueViewController+NSOutlineViewDelegate.swift (100%) rename Persephone/{Controllers => Components/Queue}/QueueViewController.swift (100%) rename Persephone/{Views => Components/Shared}/DraggedSongView.swift (100%) rename Persephone/{Resources => Components/Shared}/DraggedSongView.xib (100%) rename Persephone/{ => Components/Shared}/Extensions/CGColor.swift (100%) rename Persephone/{ => Components/Shared}/Extensions/NSEvent.swift (100%) rename Persephone/{ => Components/Shared}/Extensions/NSFont.swift (100%) rename Persephone/{ => Components/Shared}/Extensions/NSImage.swift (100%) rename Persephone/{ => Components/Shared}/Extensions/NSPasteboard.swift (100%) rename Persephone/{ => Components/Shared}/Extensions/NSPasteboardItem.swift (100%) rename Persephone/{ => Components/Shared}/Extensions/NSUserInterfaceItemIdentifier.swift (93%) rename Persephone/{ => Components/Shared}/Extensions/NSView.swift (100%) rename Persephone/{ => Components/Shared}/Extensions/Notification.swift (100%) rename Persephone/{Layouts/AlbumViewLayout.swift => Components/Shared/Layouts/FlexibleGridViewLayout.swift} (91%) rename Persephone/{Controllers => Components/Shared}/MPDServerController.swift (100%) rename Persephone/{Controllers => Components/Shared}/MPDServerDelegate.swift (100%) rename Persephone/{Controllers => Components/Shared}/UserNotificationsController.swift (100%) rename Persephone/{Resources => Components/Window}/Base.lproj/Main.storyboard (99%) rename Persephone/{Controllers => Components/Window}/MainSplitViewController.swift (100%) rename Persephone/{Views => Components/Window}/MainWindow.swift (100%) rename Persephone/{Controllers => Components/Window}/WindowController.swift (100%) delete mode 100644 Persephone/Controllers/ArtistViewController.swift delete mode 100644 Persephone/Controllers/ArtistViewItem.swift delete mode 100644 Persephone/Layouts/ArtistViewLayout.swift create mode 100644 Persephone/Models/Artist.swift delete mode 100644 Persephone/Resources/ArtistViewItem.xib delete mode 100644 Persephone/Views/AlbumItemView.swift delete mode 100644 Persephone/Views/ArtistItemView.swift delete mode 100644 Persephone/Views/BrowseViewButton.swift diff --git a/Persephone.xcodeproj/project.pbxproj b/Persephone.xcodeproj/project.pbxproj index 64da2ec..47e1dcd 100644 --- a/Persephone.xcodeproj/project.pbxproj +++ b/Persephone.xcodeproj/project.pbxproj @@ -54,6 +54,9 @@ 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 */; }; + E442CCCD2347E73C00004E0C /* Artist.swift in Sources */ = {isa = PBXBuildFile; fileRef = E442CCCC2347E73C00004E0C /* Artist.swift */; }; + E442CCCF2347E90800004E0C /* ArtistViewItem.xib in Resources */ = {isa = PBXBuildFile; fileRef = E442CCCE2347E90800004E0C /* ArtistViewItem.xib */; }; + E442CCD12347EAEB00004E0C /* ArtistViewItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = E442CCD02347EAEB00004E0C /* ArtistViewItem.swift */; }; E450AD7E222620A10091BED3 /* Album.swift in Sources */ = {isa = PBXBuildFile; fileRef = E450AD7D222620A10091BED3 /* Album.swift */; }; E450AD9522262DF10091BED3 /* CoverArtQueue.swift in Sources */ = {isa = PBXBuildFile; fileRef = E450AD9422262DF10091BED3 /* CoverArtQueue.swift */; }; E451E36B22BD214D008BE9B2 /* DraggedSongType.swift in Sources */ = {isa = PBXBuildFile; fileRef = E451E36A22BD214D008BE9B2 /* DraggedSongType.swift */; }; @@ -67,9 +70,8 @@ E47E2FD122205C4600F747E6 /* MainSplitViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = E47E2FD022205C4600F747E6 /* MainSplitViewController.swift */; }; E47E2FD322205D2500F747E6 /* MainWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = E47E2FD222205D2500F747E6 /* MainWindow.swift */; }; E47E2FD5222071FD00F747E6 /* AlbumViewItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = E47E2FD4222071FD00F747E6 /* AlbumViewItem.swift */; }; - E47E2FD72220720300F747E6 /* AlbumItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E47E2FD62220720300F747E6 /* AlbumItemView.swift */; }; E47E2FDD2220A6D100F747E6 /* Time.swift in Sources */ = {isa = PBXBuildFile; fileRef = E47E2FDC2220A6D100F747E6 /* Time.swift */; }; - E47E2FE52220AA0700F747E6 /* AlbumViewLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = E47E2FE42220AA0700F747E6 /* AlbumViewLayout.swift */; }; + E47E2FE52220AA0700F747E6 /* FlexibleGridViewLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = E47E2FE42220AA0700F747E6 /* FlexibleGridViewLayout.swift */; }; E489E39922B85D0400CA8CBD /* NSPasteboard.swift in Sources */ = {isa = PBXBuildFile; fileRef = E489E39822B85D0400CA8CBD /* NSPasteboard.swift */; }; E489E39D22B9CF0000CA8CBD /* NSView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E489E39C22B9CF0000CA8CBD /* NSView.swift */; }; E489E3A422B9D31800CA8CBD /* DraggedSongView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E489E3A222B9D31800CA8CBD /* DraggedSongView.swift */; }; @@ -103,11 +105,8 @@ 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 */; }; - E4BBD2E923356DC100702C16 /* BrowseViewButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = E4BBD2E823356DC100702C16 /* BrowseViewButton.swift */; }; E4BBD2EB2335735500702C16 /* BrowseController.swift in Sources */ = {isa = PBXBuildFile; fileRef = E4BBD2EA2335735500702C16 /* BrowseController.swift */; }; E4BBD2ED2335798E00702C16 /* ArtistViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = E4BBD2EC2335798E00702C16 /* ArtistViewController.swift */; }; - E4BBD2F0233579EF00702C16 /* ArtistViewItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = E4BBD2EE233579EF00702C16 /* ArtistViewItem.swift */; }; - E4BBD2F1233579EF00702C16 /* ArtistViewItem.xib in Resources */ = {isa = PBXBuildFile; fileRef = E4BBD2EF233579EF00702C16 /* ArtistViewItem.xib */; }; E4BBD2F323357C0700702C16 /* ArtistListState.swift in Sources */ = {isa = PBXBuildFile; fileRef = E4BBD2F223357C0700702C16 /* ArtistListState.swift */; }; E4C8B53C22342005009A20F3 /* PreferencesWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = E4C8B53B22342005009A20F3 /* PreferencesWindowController.swift */; }; E4C8B53E22349002009A20F3 /* MPDIdle.swift in Sources */ = {isa = PBXBuildFile; fileRef = E4C8B53D22349002009A20F3 /* MPDIdle.swift */; }; @@ -120,11 +119,9 @@ E4EB2379220F10B8008C70C0 /* MPDPair.swift in Sources */ = {isa = PBXBuildFile; fileRef = E4EB2378220F10B8008C70C0 /* MPDPair.swift */; }; E4EB237B220F7CF1008C70C0 /* MPDAlbum.swift in Sources */ = {isa = PBXBuildFile; fileRef = E4EB237A220F7CF1008C70C0 /* MPDAlbum.swift */; }; E4F26F732341166200D45FF9 /* ArtistDataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = E4F26F722341166200D45FF9 /* ArtistDataSource.swift */; }; - E4F26F75234117D600D45FF9 /* ArtistItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E4F26F74234117D600D45FF9 /* ArtistItemView.swift */; }; E4F26F7723411AE300D45FF9 /* ArtistListActions.swift in Sources */ = {isa = PBXBuildFile; fileRef = E4F26F7623411AE300D45FF9 /* ArtistListActions.swift */; }; E4F26F7923411B1500D45FF9 /* ArtistReducer.swift in Sources */ = {isa = PBXBuildFile; fileRef = E4F26F7823411B1500D45FF9 /* ArtistReducer.swift */; }; E4F26F7B23411D5400D45FF9 /* MPDClient+Artist.swift in Sources */ = {isa = PBXBuildFile; fileRef = E4F26F7A23411D5400D45FF9 /* MPDClient+Artist.swift */; }; - E4F26F7D2341441C00D45FF9 /* ArtistViewLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = E4F26F7C2341441C00D45FF9 /* ArtistViewLayout.swift */; }; E4F6B460221E119B00ACF42A /* QueueDataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = E4F6B45F221E119B00ACF42A /* QueueDataSource.swift */; }; E4F6B463221E125900ACF42A /* QueueItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = E4F6B462221E125900ACF42A /* QueueItem.swift */; }; E4F6B467221E233200ACF42A /* AlbumDataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = E4F6B466221E233200ACF42A /* AlbumDataSource.swift */; }; @@ -266,6 +263,9 @@ 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 = ""; }; + E442CCCC2347E73C00004E0C /* Artist.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Artist.swift; sourceTree = ""; }; + E442CCCE2347E90800004E0C /* ArtistViewItem.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = ArtistViewItem.xib; path = "Persephone/Components/Browser/Artist Browser/ArtistViewItem.xib"; sourceTree = SOURCE_ROOT; }; + E442CCD02347EAEB00004E0C /* ArtistViewItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ArtistViewItem.swift; path = "Persephone/Components/Browser/Artist Browser/ArtistViewItem.swift"; sourceTree = SOURCE_ROOT; }; E450AD7D222620A10091BED3 /* Album.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Album.swift; sourceTree = ""; }; E450AD9422262DF10091BED3 /* CoverArtQueue.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CoverArtQueue.swift; sourceTree = ""; }; E450AD9E2229B9BC0091BED3 /* PersephoneBridgingHeader.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PersephoneBridgingHeader.h; sourceTree = ""; }; @@ -279,9 +279,8 @@ E47E2FD022205C4600F747E6 /* MainSplitViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainSplitViewController.swift; sourceTree = ""; }; E47E2FD222205D2500F747E6 /* MainWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainWindow.swift; sourceTree = ""; }; E47E2FD4222071FD00F747E6 /* AlbumViewItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AlbumViewItem.swift; sourceTree = ""; }; - E47E2FD62220720300F747E6 /* AlbumItemView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AlbumItemView.swift; sourceTree = ""; }; E47E2FDC2220A6D100F747E6 /* Time.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Time.swift; sourceTree = ""; }; - E47E2FE42220AA0700F747E6 /* AlbumViewLayout.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AlbumViewLayout.swift; sourceTree = ""; }; + E47E2FE42220AA0700F747E6 /* FlexibleGridViewLayout.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FlexibleGridViewLayout.swift; sourceTree = ""; }; E489E39822B85D0400CA8CBD /* NSPasteboard.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NSPasteboard.swift; sourceTree = ""; }; E489E39C22B9CF0000CA8CBD /* NSView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NSView.swift; sourceTree = ""; }; E489E3A222B9D31800CA8CBD /* DraggedSongView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DraggedSongView.swift; sourceTree = ""; }; @@ -308,11 +307,8 @@ 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 = ""; }; - E4BBD2E823356DC100702C16 /* BrowseViewButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BrowseViewButton.swift; sourceTree = ""; }; E4BBD2EA2335735500702C16 /* BrowseController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BrowseController.swift; sourceTree = ""; }; E4BBD2EC2335798E00702C16 /* ArtistViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ArtistViewController.swift; sourceTree = ""; }; - E4BBD2EE233579EF00702C16 /* ArtistViewItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ArtistViewItem.swift; sourceTree = ""; }; - E4BBD2EF233579EF00702C16 /* ArtistViewItem.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = ArtistViewItem.xib; sourceTree = ""; }; E4BBD2F223357C0700702C16 /* ArtistListState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ArtistListState.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 = ""; }; @@ -324,11 +320,9 @@ E4EB2378220F10B8008C70C0 /* MPDPair.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPDPair.swift; sourceTree = ""; }; E4EB237A220F7CF1008C70C0 /* MPDAlbum.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPDAlbum.swift; sourceTree = ""; }; E4F26F722341166200D45FF9 /* ArtistDataSource.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ArtistDataSource.swift; sourceTree = ""; }; - E4F26F74234117D600D45FF9 /* ArtistItemView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ArtistItemView.swift; sourceTree = ""; }; E4F26F7623411AE300D45FF9 /* ArtistListActions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ArtistListActions.swift; sourceTree = ""; }; E4F26F7823411B1500D45FF9 /* ArtistReducer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ArtistReducer.swift; sourceTree = ""; }; E4F26F7A23411D5400D45FF9 /* MPDClient+Artist.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "MPDClient+Artist.swift"; sourceTree = ""; }; - E4F26F7C2341441C00D45FF9 /* ArtistViewLayout.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ArtistViewLayout.swift; sourceTree = ""; }; E4F6B45F221E119B00ACF42A /* QueueDataSource.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QueueDataSource.swift; sourceTree = ""; }; E4F6B462221E125900ACF42A /* QueueItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QueueItem.swift; sourceTree = ""; }; E4F6B466221E233200ACF42A /* AlbumDataSource.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AlbumDataSource.swift; sourceTree = ""; }; @@ -399,25 +393,19 @@ E407861A2110CE6E006887B1 /* Persephone */ = { isa = PBXGroup; children = ( - E407861B2110CE6E006887B1 /* AppDelegate.swift */, E44051932278765A0090CD6F /* App.swift */, + E407861B2110CE6E006887B1 /* AppDelegate.swift */, E407861F2110CE70006887B1 /* Assets.xcassets */, - E4D1B597220BA3A20026F233 /* Controllers */, - E4F6B45E221E117600ACF42A /* DataSources */, - E408D3B7220DE8CC0006D9BE /* Extensions */, + E442CCC42347D5B900004E0C /* Components */, E41B22C721FB966C00D544F6 /* include */, E40786242110CE70006887B1 /* Info.plist */, - E47E2FE32220AA0700F747E6 /* Layouts */, E4F6B461221E124700ACF42A /* Models */, E4A642DB220912FA00067D21 /* MPDClient */, E450AD8922262B420091BED3 /* Operations */, E40786252110CE70006887B1 /* Persephone.entitlements */, E450AD9E2229B9BC0091BED3 /* PersephoneBridgingHeader.h */, - E4A83BEC2221F5DD0098FED6 /* Preferences */, - E4D1B598220BA3C90026F233 /* Resources */, E4A83BF2222207BE0098FED6 /* Services */, E4B11B64226A4F460075461B /* State */, - E408D3C3220E138B0006D9BE /* Views */, ); path = Persephone; sourceTree = ""; @@ -475,24 +463,6 @@ path = Extensions; sourceTree = ""; }; - E408D3C3220E138B0006D9BE /* Views */ = { - isa = PBXGroup; - children = ( - E43AC1F722C7065A001E483C /* AlbumCoverButton.swift */, - E4A3A6A022A457B600EA2C40 /* AlbumDetailSongListView.swift */, - E45878372296173C00586A1C /* AlbumDetailSongRowView.swift */, - E47E2FD62220720300F747E6 /* AlbumItemView.swift */, - E4F26F74234117D600D45FF9 /* ArtistItemView.swift */, - E4BBD2E823356DC100702C16 /* BrowseViewButton.swift */, - E4B11BB7227538FA0075461B /* CurrentCoverArtView.swift */, - E489E3A222B9D31800CA8CBD /* DraggedSongView.swift */, - E47E2FD222205D2500F747E6 /* MainWindow.swift */, - E423563F228623D2001216D6 /* QueueSongTitleView.swift */, - E4120D6B22AD8139004CB1F8 /* QueueView.swift */, - ); - path = Views; - sourceTree = ""; - }; E41B22BE21FB6B3300D544F6 /* Frameworks */ = { isa = PBXGroup; children = ( @@ -562,6 +532,104 @@ path = Extensions; sourceTree = ""; }; + E442CCC42347D5B900004E0C /* Components */ = { + isa = PBXGroup; + children = ( + E442CCCB2347D77A00004E0C /* Browser */, + E4A83BEC2221F5DD0098FED6 /* Preferences */, + E442CCC62347D5E700004E0C /* Queue */, + E442CCC92347D6FD00004E0C /* Shared */, + E442CCC52347D5CA00004E0C /* Window */, + ); + path = Components; + sourceTree = ""; + }; + E442CCC52347D5CA00004E0C /* Window */ = { + isa = PBXGroup; + children = ( + E40786212110CE70006887B1 /* Main.storyboard */, + E47E2FD022205C4600F747E6 /* MainSplitViewController.swift */, + E47E2FD222205D2500F747E6 /* MainWindow.swift */, + E465049921E94DF500A70F4C /* WindowController.swift */, + ); + path = Window; + sourceTree = ""; + }; + E442CCC62347D5E700004E0C /* Queue */ = { + isa = PBXGroup; + children = ( + E4B11BB7227538FA0075461B /* CurrentCoverArtView.swift */, + E4F6B45F221E119B00ACF42A /* QueueDataSource.swift */, + E423563F228623D2001216D6 /* QueueSongTitleView.swift */, + E4120D6B22AD8139004CB1F8 /* QueueView.swift */, + E4E8CC912204F4B80024217A /* QueueViewController.swift */, + E4D3BFA522B419C000C56F48 /* QueueViewController+NSOutlineViewDelegate.swift */, + ); + path = Queue; + sourceTree = ""; + }; + E442CCC72347D62F00004E0C /* Album Browser */ = { + isa = PBXGroup; + children = ( + E408D3C9220E341D0006D9BE /* AlbumViewItem.xib */, + E43AC1F722C7065A001E483C /* AlbumCoverButton.swift */, + E4F6B466221E233200ACF42A /* AlbumDataSource.swift */, + E408D3C1220E134F0006D9BE /* AlbumViewController.swift */, + E43AC1F222C6A439001E483C /* AlbumViewController+NSCollectionViewDelegate.swift */, + E47E2FD4222071FD00F747E6 /* AlbumViewItem.swift */, + ); + path = "Album Browser"; + sourceTree = ""; + }; + E442CCC82347D65300004E0C /* Album Detail */ = { + isa = PBXGroup; + children = ( + E43B67A922909793007DCF55 /* AlbumDetailView.xib */, + E4A3A6A022A457B600EA2C40 /* AlbumDetailSongListView.swift */, + E45878372296173C00586A1C /* AlbumDetailSongRowView.swift */, + E43B67A822909793007DCF55 /* AlbumDetailView.swift */, + E4E7A6AC22AAAF98006D566C /* AlbumDetailView+NSTableViewDelegate.swift */, + E43B67AC229194CD007DCF55 /* AlbumTracksDataSource.swift */, + ); + path = "Album Detail"; + sourceTree = ""; + }; + E442CCC92347D6FD00004E0C /* Shared */ = { + isa = PBXGroup; + children = ( + E4E13C2C2350D8CB00092A6E /* Layouts */, + E408D3B7220DE8CC0006D9BE /* Extensions */, + E489E3A222B9D31800CA8CBD /* DraggedSongView.swift */, + E489E3A322B9D31800CA8CBD /* DraggedSongView.xib */, + E4405191227644340090CD6F /* MPDServerController.swift */, + E4B5AE7D22F4C49600CCEC65 /* MPDServerDelegate.swift */, + E4B11BB52275374B0075461B /* UserNotificationsController.swift */, + ); + path = Shared; + sourceTree = ""; + }; + E442CCCA2347D74B00004E0C /* Artist Browser */ = { + isa = PBXGroup; + children = ( + E442CCCE2347E90800004E0C /* ArtistViewItem.xib */, + E4F26F722341166200D45FF9 /* ArtistDataSource.swift */, + E442CCD02347EAEB00004E0C /* ArtistViewItem.swift */, + E4BBD2EC2335798E00702C16 /* ArtistViewController.swift */, + ); + path = "Artist Browser"; + sourceTree = ""; + }; + E442CCCB2347D77A00004E0C /* Browser */ = { + isa = PBXGroup; + children = ( + E442CCC82347D65300004E0C /* Album Detail */, + E442CCC72347D62F00004E0C /* Album Browser */, + E442CCCA2347D74B00004E0C /* Artist Browser */, + E4BBD2EA2335735500702C16 /* BrowseController.swift */, + ); + path = Browser; + sourceTree = ""; + }; E450AD8922262B420091BED3 /* Operations */ = { isa = PBXGroup; children = ( @@ -570,15 +638,6 @@ path = Operations; sourceTree = ""; }; - E47E2FE32220AA0700F747E6 /* Layouts */ = { - isa = PBXGroup; - children = ( - E47E2FE42220AA0700F747E6 /* AlbumViewLayout.swift */, - E4F26F7C2341441C00D45FF9 /* ArtistViewLayout.swift */, - ); - path = Layouts; - sourceTree = ""; - }; E4A642DB220912FA00067D21 /* MPDClient */ = { isa = PBXGroup; children = ( @@ -591,14 +650,6 @@ sourceTree = ""; }; E4A83BEC2221F5DD0098FED6 /* Preferences */ = { - isa = PBXGroup; - children = ( - E4A83BED2221F5E60098FED6 /* Controllers */, - ); - path = Preferences; - sourceTree = ""; - }; - E4A83BED2221F5E60098FED6 /* Controllers */ = { isa = PBXGroup; children = ( E4A83BEE2221F8CF0098FED6 /* CoverArtPrefsController.swift */, @@ -606,15 +657,15 @@ E4A83BF02221FAA00098FED6 /* PreferencesViewController.swift */, E4C8B53B22342005009A20F3 /* PreferencesWindowController.swift */, ); - path = Controllers; + path = Preferences; sourceTree = ""; }; E4A83BF2222207BE0098FED6 /* Services */ = { isa = PBXGroup; children = ( + E41E530C223EF4BA00173814 /* Extensions */, E4A83BF3222207D50098FED6 /* CoverArtService.swift */, E439109722640213002982E9 /* SongNotifierService.swift */, - E41E530C223EF4BA00173814 /* Extensions */, ); path = Services; sourceTree = ""; @@ -637,13 +688,13 @@ isa = PBXGroup; children = ( E4B11B6B226A5AF50075461B /* Actions */, + E4B11B5F226A4BED0075461B /* Reducers */, E4B11B69226A4FBC0075461B /* AlbumListState.swift */, E4B11B52226928F20075461B /* AppState.swift */, E4BBD2F223357C0700702C16 /* ArtistListState.swift */, E4B11B65226A4F830075461B /* PlayerState.swift */, E4FF718D2276010E00D4C412 /* PreferencesState.swift */, E4B11B67226A4FA00075461B /* QueueState.swift */, - E4B11B5F226A4BED0075461B /* Reducers */, E440519F227BB0AB0090CD6F /* UIState.swift */, ); path = State; @@ -684,64 +735,28 @@ path = Protocols; sourceTree = ""; }; - E4D1B597220BA3A20026F233 /* Controllers */ = { + E4E13C2C2350D8CB00092A6E /* Layouts */ = { isa = PBXGroup; children = ( - E43B67A822909793007DCF55 /* AlbumDetailView.swift */, - E4E7A6AC22AAAF98006D566C /* AlbumDetailView+NSTableViewDelegate.swift */, - E408D3C1220E134F0006D9BE /* AlbumViewController.swift */, - E43AC1F222C6A439001E483C /* AlbumViewController+NSCollectionViewDelegate.swift */, - E47E2FD4222071FD00F747E6 /* AlbumViewItem.swift */, - E4BBD2EC2335798E00702C16 /* ArtistViewController.swift */, - E4BBD2EE233579EF00702C16 /* ArtistViewItem.swift */, - E4BBD2EA2335735500702C16 /* BrowseController.swift */, - E47E2FD022205C4600F747E6 /* MainSplitViewController.swift */, - E4405191227644340090CD6F /* MPDServerController.swift */, - E4B5AE7D22F4C49600CCEC65 /* MPDServerDelegate.swift */, - E4E8CC912204F4B80024217A /* QueueViewController.swift */, - E4D3BFA522B419C000C56F48 /* QueueViewController+NSOutlineViewDelegate.swift */, - E4B11BB52275374B0075461B /* UserNotificationsController.swift */, - E465049921E94DF500A70F4C /* WindowController.swift */, + E47E2FE42220AA0700F747E6 /* FlexibleGridViewLayout.swift */, ); - path = Controllers; - sourceTree = ""; - }; - E4D1B598220BA3C90026F233 /* Resources */ = { - isa = PBXGroup; - children = ( - E4BBD2EF233579EF00702C16 /* ArtistViewItem.xib */, - E43B67A922909793007DCF55 /* AlbumDetailView.xib */, - E408D3C9220E341D0006D9BE /* AlbumViewItem.xib */, - E489E3A322B9D31800CA8CBD /* DraggedSongView.xib */, - E40786212110CE70006887B1 /* Main.storyboard */, - ); - path = Resources; - sourceTree = ""; - }; - E4F6B45E221E117600ACF42A /* DataSources */ = { - isa = PBXGroup; - children = ( - E4F6B466221E233200ACF42A /* AlbumDataSource.swift */, - E4F6B45F221E119B00ACF42A /* QueueDataSource.swift */, - E43B67AC229194CD007DCF55 /* AlbumTracksDataSource.swift */, - E4F26F722341166200D45FF9 /* ArtistDataSource.swift */, - ); - path = DataSources; + path = Layouts; sourceTree = ""; }; E4F6B461221E124700ACF42A /* Models */ = { isa = PBXGroup; children = ( E450AD7D222620A10091BED3 /* Album.swift */, + E442CCCC2347E73C00004E0C /* Artist.swift */, + E43AC1F422C6A4F4001E483C /* DraggedAlbum.swift */, + E451E36C22BD23DB008BE9B2 /* DraggedSong.swift */, + E451E36A22BD214D008BE9B2 /* DraggedSongType.swift */, E4B11BA82274EDE30075461B /* Loading.swift */, E4FF71932276043A00D4C412 /* MPDServer.swift */, E4F6B462221E125900ACF42A /* QueueItem.swift */, E419E2862249B96600216A8C /* Song.swift */, E47E2FDC2220A6D100F747E6 /* Time.swift */, E4B11B72226A6C770075461B /* TrackTimer.swift */, - E451E36A22BD214D008BE9B2 /* DraggedSongType.swift */, - E451E36C22BD23DB008BE9B2 /* DraggedSong.swift */, - E43AC1F422C6A4F4001E483C /* DraggedAlbum.swift */, ); path = Models; sourceTree = ""; @@ -890,7 +905,7 @@ E40786202110CE70006887B1 /* Assets.xcassets in Resources */, E42A8F3C22176D6400A13ED9 /* README.md in Resources */, E408D3CB220E341D0006D9BE /* AlbumViewItem.xib in Resources */, - E4BBD2F1233579EF00702C16 /* ArtistViewItem.xib in Resources */, + E442CCCF2347E90800004E0C /* ArtistViewItem.xib in Resources */, E40786232110CE70006887B1 /* Main.storyboard in Resources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -955,21 +970,19 @@ E4F6B460221E119B00ACF42A /* QueueDataSource.swift in Sources */, E4C8B53C22342005009A20F3 /* PreferencesWindowController.swift in Sources */, E4B11B63226A4C510075461B /* AppReducer.swift in Sources */, - E4BBD2F0233579EF00702C16 /* ArtistViewItem.swift in Sources */, E41E5307223C019100173814 /* MPDClient+Status.swift in Sources */, E41E5310223EF6CE00173814 /* CoverArtService+Remote.swift in Sources */, + E442CCCD2347E73C00004E0C /* Artist.swift in Sources */, E41E530B223C033700173814 /* MPDClient+Album.swift in Sources */, E42410B62241B956005ED6DF /* MPDClient+Database.swift in Sources */, E4235640228623D2001216D6 /* QueueSongTitleView.swift in Sources */, E451E36E22BD2501008BE9B2 /* DraggedSong.swift in Sources */, E4A642DA22090CBE00067D21 /* MPDStatus.swift in Sources */, E4B11BC02275EE150075461B /* QueueActions.swift in Sources */, - E47E2FD72220720300F747E6 /* AlbumItemView.swift in Sources */, E450AD9522262DF10091BED3 /* CoverArtQueue.swift in Sources */, E43B67AD229194CD007DCF55 /* AlbumTracksDataSource.swift in Sources */, E41E52FD223BF87300173814 /* MPDClient+Connection.swift in Sources */, E450AD7E222620A10091BED3 /* Album.swift in Sources */, - E4F26F7D2341441C00D45FF9 /* ArtistViewLayout.swift in Sources */, E408D3B6220DD8970006D9BE /* Notification.swift in Sources */, E43AC1F822C7065A001E483C /* AlbumCoverButton.swift in Sources */, E45962C62241A78500FC1A1E /* MPDCommand.swift in Sources */, @@ -1000,14 +1013,12 @@ E407861C2110CE6E006887B1 /* AppDelegate.swift in Sources */, E4B11B75226CC4D30075461B /* QueueReducer.swift in Sources */, E41E5309223C020400173814 /* MPDClient+Command.swift in Sources */, - E4BBD2E923356DC100702C16 /* BrowseViewButton.swift in Sources */, E4F26F7923411B1500D45FF9 /* ArtistReducer.swift in Sources */, E4B11B73226A6C770075461B /* TrackTimer.swift in Sources */, E4BBD2EB2335735500702C16 /* BrowseController.swift in Sources */, E44051942278765A0090CD6F /* App.swift in Sources */, E4B11B79226D346B0075461B /* AlbumListReducer.swift in Sources */, - E47E2FE52220AA0700F747E6 /* AlbumViewLayout.swift in Sources */, - E4F26F75234117D600D45FF9 /* ArtistItemView.swift in Sources */, + E47E2FE52220AA0700F747E6 /* FlexibleGridViewLayout.swift in Sources */, E41E52FF223BF95E00173814 /* MPDClient+Transport.swift in Sources */, E47E2FD322205D2500F747E6 /* MainWindow.swift in Sources */, E47E2FD122205C4600F747E6 /* MainSplitViewController.swift in Sources */, @@ -1024,6 +1035,7 @@ E4B11BBE2275EDAA0075461B /* PlayerActions.swift in Sources */, E4F26F7723411AE300D45FF9 /* ArtistListActions.swift in Sources */, E4FF71942276043A00D4C412 /* MPDServer.swift in Sources */, + E442CCD12347EAEB00004E0C /* ArtistViewItem.swift in Sources */, E41E530E223EF4CF00173814 /* CoverArtService+Caching.swift in Sources */, E4E8CC922204F4B80024217A /* QueueViewController.swift in Sources */, E440519C227BAF2E0090CD6F /* UIActions.swift in Sources */, diff --git a/Persephone/Views/AlbumCoverButton.swift b/Persephone/Components/Browser/Album Browser/AlbumCoverButton.swift similarity index 100% rename from Persephone/Views/AlbumCoverButton.swift rename to Persephone/Components/Browser/Album Browser/AlbumCoverButton.swift diff --git a/Persephone/DataSources/AlbumDataSource.swift b/Persephone/Components/Browser/Album Browser/AlbumDataSource.swift similarity index 100% rename from Persephone/DataSources/AlbumDataSource.swift rename to Persephone/Components/Browser/Album Browser/AlbumDataSource.swift diff --git a/Persephone/Controllers/AlbumViewController+NSCollectionViewDelegate.swift b/Persephone/Components/Browser/Album Browser/AlbumViewController+NSCollectionViewDelegate.swift similarity index 100% rename from Persephone/Controllers/AlbumViewController+NSCollectionViewDelegate.swift rename to Persephone/Components/Browser/Album Browser/AlbumViewController+NSCollectionViewDelegate.swift diff --git a/Persephone/Controllers/AlbumViewController.swift b/Persephone/Components/Browser/Album Browser/AlbumViewController.swift similarity index 91% rename from Persephone/Controllers/AlbumViewController.swift rename to Persephone/Components/Browser/Album Browser/AlbumViewController.swift index 39a90cb..f4f5f4b 100644 --- a/Persephone/Controllers/AlbumViewController.swift +++ b/Persephone/Components/Browser/Album Browser/AlbumViewController.swift @@ -13,6 +13,7 @@ import Differ class AlbumViewController: NSViewController, NSCollectionViewDelegateFlowLayout { var dataSource = AlbumDataSource() + let layout = FlexibleGridViewLayout(coder: NSCoder()) override func viewDidLoad() { super.viewDidLoad() @@ -27,6 +28,8 @@ class AlbumViewController: NSViewController, albumScrollView.postsBoundsChangedNotifications = true albumCollectionView.dataSource = dataSource + layout?.extraHeight = 44 + albumCollectionView.collectionViewLayout = layout registerForDragAndDrop(albumCollectionView) } @@ -38,7 +41,7 @@ class AlbumViewController: NSViewController, override func viewWillLayout() { super.viewWillLayout() - if let layout = albumCollectionView.collectionViewLayout as? AlbumViewLayout { + if let layout = albumCollectionView.collectionViewLayout as? FlexibleGridViewLayout { layout.saveScrollPosition() } @@ -48,7 +51,7 @@ class AlbumViewController: NSViewController, override func viewDidLayout() { super.viewDidLayout() - guard let layout = albumCollectionView.collectionViewLayout as? AlbumViewLayout + guard let layout = albumCollectionView.collectionViewLayout as? FlexibleGridViewLayout else { return } layout.setScrollPosition() @@ -73,7 +76,7 @@ extension AlbumViewController: StoreSubscriber { func newState(state: StoreSubscriberStateType) { let oldAlbums = dataSource.albums - + dataSource.albums = state.albums albumCollectionView.animateItemChanges( diff --git a/Persephone/Controllers/AlbumViewItem.swift b/Persephone/Components/Browser/Album Browser/AlbumViewItem.swift similarity index 100% rename from Persephone/Controllers/AlbumViewItem.swift rename to Persephone/Components/Browser/Album Browser/AlbumViewItem.swift diff --git a/Persephone/Resources/AlbumViewItem.xib b/Persephone/Components/Browser/Album Browser/AlbumViewItem.xib similarity index 98% rename from Persephone/Resources/AlbumViewItem.xib rename to Persephone/Components/Browser/Album Browser/AlbumViewItem.xib index c69d196..ed5cb9c 100644 --- a/Persephone/Resources/AlbumViewItem.xib +++ b/Persephone/Components/Browser/Album Browser/AlbumViewItem.xib @@ -17,7 +17,7 @@ - + diff --git a/Persephone/Views/AlbumDetailSongListView.swift b/Persephone/Components/Browser/Album Detail/AlbumDetailSongListView.swift similarity index 100% rename from Persephone/Views/AlbumDetailSongListView.swift rename to Persephone/Components/Browser/Album Detail/AlbumDetailSongListView.swift diff --git a/Persephone/Views/AlbumDetailSongRowView.swift b/Persephone/Components/Browser/Album Detail/AlbumDetailSongRowView.swift similarity index 100% rename from Persephone/Views/AlbumDetailSongRowView.swift rename to Persephone/Components/Browser/Album Detail/AlbumDetailSongRowView.swift diff --git a/Persephone/Controllers/AlbumDetailView+NSTableViewDelegate.swift b/Persephone/Components/Browser/Album Detail/AlbumDetailView+NSTableViewDelegate.swift similarity index 100% rename from Persephone/Controllers/AlbumDetailView+NSTableViewDelegate.swift rename to Persephone/Components/Browser/Album Detail/AlbumDetailView+NSTableViewDelegate.swift diff --git a/Persephone/Controllers/AlbumDetailView.swift b/Persephone/Components/Browser/Album Detail/AlbumDetailView.swift similarity index 100% rename from Persephone/Controllers/AlbumDetailView.swift rename to Persephone/Components/Browser/Album Detail/AlbumDetailView.swift diff --git a/Persephone/Resources/AlbumDetailView.xib b/Persephone/Components/Browser/Album Detail/AlbumDetailView.xib similarity index 96% rename from Persephone/Resources/AlbumDetailView.xib rename to Persephone/Components/Browser/Album Detail/AlbumDetailView.xib index 8f736e3..1129cc1 100644 --- a/Persephone/Resources/AlbumDetailView.xib +++ b/Persephone/Components/Browser/Album Detail/AlbumDetailView.xib @@ -1,8 +1,8 @@ - + - + @@ -22,7 +22,7 @@ - + @@ -33,7 +33,7 @@ - + @@ -53,28 +53,14 @@ - - + - + - + @@ -98,7 +84,7 @@ - + @@ -120,7 +106,7 @@ - + @@ -159,7 +145,7 @@ - + @@ -196,7 +182,7 @@ - + @@ -233,6 +219,20 @@ + diff --git a/Persephone/DataSources/AlbumTracksDataSource.swift b/Persephone/Components/Browser/Album Detail/AlbumTracksDataSource.swift similarity index 100% rename from Persephone/DataSources/AlbumTracksDataSource.swift rename to Persephone/Components/Browser/Album Detail/AlbumTracksDataSource.swift diff --git a/Persephone/DataSources/ArtistDataSource.swift b/Persephone/Components/Browser/Artist Browser/ArtistDataSource.swift similarity index 82% rename from Persephone/DataSources/ArtistDataSource.swift rename to Persephone/Components/Browser/Artist Browser/ArtistDataSource.swift index 0024e2c..0870203 100644 --- a/Persephone/DataSources/ArtistDataSource.swift +++ b/Persephone/Components/Browser/Artist Browser/ArtistDataSource.swift @@ -9,7 +9,7 @@ import AppKit class ArtistDataSource: NSObject, NSCollectionViewDataSource { - var artists: [String] = [] + var artists: [Artist] = [] func collectionView(_ collectionView: NSCollectionView, numberOfItemsInSection section: Int) -> Int { return artists.count @@ -17,9 +17,9 @@ class ArtistDataSource: NSObject, NSCollectionViewDataSource { func collectionView(_ collectionView: NSCollectionView, itemForRepresentedObjectAt indexPath: IndexPath) -> NSCollectionViewItem { let item = collectionView.makeItem(withIdentifier: .artistViewItem, for: indexPath) - guard let artistViewItem = item as? ArtistViewItem - else { return item } + guard let artistViewItem = item as? ArtistViewItem else { return item } + artistViewItem.view.wantsLayer = true artistViewItem.setArtist(artists[indexPath.item]) return artistViewItem diff --git a/Persephone/Components/Browser/Artist Browser/ArtistViewController.swift b/Persephone/Components/Browser/Artist Browser/ArtistViewController.swift new file mode 100644 index 0000000..c1edb0b --- /dev/null +++ b/Persephone/Components/Browser/Artist Browser/ArtistViewController.swift @@ -0,0 +1,63 @@ +// +// ArtistViewController.swift +// Persephone +// +// Created by Daniel Barber on 2019/9/20. +// Copyright © 2019 Dan Barber. All rights reserved. +// + +import AppKit +import ReSwift +import Differ + +class ArtistViewController: NSViewController, + NSCollectionViewDelegateFlowLayout { + var dataSource = ArtistDataSource() + let layout = FlexibleGridViewLayout(coder: NSCoder()) + + @IBOutlet var artistCollectionView: NSCollectionView! + + override func viewDidLoad() { + super.viewDidLoad() + + App.store.subscribe(self) { + $0.select { $0.artistListState } + } + + NotificationCenter.default.addObserver(self, selector: #selector(didConnect), name: .didConnect, object: nil) + NotificationCenter.default.addObserver(self, selector: #selector(willDisconnect), name: .willDisconnect, object: nil) + + artistCollectionView.dataSource = dataSource + layout?.extraHeight = 26 + artistCollectionView.collectionViewLayout = layout + } + + deinit { + App.store.unsubscribe(self) + } + + @objc func didConnect() { + App.mpdClient.fetchAllArtists() + } + + @objc func willDisconnect() { + DispatchQueue.main.async { + App.store.dispatch(UpdateArtistListAction(artists: [])) + } + } + } + + extension ArtistViewController: StoreSubscriber { + typealias StoreSubscriberStateType = ArtistListState + + func newState(state: StoreSubscriberStateType) { + let oldArtists = dataSource.artists + + dataSource.artists = state.artists + + artistCollectionView.animateItemChanges( + oldData: oldArtists, + newData: dataSource.artists + ) + } +} diff --git a/Persephone/Components/Browser/Artist Browser/ArtistViewItem.swift b/Persephone/Components/Browser/Artist Browser/ArtistViewItem.swift new file mode 100644 index 0000000..7caffdb --- /dev/null +++ b/Persephone/Components/Browser/Artist Browser/ArtistViewItem.swift @@ -0,0 +1,66 @@ +// +// artistViewItem.swift +// Persephone +// +// Created by Daniel Barber on 2019/2/08. +// Copyright © 2019 Dan Barber. All rights reserved. +// + +import AppKit + +class ArtistViewItem: NSCollectionViewItem { + var observer: NSKeyValueObservation? + var artist: Artist? + +// override var isSelected: Bool { +// didSet { +// artistCoverBox.layer?.borderWidth = isSelected ? 5 : 0 +// } +// } + + override func viewDidLoad() { + super.viewDidLoad() +// +// artistCoverView.wantsLayer = true +// artistCoverView.layer?.cornerRadius = 3 +// artistCoverView.layer?.borderWidth = 1 +// +// artistCoverBox.wantsLayer = true +// artistCoverBox.layer?.cornerRadius = 5 +// artistCoverBox.layer?.borderWidth = 0 +// +// setAppearance() +// +// if #available(OSX 10.14, *) { +// observer = NSApp.observe(\.effectiveAppearance) { (app, _) in +// self.setAppearance() +// } +// } + } + +// override func prepareForReuse() { +// super.prepareForReuse() +// +// artistDetailView.popover.close() +// } + + func setArtist(_ artist: Artist) { + self.artist = artist + artistName.stringValue = artist.name + } + +// func setAppearance() { +// if #available(OSX 10.14, *) { +// let darkMode = NSApp.effectiveAppearance.bestMatch(from: +// [.darkAqua, .aqua]) == .darkAqua +// +// artistCoverView.layer?.borderColor = darkMode ? .albumBorderColorDark : .albumBorderColorLight +// artistCoverBox.layer?.borderColor = NSColor.controlAccentColor.cgColor +// } else { +// artistCoverView.layer?.borderColor = .albumBorderColorLight +// artistImageBox.layer?.borderColor = NSColor.selectedControlColor.cgColor +// } +// } + + @IBOutlet var artistName: NSTextField! +} diff --git a/Persephone/Components/Browser/Artist Browser/ArtistViewItem.xib b/Persephone/Components/Browser/Artist Browser/ArtistViewItem.xib new file mode 100644 index 0000000..214fe32 --- /dev/null +++ b/Persephone/Components/Browser/Artist Browser/ArtistViewItem.xib @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Persephone/Controllers/BrowseController.swift b/Persephone/Components/Browser/BrowseController.swift similarity index 100% rename from Persephone/Controllers/BrowseController.swift rename to Persephone/Components/Browser/BrowseController.swift diff --git a/Persephone/Preferences/Controllers/CoverArtPrefsController.swift b/Persephone/Components/Preferences/CoverArtPrefsController.swift similarity index 100% rename from Persephone/Preferences/Controllers/CoverArtPrefsController.swift rename to Persephone/Components/Preferences/CoverArtPrefsController.swift diff --git a/Persephone/Preferences/Controllers/GeneralPrefsViewController.swift b/Persephone/Components/Preferences/GeneralPrefsViewController.swift similarity index 98% rename from Persephone/Preferences/Controllers/GeneralPrefsViewController.swift rename to Persephone/Components/Preferences/GeneralPrefsViewController.swift index 91959d4..f44914c 100644 --- a/Persephone/Preferences/Controllers/GeneralPrefsViewController.swift +++ b/Persephone/Components/Preferences/GeneralPrefsViewController.swift @@ -18,7 +18,6 @@ class GeneralPrefsViewController: NSViewController { } if let mpdPort = App.store.state.preferencesState.mpdServer.port { - print(mpdPort) mpdPortField.stringValue = "\(mpdPort)" } diff --git a/Persephone/Preferences/Controllers/PreferencesViewController.swift b/Persephone/Components/Preferences/PreferencesViewController.swift similarity index 100% rename from Persephone/Preferences/Controllers/PreferencesViewController.swift rename to Persephone/Components/Preferences/PreferencesViewController.swift diff --git a/Persephone/Preferences/Controllers/PreferencesWindowController.swift b/Persephone/Components/Preferences/PreferencesWindowController.swift similarity index 100% rename from Persephone/Preferences/Controllers/PreferencesWindowController.swift rename to Persephone/Components/Preferences/PreferencesWindowController.swift diff --git a/Persephone/Views/CurrentCoverArtView.swift b/Persephone/Components/Queue/CurrentCoverArtView.swift similarity index 100% rename from Persephone/Views/CurrentCoverArtView.swift rename to Persephone/Components/Queue/CurrentCoverArtView.swift diff --git a/Persephone/DataSources/QueueDataSource.swift b/Persephone/Components/Queue/QueueDataSource.swift similarity index 100% rename from Persephone/DataSources/QueueDataSource.swift rename to Persephone/Components/Queue/QueueDataSource.swift diff --git a/Persephone/Views/QueueSongTitleView.swift b/Persephone/Components/Queue/QueueSongTitleView.swift similarity index 100% rename from Persephone/Views/QueueSongTitleView.swift rename to Persephone/Components/Queue/QueueSongTitleView.swift diff --git a/Persephone/Views/QueueView.swift b/Persephone/Components/Queue/QueueView.swift similarity index 100% rename from Persephone/Views/QueueView.swift rename to Persephone/Components/Queue/QueueView.swift diff --git a/Persephone/Controllers/QueueViewController+NSOutlineViewDelegate.swift b/Persephone/Components/Queue/QueueViewController+NSOutlineViewDelegate.swift similarity index 100% rename from Persephone/Controllers/QueueViewController+NSOutlineViewDelegate.swift rename to Persephone/Components/Queue/QueueViewController+NSOutlineViewDelegate.swift diff --git a/Persephone/Controllers/QueueViewController.swift b/Persephone/Components/Queue/QueueViewController.swift similarity index 100% rename from Persephone/Controllers/QueueViewController.swift rename to Persephone/Components/Queue/QueueViewController.swift diff --git a/Persephone/Views/DraggedSongView.swift b/Persephone/Components/Shared/DraggedSongView.swift similarity index 100% rename from Persephone/Views/DraggedSongView.swift rename to Persephone/Components/Shared/DraggedSongView.swift diff --git a/Persephone/Resources/DraggedSongView.xib b/Persephone/Components/Shared/DraggedSongView.xib similarity index 100% rename from Persephone/Resources/DraggedSongView.xib rename to Persephone/Components/Shared/DraggedSongView.xib diff --git a/Persephone/Extensions/CGColor.swift b/Persephone/Components/Shared/Extensions/CGColor.swift similarity index 100% rename from Persephone/Extensions/CGColor.swift rename to Persephone/Components/Shared/Extensions/CGColor.swift diff --git a/Persephone/Extensions/NSEvent.swift b/Persephone/Components/Shared/Extensions/NSEvent.swift similarity index 100% rename from Persephone/Extensions/NSEvent.swift rename to Persephone/Components/Shared/Extensions/NSEvent.swift diff --git a/Persephone/Extensions/NSFont.swift b/Persephone/Components/Shared/Extensions/NSFont.swift similarity index 100% rename from Persephone/Extensions/NSFont.swift rename to Persephone/Components/Shared/Extensions/NSFont.swift diff --git a/Persephone/Extensions/NSImage.swift b/Persephone/Components/Shared/Extensions/NSImage.swift similarity index 100% rename from Persephone/Extensions/NSImage.swift rename to Persephone/Components/Shared/Extensions/NSImage.swift diff --git a/Persephone/Extensions/NSPasteboard.swift b/Persephone/Components/Shared/Extensions/NSPasteboard.swift similarity index 100% rename from Persephone/Extensions/NSPasteboard.swift rename to Persephone/Components/Shared/Extensions/NSPasteboard.swift diff --git a/Persephone/Extensions/NSPasteboardItem.swift b/Persephone/Components/Shared/Extensions/NSPasteboardItem.swift similarity index 100% rename from Persephone/Extensions/NSPasteboardItem.swift rename to Persephone/Components/Shared/Extensions/NSPasteboardItem.swift diff --git a/Persephone/Extensions/NSUserInterfaceItemIdentifier.swift b/Persephone/Components/Shared/Extensions/NSUserInterfaceItemIdentifier.swift similarity index 93% rename from Persephone/Extensions/NSUserInterfaceItemIdentifier.swift rename to Persephone/Components/Shared/Extensions/NSUserInterfaceItemIdentifier.swift index 1983e99..eda347d 100644 --- a/Persephone/Extensions/NSUserInterfaceItemIdentifier.swift +++ b/Persephone/Components/Shared/Extensions/NSUserInterfaceItemIdentifier.swift @@ -23,4 +23,6 @@ extension NSUserInterfaceItemIdentifier { static let trackNumber = NSUserInterfaceItemIdentifier("trackNumberCell") static let songTitle = NSUserInterfaceItemIdentifier("songTitleCell") static let songDuration = NSUserInterfaceItemIdentifier("songDurationCell") + + static let artistListName = NSUserInterfaceItemIdentifier("artistCell") } diff --git a/Persephone/Extensions/NSView.swift b/Persephone/Components/Shared/Extensions/NSView.swift similarity index 100% rename from Persephone/Extensions/NSView.swift rename to Persephone/Components/Shared/Extensions/NSView.swift diff --git a/Persephone/Extensions/Notification.swift b/Persephone/Components/Shared/Extensions/Notification.swift similarity index 100% rename from Persephone/Extensions/Notification.swift rename to Persephone/Components/Shared/Extensions/Notification.swift diff --git a/Persephone/Layouts/AlbumViewLayout.swift b/Persephone/Components/Shared/Layouts/FlexibleGridViewLayout.swift similarity index 91% rename from Persephone/Layouts/AlbumViewLayout.swift rename to Persephone/Components/Shared/Layouts/FlexibleGridViewLayout.swift index 2ea3bc0..abe0749 100644 --- a/Persephone/Layouts/AlbumViewLayout.swift +++ b/Persephone/Components/Shared/Layouts/FlexibleGridViewLayout.swift @@ -8,9 +8,9 @@ import AppKit -class AlbumViewLayout: NSCollectionViewFlowLayout { +class FlexibleGridViewLayout: NSCollectionViewFlowLayout { let maxItemWidth: CGFloat = 200 - let albumInfoHeight: CGFloat = 44 + var extraHeight: CGFloat = 0 var scrollPosition: CGFloat = 0 required init?(coder aDecoder: NSCoder) { @@ -43,7 +43,7 @@ class AlbumViewLayout: NSCollectionViewFlowLayout { divider = divider + 1 } while itemWidth > maxItemWidth - let itemHeight = itemWidth + albumInfoHeight + let itemHeight = itemWidth + extraHeight itemSize = NSSize(width: itemWidth, height: itemHeight) } diff --git a/Persephone/Controllers/MPDServerController.swift b/Persephone/Components/Shared/MPDServerController.swift similarity index 100% rename from Persephone/Controllers/MPDServerController.swift rename to Persephone/Components/Shared/MPDServerController.swift diff --git a/Persephone/Controllers/MPDServerDelegate.swift b/Persephone/Components/Shared/MPDServerDelegate.swift similarity index 100% rename from Persephone/Controllers/MPDServerDelegate.swift rename to Persephone/Components/Shared/MPDServerDelegate.swift diff --git a/Persephone/Controllers/UserNotificationsController.swift b/Persephone/Components/Shared/UserNotificationsController.swift similarity index 100% rename from Persephone/Controllers/UserNotificationsController.swift rename to Persephone/Components/Shared/UserNotificationsController.swift diff --git a/Persephone/Resources/Base.lproj/Main.storyboard b/Persephone/Components/Window/Base.lproj/Main.storyboard similarity index 99% rename from Persephone/Resources/Base.lproj/Main.storyboard rename to Persephone/Components/Window/Base.lproj/Main.storyboard index 7043030..af33f71 100644 --- a/Persephone/Resources/Base.lproj/Main.storyboard +++ b/Persephone/Components/Window/Base.lproj/Main.storyboard @@ -886,39 +886,39 @@ - + - + - + - + - - - - - + + + + - + @@ -942,7 +942,7 @@ - + diff --git a/Persephone/Controllers/MainSplitViewController.swift b/Persephone/Components/Window/MainSplitViewController.swift similarity index 100% rename from Persephone/Controllers/MainSplitViewController.swift rename to Persephone/Components/Window/MainSplitViewController.swift diff --git a/Persephone/Views/MainWindow.swift b/Persephone/Components/Window/MainWindow.swift similarity index 100% rename from Persephone/Views/MainWindow.swift rename to Persephone/Components/Window/MainWindow.swift diff --git a/Persephone/Controllers/WindowController.swift b/Persephone/Components/Window/WindowController.swift similarity index 100% rename from Persephone/Controllers/WindowController.swift rename to Persephone/Components/Window/WindowController.swift diff --git a/Persephone/Controllers/ArtistViewController.swift b/Persephone/Controllers/ArtistViewController.swift deleted file mode 100644 index 57db6b6..0000000 --- a/Persephone/Controllers/ArtistViewController.swift +++ /dev/null @@ -1,59 +0,0 @@ -// -// ArtistViewController.swift -// Persephone -// -// Created by Daniel Barber on 2019/9/20. -// Copyright © 2019 Dan Barber. All rights reserved. -// - -import AppKit -import ReSwift -import Differ - -class ArtistViewController: NSViewController { - var dataSource = ArtistDataSource() - - @IBOutlet var artistCollectionView: NSCollectionView! - - override func viewDidLoad() { - super.viewDidLoad() - - App.store.subscribe(self) { - $0.select { $0.artistListState } - } - - NotificationCenter.default.addObserver(self, selector: #selector(didConnect), name: .didConnect, object: nil) - NotificationCenter.default.addObserver(self, selector: #selector(willDisconnect), name: .willDisconnect, object: nil) - - artistCollectionView.dataSource = dataSource - } - - deinit { - App.store.unsubscribe(self) - } - - @objc func didConnect() { - App.mpdClient.fetchAllArtists() - } - - @objc func willDisconnect() { - DispatchQueue.main.async { - App.store.dispatch(UpdateArtistListAction(artists: [])) - } - } -} - -extension ArtistViewController: StoreSubscriber { - typealias StoreSubscriberStateType = ArtistListState - - func newState(state: StoreSubscriberStateType) { - let oldArtists = dataSource.artists - - dataSource.artists = state.artists - - artistCollectionView.animateItemChanges( - oldData: oldArtists, - newData: dataSource.artists - ) - } -} diff --git a/Persephone/Controllers/ArtistViewItem.swift b/Persephone/Controllers/ArtistViewItem.swift deleted file mode 100644 index 8a40c99..0000000 --- a/Persephone/Controllers/ArtistViewItem.swift +++ /dev/null @@ -1,25 +0,0 @@ -// -// ArtistViewItem.swift -// Persephone -// -// Created by Daniel Barber on 2019/9/20. -// Copyright © 2019 Dan Barber. All rights reserved. -// - -import Cocoa - -class ArtistViewItem: NSCollectionViewItem { - var artist: String? - - @IBOutlet var artistName: NSTextField! - - override func viewDidLoad() { - super.viewDidLoad() - } - - func setArtist(_ artist: String) { - self.artist = artist - - artistName.stringValue = artist - } -} diff --git a/Persephone/Layouts/ArtistViewLayout.swift b/Persephone/Layouts/ArtistViewLayout.swift deleted file mode 100644 index 8e28f61..0000000 --- a/Persephone/Layouts/ArtistViewLayout.swift +++ /dev/null @@ -1,22 +0,0 @@ -// -// ArtistViewLayout.swift -// Persephone -// -// Created by Daniel Barber on 2019/9/29. -// Copyright © 2019 Dan Barber. All rights reserved. -// - -import AppKit - -class ArtistViewLayout: NSCollectionViewFlowLayout { - override func prepare() { - super.prepare() - - guard let collectionView = collectionView - else { return } - - let width = collectionView.bounds.size.width - - itemSize.width = width - } -} diff --git a/Persephone/Models/Artist.swift b/Persephone/Models/Artist.swift new file mode 100644 index 0000000..4e0cfd4 --- /dev/null +++ b/Persephone/Models/Artist.swift @@ -0,0 +1,24 @@ +// +// Artist.swift +// Persephone +// +// Created by Daniel Barber on 2019/10/04. +// Copyright © 2019 Dan Barber. All rights reserved. +// + +import AppKit + +struct Artist { + var name: String + var image: Loading = .notLoaded + + init(name: String) { + self.name = name + } +} + +extension Artist: Equatable { + static func == (lhs: Artist, rhs: Artist) -> Bool { + return (lhs.name == rhs.name) + } +} diff --git a/Persephone/Resources/ArtistViewItem.xib b/Persephone/Resources/ArtistViewItem.xib deleted file mode 100644 index 7e7780b..0000000 --- a/Persephone/Resources/ArtistViewItem.xib +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Persephone/State/ArtistListState.swift b/Persephone/State/ArtistListState.swift index f5df586..42734c5 100644 --- a/Persephone/State/ArtistListState.swift +++ b/Persephone/State/ArtistListState.swift @@ -9,5 +9,5 @@ import ReSwift struct ArtistListState: StateType, Equatable { - var artists: [String] = [] + var artists: [Artist] = [] } diff --git a/Persephone/State/Reducers/ArtistReducer.swift b/Persephone/State/Reducers/ArtistReducer.swift index 28e3fc2..19b53bf 100644 --- a/Persephone/State/Reducers/ArtistReducer.swift +++ b/Persephone/State/Reducers/ArtistReducer.swift @@ -13,7 +13,7 @@ func artistListReducer(action: Action, state: ArtistListState?) -> ArtistListSta switch action { case let action as UpdateArtistListAction: - state.artists = action.artists + state.artists = action.artists.map { Artist(name: $0) } default: break diff --git a/Persephone/Views/AlbumItemView.swift b/Persephone/Views/AlbumItemView.swift deleted file mode 100644 index ce56c16..0000000 --- a/Persephone/Views/AlbumItemView.swift +++ /dev/null @@ -1,17 +0,0 @@ -// -// AlbumItemView.swift -// Persephone -// -// Created by Daniel Barber on 2019/2/17. -// Copyright © 2019 Dan Barber. All rights reserved. -// - -import AppKit - -class AlbumItemView: NSView { - required init?(coder decoder: NSCoder) { - super.init(coder: decoder) - } - - @IBOutlet var imageView: NSImageView! -} diff --git a/Persephone/Views/ArtistItemView.swift b/Persephone/Views/ArtistItemView.swift deleted file mode 100644 index 8bb13f9..0000000 --- a/Persephone/Views/ArtistItemView.swift +++ /dev/null @@ -1,15 +0,0 @@ -// -// ArtistViewItem.swift -// Persephone -// -// Created by Daniel Barber on 2019/9/29. -// Copyright © 2019 Dan Barber. All rights reserved. -// - -import AppKit - -class ArtistItemView: NSView { - required init?(coder decoder: NSCoder) { - super.init(coder: decoder) - } -} diff --git a/Persephone/Views/BrowseViewButton.swift b/Persephone/Views/BrowseViewButton.swift deleted file mode 100644 index 445316c..0000000 --- a/Persephone/Views/BrowseViewButton.swift +++ /dev/null @@ -1,18 +0,0 @@ -// -// BrowseViewButton.swift -// Persephone -// -// Created by Daniel Barber on 2019/9/20. -// Copyright © 2019 Dan Barber. All rights reserved. -// - -import AppKit - -class BrowseViewButton: NSButton { - override func draw(_ dirtyRect: NSRect) { - super.draw(dirtyRect) - // Drawing code here. - self.layer?.cornerRadius = 4 - self.layer?.masksToBounds = true - } -}