fix: add default sorting option for playlists and user songs (should fix: #637)

This commit is contained in:
Valeri Gokadze
2025-10-17 20:43:08 +04:00
parent 344b920ff1
commit 0d3ff2a4f1
25 changed files with 53 additions and 9 deletions

View File

@@ -44,6 +44,7 @@
"customPlaylistName": "اسم قائمة التشغيل الخاصة",
"customPlaylists": "Custom playlists",
"dateAdded": "Date Added",
"default_": "Default",
"delete": "Delete",
"deleteFolder": "Delete folder",
"deleteFolderQuestion": "Are you sure you want to delete this folder? Playlists inside will be moved to the main library.",

View File

@@ -44,6 +44,7 @@
"customPlaylistName": "Name der benutzerdefinierten Playlist",
"customPlaylists": "Custom playlists",
"dateAdded": "Date Added",
"default_": "Default",
"delete": "Delete",
"deleteFolder": "Delete folder",
"deleteFolderQuestion": "Are you sure you want to delete this folder? Playlists inside will be moved to the main library.",

View File

@@ -44,6 +44,7 @@
"customPlaylistName": "Όνομα προσαρμοσμένης λίστας αναπαραγωγής",
"customPlaylists": "Custom playlists",
"dateAdded": "Date Added",
"default_": "Default",
"delete": "Delete",
"deleteFolder": "Delete folder",
"deleteFolderQuestion": "Are you sure you want to delete this folder? Playlists inside will be moved to the main library.",

View File

@@ -44,6 +44,7 @@
"customPlaylistName": "Custom playlist name",
"customPlaylists": "Custom playlists",
"dateAdded": "Date Added",
"default_": "Default",
"delete": "Delete",
"deleteFolder": "Delete folder",
"deleteFolderQuestion": "Are you sure you want to delete this folder? Playlists inside will be moved to the main library.",

View File

@@ -44,6 +44,7 @@
"customPlaylistName": "Nombre personalizado de la lista de reproducción",
"customPlaylists": "Listas de reproducción personalizadas",
"dateAdded": "Date Added",
"default_": "Default",
"delete": "Eliminar",
"deleteFolder": "Eliminar carpeta",
"deleteFolderQuestion": "¿Estás seguro de que deseas eliminar esta carpeta? Las listas de reproducción que contiene se moverán a la biblioteca principal.",

View File

@@ -44,6 +44,7 @@
"customPlaylistName": "Kohandatud nimekirja nimi",
"customPlaylists": "Kohandatud nimekirjad",
"dateAdded": "Date Added",
"default_": "Default",
"delete": "Kustuta",
"deleteFolder": "Kustuta kaust",
"deleteFolderQuestion": "Kas olete kindel, et soovite selle kausta kustutada? Kaustas olevad nimekirjad liigutatakse peamise teeki.",

View File

@@ -44,6 +44,7 @@
"customPlaylistName": "Nom de la playlist personnalisée",
"customPlaylists": "Playlists personnalisées",
"dateAdded": "Date Added",
"default_": "Default",
"delete": "Supprimer",
"deleteFolder": "Supprimer le dossier",
"deleteFolderQuestion": "Êtes-vous sûr de vouloir supprimer ce dossier ? Les playlists qu'il contient seront déplacées vers la bibliothèque principale.",

View File

@@ -44,6 +44,7 @@
"customPlaylistName": "שם רשימת השמעה מותאם אישית",
"customPlaylists": "רשימות השמעה מותאמות אישית",
"dateAdded": "Date Added",
"default_": "Default",
"delete": "Delete",
"deleteFolder": "Delete folder",
"deleteFolderQuestion": "Are you sure you want to delete this folder? Playlists inside will be moved to the main library.",

View File

@@ -44,6 +44,7 @@
"customPlaylistName": "कस्टम प्लेलिस्ट नाम",
"customPlaylists": "कस्टम प्लेलिस्ट",
"dateAdded": "Date Added",
"default_": "Default",
"delete": "Delete",
"deleteFolder": "Delete folder",
"deleteFolderQuestion": "Are you sure you want to delete this folder? Playlists inside will be moved to the main library.",

View File

@@ -44,6 +44,7 @@
"customPlaylistName": "Saját lejátszási lista neve",
"customPlaylists": "Saját lejátszási listák",
"dateAdded": "Date Added",
"default_": "Default",
"delete": "Törlés",
"deleteFolder": "Mappa törlése",
"deleteFolderQuestion": "Biztos törölni akarod a mappát? A benne lévő lejátszási listák átkerülnek a fő könyvtárba.",

View File

@@ -44,6 +44,7 @@
"customPlaylistName": "Nama playlist khusus",
"customPlaylists": "Playlist khusus",
"dateAdded": "Date Added",
"default_": "Default",
"delete": "Delete",
"deleteFolder": "Delete folder",
"deleteFolderQuestion": "Are you sure you want to delete this folder? Playlists inside will be moved to the main library.",

View File

@@ -44,6 +44,7 @@
"customPlaylistName": "Nome playlist personalizzata",
"customPlaylists": "Custom playlists",
"dateAdded": "Date Added",
"default_": "Default",
"delete": "Delete",
"deleteFolder": "Delete folder",
"deleteFolderQuestion": "Are you sure you want to delete this folder? Playlists inside will be moved to the main library.",

View File

@@ -44,6 +44,7 @@
"customPlaylistName": "リスト名の指定",
"customPlaylists": "あなたの再生リスト",
"dateAdded": "Date Added",
"default_": "Default",
"delete": "削除",
"deleteFolder": "フォルダーを削除",
"deleteFolderQuestion": "このフォルダーを削除しますか? 中身の再生リストは、メインのライブラリに移動されます。",

View File

@@ -44,6 +44,7 @@
"customPlaylistName": "커스텀 재생목록 이름",
"customPlaylists": "커스텀 재생목록",
"dateAdded": "Date Added",
"default_": "Default",
"delete": "삭제",
"deleteFolder": "폴더 삭제",
"deleteFolderQuestion": "이 폴더를 삭제할까요? 폴더 안의 재생목록이 기본 라이브러리로 이동합니다.",

View File

@@ -44,6 +44,7 @@
"customPlaylistName": "Własna nazwa playlisty",
"customPlaylists": "Custom playlists",
"dateAdded": "Date Added",
"default_": "Default",
"delete": "Delete",
"deleteFolder": "Delete folder",
"deleteFolderQuestion": "Are you sure you want to delete this folder? Playlists inside will be moved to the main library.",

View File

@@ -44,6 +44,7 @@
"customPlaylistName": "Nome da playlist",
"customPlaylists": "Playlists personalizadas",
"dateAdded": "Date Added",
"default_": "Default",
"delete": "Delete",
"deleteFolder": "Delete folder",
"deleteFolderQuestion": "Are you sure you want to delete this folder? Playlists inside will be moved to the main library.",

View File

@@ -44,6 +44,7 @@
"customPlaylistName": "Название плейлиста",
"customPlaylists": "Плейлисты",
"dateAdded": "Date Added",
"default_": "Default",
"delete": "Delete",
"deleteFolder": "Delete folder",
"deleteFolderQuestion": "Are you sure you want to delete this folder? Playlists inside will be moved to the main library.",

View File

@@ -44,6 +44,7 @@
"customPlaylistName": "Anpassat spellistsnamn",
"customPlaylists": "Anpassade spellistor",
"dateAdded": "Date Added",
"default_": "Default",
"delete": "Delete",
"deleteFolder": "Delete folder",
"deleteFolderQuestion": "Are you sure you want to delete this folder? Playlists inside will be moved to the main library.",

View File

@@ -44,6 +44,7 @@
"customPlaylistName": "Çalma Listesi İsmi",
"customPlaylists": "Kişisel Çalma Listeleri",
"dateAdded": "Date Added",
"default_": "Default",
"delete": "Delete",
"deleteFolder": "Delete folder",
"deleteFolderQuestion": "Are you sure you want to delete this folder? Playlists inside will be moved to the main library.",

View File

@@ -44,6 +44,7 @@
"customPlaylistName": "Назва власного плейлиста",
"customPlaylists": "Custom playlists",
"dateAdded": "Date Added",
"default_": "Default",
"delete": "Delete",
"deleteFolder": "Delete folder",
"deleteFolderQuestion": "Are you sure you want to delete this folder? Playlists inside will be moved to the main library.",

View File

@@ -44,6 +44,7 @@
"customPlaylistName": "新建播放列表名稱",
"customPlaylists": "Custom playlists",
"dateAdded": "Date Added",
"default_": "Default",
"delete": "Delete",
"deleteFolder": "Delete folder",
"deleteFolderQuestion": "Are you sure you want to delete this folder? Playlists inside will be moved to the main library.",

View File

@@ -44,6 +44,7 @@
"customPlaylistName": "新建播放列表名称",
"customPlaylists": "Custom playlists",
"dateAdded": "Date Added",
"default_": "Default",
"delete": "Delete",
"deleteFolder": "Delete folder",
"deleteFolderQuestion": "Are you sure you want to delete this folder? Playlists inside will be moved to the main library.",

View File

@@ -43,7 +43,7 @@ import 'package:musify/widgets/song_bar.dart';
import 'package:musify/widgets/sort_button.dart';
import 'package:musify/widgets/spinner.dart';
enum PlaylistSortType { title, artist }
enum PlaylistSortType { default_, title, artist }
class PlaylistPage extends StatefulWidget {
const PlaylistPage({
@@ -77,7 +77,7 @@ class _PlaylistPageState extends State<PlaylistPage> {
// Sorting
late PlaylistSortType _sortType = PlaylistSortType.values.firstWhere(
(e) => e.name == playlistSortSetting,
orElse: () => PlaylistSortType.title,
orElse: () => PlaylistSortType.default_,
);
@override
@@ -558,6 +558,8 @@ class _PlaylistPageState extends State<PlaylistPage> {
String _getSortTypeDisplayText(PlaylistSortType type) {
switch (type) {
case PlaylistSortType.default_:
return context.l10n!.default_;
case PlaylistSortType.title:
return context.l10n!.name;
case PlaylistSortType.artist:
@@ -587,10 +589,23 @@ class _PlaylistPageState extends State<PlaylistPage> {
void _sortPlaylist(PlaylistSortType type) {
if (_playlist == null || _playlist['list'] == null) return;
final playlist = _playlist['list'] as List;
final sortKey = type == PlaylistSortType.title ? 'title' : 'artist';
// Skip sorting if using default order
if (type == PlaylistSortType.default_) return;
final playlist = _playlist['list'] as List;
switch (type) {
case PlaylistSortType.default_:
// Should not reach here due to early return above
break;
case PlaylistSortType.title:
sortSongsByKey(playlist, 'title');
break;
case PlaylistSortType.artist:
sortSongsByKey(playlist, 'artist');
break;
}
sortSongsByKey(playlist, sortKey);
_playlist['list'] = playlist;
}

View File

@@ -32,7 +32,7 @@ import 'package:musify/widgets/playlist_header.dart';
import 'package:musify/widgets/song_bar.dart';
import 'package:musify/widgets/sort_button.dart';
enum OfflineSortType { title, artist, dateAdded }
enum OfflineSortType { default_, title, artist, dateAdded }
class UserSongsPage extends StatefulWidget {
const UserSongsPage({super.key, required this.page});
@@ -88,7 +88,7 @@ class _UserSongsPageState extends State<UserSongsPage> {
OfflineSortType _getCurrentOfflineSortType() {
return OfflineSortType.values.firstWhere(
(e) => e.name == offlineSortSetting,
orElse: () => OfflineSortType.title,
orElse: () => OfflineSortType.default_,
);
}
@@ -283,6 +283,7 @@ class _UserSongsPageState extends State<UserSongsPage> {
String _getSortTypeDisplayText(OfflineSortType type) {
return switch (type) {
OfflineSortType.default_ => context.l10n!.default_,
OfflineSortType.title => context.l10n!.name,
OfflineSortType.artist => context.l10n!.artist,
OfflineSortType.dateAdded => context.l10n!.dateAdded,
@@ -290,7 +291,13 @@ class _UserSongsPageState extends State<UserSongsPage> {
}
void _sortOfflineSongs(OfflineSortType type) {
// Skip sorting and saving if using default order
if (type == OfflineSortType.default_) return;
switch (type) {
case OfflineSortType.default_:
// Should not reach here due to early return above
break;
case OfflineSortType.title:
userOfflineSongs.sort((a, b) {
final titleA = (a['title'] ?? '').toString().toLowerCase();

View File

@@ -81,11 +81,11 @@ final themeModeSetting =
String playlistSortSetting = Hive.box(
'settings',
).get('playlistSortType', defaultValue: PlaylistSortType.title.name);
).get('playlistSortType', defaultValue: PlaylistSortType.default_.name);
String offlineSortSetting = Hive.box(
'settings',
).get('offlineSortType', defaultValue: OfflineSortType.title.name);
).get('offlineSortType', defaultValue: OfflineSortType.default_.name);
Color primaryColorSetting = Color(
Hive.box('settings').get('accentColor', defaultValue: 0xff91cef4),