Browse Source

Search: Add SearchableMLModel protocol and order extensions on Models

Carola Nitz 6 years ago
parent
commit
db70604a1b

+ 24 - 2
SharedSources/MediaLibraryModel/AlbumModel.swift

@@ -40,7 +40,6 @@ class AlbumModel: MLBaseModel {
 }
 }
 
 
 // MARK: - Sort
 // MARK: - Sort
-
 extension AlbumModel {
 extension AlbumModel {
     func sort(by criteria: VLCMLSortingCriteria) {
     func sort(by criteria: VLCMLSortingCriteria) {
         files = medialibrary.albums(sortingCriteria: criteria)
         files = medialibrary.albums(sortingCriteria: criteria)
@@ -50,13 +49,35 @@ extension AlbumModel {
 }
 }
 
 
 // MARK: - Edit
 // MARK: - Edit
-
 extension AlbumModel: EditableMLModel {
 extension AlbumModel: EditableMLModel {
     func editCellType() -> BaseCollectionViewCell.Type {
     func editCellType() -> BaseCollectionViewCell.Type {
         return MediaEditCell.self
         return MediaEditCell.self
     }
     }
 }
 }
 
 
+// MARK: - Search
+extension VLCMLAlbum: SearchableMLModel {
+    func contains(_ searchString: String) -> Bool {
+        var matches = false
+        matches = matches || title.lowercased().contains(searchString)
+        matches = matches || String(releaseYear()).lowercased().contains(searchString)
+        matches = matches || shortSummary.lowercased().contains(searchString)
+        matches = matches || albumArtist?.contains(searchString) ?? false
+        matches = matches || tracks?.filter({ $0.contains(searchString)}).isEmpty == false
+        return matches
+    }
+}
+
+extension VLCMLAlbumTrack: SearchableMLModel {
+    func contains(_ searchString: String) -> Bool {
+        var matches = false
+        matches = matches || artist?.contains(searchString) ?? false
+        matches = matches || genre?.contains(searchString) ?? false
+        matches = matches || album?.contains(searchString) ?? false
+        return matches
+    }
+}
+
 // MARK: - MediaLibraryObserver
 // MARK: - MediaLibraryObserver
 
 
 extension AlbumModel: MediaLibraryObserver {
 extension AlbumModel: MediaLibraryObserver {
@@ -86,6 +107,7 @@ extension VLCMLAlbum: MediaCollectionModel {
         return title
         return title
     }
     }
 }
 }
+
 extension VLCMLAlbum {
 extension VLCMLAlbum {
 
 
     func numberOfTracksString() -> String {
     func numberOfTracksString() -> String {

+ 13 - 7
SharedSources/MediaLibraryModel/ArtistModel.swift

@@ -39,6 +39,15 @@ class ArtistModel: MLBaseModel {
     }
     }
 }
 }
 
 
+// MARK: - Sort
+extension ArtistModel {
+    func sort(by criteria: VLCMLSortingCriteria) {
+        files = medialibrary.artists(sortingCriteria: criteria)
+        sortModel.currentSort = criteria
+        updateView?()
+    }
+}
+
 // MARK: - Edit
 // MARK: - Edit
 extension ArtistModel: EditableMLModel {
 extension ArtistModel: EditableMLModel {
     func editCellType() -> BaseCollectionViewCell.Type {
     func editCellType() -> BaseCollectionViewCell.Type {
@@ -46,13 +55,10 @@ extension ArtistModel: EditableMLModel {
     }
     }
 }
 }
 
 
-// MARK: - Sort
-
-extension ArtistModel {
-    func sort(by criteria: VLCMLSortingCriteria) {
-        files = medialibrary.artists(sortingCriteria: criteria)
-        sortModel.currentSort = criteria
-        updateView?()
+// MARK: - Search
+extension VLCMLArtist: SearchableMLModel {
+    func contains(_ searchString: String) -> Bool {
+        return name.lowercased().contains(searchString)
     }
     }
 }
 }
 
 

+ 15 - 12
SharedSources/MediaLibraryModel/GenreModel.swift

@@ -39,16 +39,6 @@ class GenreModel: MLBaseModel {
     }
     }
 }
 }
 
 
-// MARK: - Sort
-
-extension GenreModel {
-    func sort(by criteria: VLCMLSortingCriteria) {
-        files = medialibrary.genres(sortingCriteria: criteria)
-        sortModel.currentSort = criteria
-        updateView?()
-    }
-}
-
 // MARK: - MediaLibraryObserver
 // MARK: - MediaLibraryObserver
 
 
 extension GenreModel: MediaLibraryObserver {
 extension GenreModel: MediaLibraryObserver {
@@ -66,16 +56,29 @@ extension GenreModel: MediaLibraryObserver {
 
 
 }
 }
 
 
+// MARK: - Sort
+extension GenreModel {
+    func sort(by criteria: VLCMLSortingCriteria) {
+        files = medialibrary.genres(sortingCriteria: criteria)
+        sortModel.currentSort = criteria
+        updateView?()
+    }
+}
 // MARK: - Edit
 // MARK: - Edit
-
 extension GenreModel: EditableMLModel {
 extension GenreModel: EditableMLModel {
     func editCellType() -> BaseCollectionViewCell.Type {
     func editCellType() -> BaseCollectionViewCell.Type {
         return MediaEditCell.self
         return MediaEditCell.self
     }
     }
 }
 }
 
 
-// MARK: - Helpers
+// MARK: - Search
+extension VLCMLGenre: SearchableMLModel {
+    func contains(_ searchString: String) -> Bool {
+        return name.lowercased().contains(searchString)
+    }
+}
 
 
+// MARK: - Helpers
 extension VLCMLGenre {
 extension VLCMLGenre {
     @objc func numberOfTracksString() -> String {
     @objc func numberOfTracksString() -> String {
         let numberOftracks = numberOfTracks()
         let numberOftracks = numberOfTracks()

+ 3 - 1
SharedSources/MediaLibraryModel/MediaLibraryBaseModel.swift

@@ -65,9 +65,11 @@ extension MLBaseModel {
 }
 }
 
 
 protocol EditableMLModel {
 protocol EditableMLModel {
-
     func editCellType() -> BaseCollectionViewCell.Type
     func editCellType() -> BaseCollectionViewCell.Type
+}
 
 
+protocol SearchableMLModel {
+    func contains(_ searchString: String) -> Bool
 }
 }
 
 
 protocol MediaCollectionModel {
 protocol MediaCollectionModel {

+ 7 - 0
SharedSources/MediaLibraryModel/MediaModel.swift

@@ -157,6 +157,13 @@ extension VLCMLMedia {
     }
     }
 }
 }
 
 
+// MARK: - Search
+extension VLCMLMedia: SearchableMLModel {
+    func contains(_ searchString: String) -> Bool {
+        return title.lowercased().contains(searchString)
+    }
+}
+
 extension VLCMLMedia {
 extension VLCMLMedia {
     func albumTrackArtistName() -> String {
     func albumTrackArtistName() -> String {
         guard let albumTrack = albumTrack else {
         guard let albumTrack = albumTrack else {

+ 7 - 1
SharedSources/MediaLibraryModel/PlaylistModel.swift

@@ -59,7 +59,6 @@ class PlaylistModel: MLBaseModel {
 }
 }
 
 
 // MARK: - Sort
 // MARK: - Sort
-
 extension PlaylistModel {
 extension PlaylistModel {
     func sort(by criteria: VLCMLSortingCriteria) {
     func sort(by criteria: VLCMLSortingCriteria) {
         files = medialibrary.playlists(sortingCriteria: criteria)
         files = medialibrary.playlists(sortingCriteria: criteria)
@@ -75,6 +74,13 @@ extension PlaylistModel: EditableMLModel {
     }
     }
 }
 }
 
 
+// MARK: - Search
+extension VLCMLPlaylist: SearchableMLModel {
+    func contains(_ searchString: String) -> Bool {
+        return name.lowercased().contains(searchString)
+    }
+}
+
 // MARK: - MediaLibraryObserver
 // MARK: - MediaLibraryObserver
 extension PlaylistModel: MediaLibraryObserver {
 extension PlaylistModel: MediaLibraryObserver {
     func medialibrary(_ medialibrary: MediaLibraryService, didAddPlaylists playlists: [VLCMLPlaylist]) {
     func medialibrary(_ medialibrary: MediaLibraryService, didAddPlaylists playlists: [VLCMLPlaylist]) {

+ 6 - 66
Sources/LibrarySearchDataSource.swift

@@ -33,73 +33,13 @@ class LibrarySearchDataSource: NSObject {
         searchData.removeAll()
         searchData.removeAll()
         let lowercaseSearchString = searchString.lowercased()
         let lowercaseSearchString = searchString.lowercased()
         model.anyfiles.forEach {
         model.anyfiles.forEach {
-            if let media = $0 as? VLCMLMedia {
-                if media.contains(lowercaseSearchString) { searchData.append($0) }
-            } else if let album = $0 as? VLCMLAlbum {
-                if album.contains(lowercaseSearchString) { searchData.append($0) }
-            } else if let genre = $0 as? VLCMLGenre {
-                if genre.contains(lowercaseSearchString) { searchData.append($0) }
-            } else if let playlist = $0 as? VLCMLPlaylist {
-                if playlist.contains(lowercaseSearchString) { searchData.append($0) }
-            } else if let artist = $0 as? VLCMLArtist {
-                if artist.contains(lowercaseSearchString) { searchData.append($0) }
-            } else if let albumtrack = $0 as? VLCMLAlbumTrack {
-                if albumtrack.contains(lowercaseSearchString) { searchData.append($0) }
-            } else {
-                assertionFailure("unhandled type")
+            guard let searchableFile = $0 as? SearchableMLModel else {
+                assertionFailure("LibrarySearchDataSource: Unhandled type")
+                return
+            }
+            if searchableFile.contains(lowercaseSearchString) {
+                searchData.append($0)
             }
             }
         }
         }
     }
     }
 }
 }
-
-extension VLCMLObject {
-    func contains(_ searchString: String) -> Bool {
-        return false
-    }
-}
-
-extension VLCMLMedia {
-    func contains(_ searchString: String) -> Bool {
-        return title.lowercased().contains(searchString)
-    }
-}
-
-extension VLCMLAlbum {
-    func contains(_ searchString: String) -> Bool {
-        var matches = false
-        matches = matches || title.lowercased().contains(searchString)
-        matches = matches || String(releaseYear()).lowercased().contains(searchString)
-        matches = matches || shortSummary.lowercased().contains(searchString)
-        matches = matches || albumArtist?.contains(searchString) ?? false
-        matches = matches || tracks?.filter({ $0.contains(searchString)}).isEmpty == false
-        return matches
-    }
-}
-
-extension VLCMLGenre {
-    func contains(_ searchString: String) -> Bool {
-        return name.lowercased().contains(searchString)
-    }
-}
-
-extension VLCMLPlaylist {
-    func contains(_ searchString: String) -> Bool {
-        return name.lowercased().contains(searchString)
-    }
-}
-
-extension VLCMLArtist {
-    func contains(_ searchString: String) -> Bool {
-        return name.lowercased().contains(searchString)
-    }
-}
-
-extension VLCMLAlbumTrack {
-    func contains(_ searchString: String) -> Bool {
-        var matches = false
-        matches = matches || artist?.contains(searchString) ?? false
-        matches = matches || genre?.contains(searchString) ?? false
-        matches = matches || album?.contains(searchString) ?? false
-        return matches
-    }
-}