diff --git a/lib/components/library/user_local_tracks.dart b/lib/components/library/user_local_tracks.dart index f4e782d94..095e6e970 100644 --- a/lib/components/library/user_local_tracks.dart +++ b/lib/components/library/user_local_tracks.dart @@ -50,10 +50,11 @@ enum SortBy { none, ascending, descending, - artist, - album, newest, oldest, + duration, + artist, + album, } final localTracksProvider = FutureProvider>((ref) async { diff --git a/lib/components/shared/sort_tracks_dropdown.dart b/lib/components/shared/sort_tracks_dropdown.dart index 0547beb0c..ab35b2e31 100644 --- a/lib/components/shared/sort_tracks_dropdown.dart +++ b/lib/components/shared/sort_tracks_dropdown.dart @@ -48,6 +48,11 @@ class SortTracksDropdown extends StatelessWidget { enabled: value != SortBy.oldest, title: Text(context.l10n.sort_oldest), ), + PopSheetEntry( + value: SortBy.duration, + enabled: value != SortBy.duration, + title: Text(context.l10n.sort_duration), + ), PopSheetEntry( value: SortBy.artist, enabled: value != SortBy.artist, diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index b1e8331fe..244d75e26 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -41,6 +41,7 @@ "sort_z_a": "Sort by Z-A", "sort_artist": "Sort by Artist", "sort_album": "Sort by Album", + "sort_duration": "Sort by Duration", "sort_tracks": "Sort Tracks", "currently_downloading": "Currently Downloading ({tracks_length})", "cancel_all": "Cancel All", diff --git a/lib/utils/service_utils.dart b/lib/utils/service_utils.dart index 4d9d1e679..60c77e59a 100644 --- a/lib/utils/service_utils.dart +++ b/lib/utils/service_utils.dart @@ -292,24 +292,24 @@ abstract class ServiceUtils { return List.from(tracks) ..sort((a, b) { 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: return a.name?.compareTo(b.name ?? "") ?? 0; - case SortBy.oldest: - final aDate = parseSpotifyAlbumDate(a.album); - final bDate = parseSpotifyAlbumDate(b.album); - return aDate.compareTo(bDate); + case SortBy.descending: + return b.name?.compareTo(a.name ?? "") ?? 0; case SortBy.newest: final aDate = parseSpotifyAlbumDate(a.album); final bDate = parseSpotifyAlbumDate(b.album); return bDate.compareTo(aDate); - case SortBy.descending: - return b.name?.compareTo(a.name ?? "") ?? 0; + case SortBy.oldest: + 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: return 0; }