feat: Sort by Duration (#1238)

This commit is contained in:
Kuyumee 2024-02-19 01:35:42 +08:00 committed by GitHub
parent 3294f657fe
commit 6f8271f5e9
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 21 additions and 14 deletions

View File

@ -50,10 +50,11 @@ enum SortBy {
none, none,
ascending, ascending,
descending, descending,
artist,
album,
newest, newest,
oldest, oldest,
duration,
artist,
album,
} }
final localTracksProvider = FutureProvider<List<LocalTrack>>((ref) async { final localTracksProvider = FutureProvider<List<LocalTrack>>((ref) async {

View File

@ -48,6 +48,11 @@ class SortTracksDropdown extends StatelessWidget {
enabled: value != SortBy.oldest, enabled: value != SortBy.oldest,
title: Text(context.l10n.sort_oldest), title: Text(context.l10n.sort_oldest),
), ),
PopSheetEntry(
value: SortBy.duration,
enabled: value != SortBy.duration,
title: Text(context.l10n.sort_duration),
),
PopSheetEntry( PopSheetEntry(
value: SortBy.artist, value: SortBy.artist,
enabled: value != SortBy.artist, enabled: value != SortBy.artist,

View File

@ -41,6 +41,7 @@
"sort_z_a": "Sort by Z-A", "sort_z_a": "Sort by Z-A",
"sort_artist": "Sort by Artist", "sort_artist": "Sort by Artist",
"sort_album": "Sort by Album", "sort_album": "Sort by Album",
"sort_duration": "Sort by Duration",
"sort_tracks": "Sort Tracks", "sort_tracks": "Sort Tracks",
"currently_downloading": "Currently Downloading ({tracks_length})", "currently_downloading": "Currently Downloading ({tracks_length})",
"cancel_all": "Cancel All", "cancel_all": "Cancel All",

View File

@ -292,24 +292,24 @@ abstract class ServiceUtils {
return List<T>.from(tracks) return List<T>.from(tracks)
..sort((a, b) { ..sort((a, b) {
switch (sortBy) { switch (sortBy) {
case SortBy.album:
return a.album?.name?.compareTo(b.album?.name ?? "") ?? 0;
case SortBy.artist:
return a.artists?.first.name
?.compareTo(b.artists?.first.name ?? "") ??
0;
case SortBy.ascending: case SortBy.ascending:
return a.name?.compareTo(b.name ?? "") ?? 0; return a.name?.compareTo(b.name ?? "") ?? 0;
case SortBy.oldest: case SortBy.descending:
final aDate = parseSpotifyAlbumDate(a.album); return b.name?.compareTo(a.name ?? "") ?? 0;
final bDate = parseSpotifyAlbumDate(b.album);
return aDate.compareTo(bDate);
case SortBy.newest: case SortBy.newest:
final aDate = parseSpotifyAlbumDate(a.album); final aDate = parseSpotifyAlbumDate(a.album);
final bDate = parseSpotifyAlbumDate(b.album); final bDate = parseSpotifyAlbumDate(b.album);
return bDate.compareTo(aDate); return bDate.compareTo(aDate);
case SortBy.descending: case SortBy.oldest:
return b.name?.compareTo(a.name ?? "") ?? 0; final aDate = parseSpotifyAlbumDate(a.album);
final bDate = parseSpotifyAlbumDate(b.album);
return aDate.compareTo(bDate);
case SortBy.duration:
return a.durationMs?.compareTo(b.durationMs ?? 0) ?? 0;
case SortBy.artist:
return a.artists?.first.name?.compareTo(b.artists?.first.name ?? "") ?? 0;
case SortBy.album:
return a.album?.name?.compareTo(b.album?.name ?? "") ?? 0;
default: default:
return 0; return 0;
} }