From 22564e88cfc7742548d0ca0c88563c95536897ce Mon Sep 17 00:00:00 2001 From: wakingrufus Date: Wed, 20 Jul 2022 14:39:18 -0500 Subject: [PATCH] Allow shuffle sorting of the album list improve library refreshes to not lose selection in album view and tag view --- .../wakingrufus/jamm/common/AlbumKey.kt | 23 +------- .../wakingrufus/jamm/common/LibraryScanner.kt | 5 +- .../wakingrufus/jamm/desktop/AlbumsView.kt | 59 +++++++++++++++---- .../wakingrufus/jamm/desktop/TagView.kt | 19 +++--- .../wakingrufus/jamm/desktop/csv/TrackCsv.kt | 4 +- 5 files changed, 65 insertions(+), 45 deletions(-) diff --git a/common/src/main/kotlin/com/github/wakingrufus/jamm/common/AlbumKey.kt b/common/src/main/kotlin/com/github/wakingrufus/jamm/common/AlbumKey.kt index bac7d70..4ea3e04 100644 --- a/common/src/main/kotlin/com/github/wakingrufus/jamm/common/AlbumKey.kt +++ b/common/src/main/kotlin/com/github/wakingrufus/jamm/common/AlbumKey.kt @@ -1,24 +1,5 @@ package com.github.wakingrufus.jamm.common -class AlbumKey(val id: String?, val albumArtist: String, val albumName: String) { - override fun equals(other: Any?): Boolean { - if (this === other) return true - if (javaClass != other?.javaClass) return false - - other as AlbumKey - - if (id != null && id == other.id) return true - if (albumArtist != other.albumArtist) return false - if (albumName != other.albumName) return false - - return true - } - - override fun hashCode(): Int { - return id?.hashCode() ?: (31 * albumArtist.hashCode() + albumName.hashCode()) - } - - override fun toString(): String { - return "AlbumKey(id=$id, albumArtist='$albumArtist', albumName='$albumName')" - } +data class AlbumKey(val albumArtist: String, val albumName: String) { + var id: String? = null } \ No newline at end of file diff --git a/common/src/main/kotlin/com/github/wakingrufus/jamm/common/LibraryScanner.kt b/common/src/main/kotlin/com/github/wakingrufus/jamm/common/LibraryScanner.kt index 4f37465..35a172b 100644 --- a/common/src/main/kotlin/com/github/wakingrufus/jamm/common/LibraryScanner.kt +++ b/common/src/main/kotlin/com/github/wakingrufus/jamm/common/LibraryScanner.kt @@ -67,10 +67,11 @@ fun buildTrack(rootFile: File, file: File, audioFile: AudioFile): ScanResult { } else null val albumKey = AlbumKey( - id = releaseId, albumArtist = albumArtist.name, albumName = albumName - ) + ).apply { + id = releaseId + } val originalYear = tag.getFirst(FieldKey.ORIGINAL_YEAR) val originalDate = tag.getFirst(FieldKey.ORIGINALRELEASEDATE) val year = tag.getFirst(FieldKey.YEAR) diff --git a/desktop/src/main/kotlin/com/github/wakingrufus/jamm/desktop/AlbumsView.kt b/desktop/src/main/kotlin/com/github/wakingrufus/jamm/desktop/AlbumsView.kt index 7c00634..bfd9618 100644 --- a/desktop/src/main/kotlin/com/github/wakingrufus/jamm/desktop/AlbumsView.kt +++ b/desktop/src/main/kotlin/com/github/wakingrufus/jamm/desktop/AlbumsView.kt @@ -28,12 +28,13 @@ class AlbumsView(val library: ObservableLibrary, val mediaPlayer: MediaPlayerCon } lateinit var yearSelection: ComboBox lateinit var albumListView: ListView + val albums = FXCollections.observableArrayList() fun viewAlbum(albumKey: AlbumKey) { selectedAlbum.set(albumKey) } - fun applyFilter() { + fun applyFilter(selection: AlbumKey? = null) { GlobalScope.launch(Dispatchers.Default) { val newItems = library.tracks .filtered { track -> @@ -45,16 +46,22 @@ class AlbumsView(val library: ObservableLibrary, val mediaPlayer: MediaPlayerCon .grouped { it.albumKey } .sorted(Comparator.comparing { it.albumName }) withContext(Dispatchers.JavaFx) { - albumListView.items = newItems + albums.setAll(newItems) + if (selection != null) { + albumListView.selectionModel.select(selection) + } } } } init { - library.addListener { applyFilter() } + library.addListener { + val oldSelection = selectedAlbum.get() + applyFilter(selection = oldSelection) + } top { button("Play Random Album") { - this.action { + action { library.tracks.grouped { it.albumKey }.random().also { selectedAlbumKey -> mediaPlayer.play(library.tracks.filtered { it.albumKey == selectedAlbumKey } ?.sortedBy { it.trackNumber } @@ -75,15 +82,41 @@ class AlbumsView(val library: ObservableLibrary, val mediaPlayer: MediaPlayerCon } } - left { - albumListView = listview(library.tracks - .grouped { it.albumKey } - .sorted(Comparator.comparing { it.albumName }) - ) { - this.cellFactory = CustomStringCellFactory { it.albumName + " - " + it.albumArtist } - bindSelected(selectedAlbum) - yearSelection.selectionModel.selectedItemProperty().onChange { - applyFilter() + left { + top { + label("Sort:") + button("Alpha") { + action { + GlobalScope.launch(Dispatchers.Default) { + val newAlbums = library.tracks + .grouped { it.albumKey } + .sorted(Comparator.comparing { it.albumName }) + withContext(Dispatchers.JavaFx) { + albums.setAll(newAlbums) + } + } + } + } + button("Random") { + action { + GlobalScope.launch(Dispatchers.Default) { + val newAlbums = library.tracks + .grouped { it.albumKey } + .shuffled() + withContext(Dispatchers.JavaFx) { + albums.setAll(newAlbums) + } + } + } + } + } + center { + albumListView = listview(albums) { + this.cellFactory = CustomStringCellFactory { it.albumName + " - " + it.albumArtist } + bindSelected(selectedAlbum) + yearSelection.selectionModel.selectedItemProperty().onChange { + applyFilter() + } } } } diff --git a/desktop/src/main/kotlin/com/github/wakingrufus/jamm/desktop/TagView.kt b/desktop/src/main/kotlin/com/github/wakingrufus/jamm/desktop/TagView.kt index e88ec6c..56b2579 100644 --- a/desktop/src/main/kotlin/com/github/wakingrufus/jamm/desktop/TagView.kt +++ b/desktop/src/main/kotlin/com/github/wakingrufus/jamm/desktop/TagView.kt @@ -1,7 +1,6 @@ package com.github.wakingrufus.jamm.desktop import com.github.wakingrufus.jamm.common.Track -import com.github.wakingrufus.jamm.library.LibraryListener import com.github.wakingrufus.javafx.* import javafx.beans.property.SimpleObjectProperty import javafx.collections.FXCollections @@ -30,13 +29,7 @@ class TagView(val library: ObservableLibrary, val mediaPlayer: MediaPlayerContro init { left { val tagList = FXCollections.observableArrayList() - library.addTagListener { - GlobalScope.launch(Dispatchers.JavaFx) { - tagList.clear() - tagList.addAll(library.tracks.flatMapUnique { it.tags }.sorted()) - } - } - listview(tagList) { + val listView = listview(tagList) { bindSelected(selectedTag) contextMenu { actionItem("Export") { @@ -48,6 +41,16 @@ class TagView(val library: ObservableLibrary, val mediaPlayer: MediaPlayerContro } } } + library.addTagListener { + val oldSelection = selectedTag.get() + GlobalScope.launch(Dispatchers.JavaFx) { + tagList.clear() + tagList.addAll(library.tracks.flatMapUnique { it.tags }.sorted()) + if (oldSelection != null) { + listView.selectionModel.select(oldSelection) + } + } + } } center { trackTable(tracks, library, mediaPlayer, listOf("Remove From Tag" to { diff --git a/desktop/src/main/kotlin/com/github/wakingrufus/jamm/desktop/csv/TrackCsv.kt b/desktop/src/main/kotlin/com/github/wakingrufus/jamm/desktop/csv/TrackCsv.kt index 3fb21a5..1c5e8a9 100644 --- a/desktop/src/main/kotlin/com/github/wakingrufus/jamm/desktop/csv/TrackCsv.kt +++ b/desktop/src/main/kotlin/com/github/wakingrufus/jamm/desktop/csv/TrackCsv.kt @@ -16,7 +16,9 @@ fun CSVRecord.toTrack(baseDir: File): Track { album = get("album"), albumArtist = AlbumArtist(get("albumArtist")), artist = Artist(get("artist")), - albumKey = AlbumKey(albumIdString.ifBlank { null }, get("albumArtist"), get("album")), + albumKey = AlbumKey(get("albumArtist"), get("album")).apply { + id = albumIdString.ifBlank { null } + }, trackNumber = get("trackNumber").toIntOrNull(), discNumber = get("discNumber").toIntOrNull(), path = get("path"),