Skip to content

Commit

Permalink
feat: subpages tracks sorting
Browse files Browse the repository at this point in the history
  • Loading branch information
MSOB7YY committed Oct 20, 2023
1 parent 4c145d6 commit b82dce2
Show file tree
Hide file tree
Showing 16 changed files with 435 additions and 156 deletions.
3 changes: 3 additions & 0 deletions lib/controller/folders_controller.dart
Expand Up @@ -3,8 +3,10 @@ import 'package:get/get.dart';
import 'package:namida/class/folder.dart';
import 'package:namida/class/track.dart';
import 'package:namida/controller/scroll_search_controller.dart';
import 'package:namida/controller/search_sort_controller.dart';
import 'package:namida/controller/settings_controller.dart';
import 'package:namida/core/enums.dart';
import 'package:namida/core/extensions.dart';

class Folders {
static Folders get inst => _instance;
Expand Down Expand Up @@ -64,6 +66,7 @@ class Folders {
if (LibraryTab.folders.scrollController.hasClients) {
LibraryTab.folders.scrollController.jumpTo(0);
}
currentFolder.value?.tracks.sortByAlts(SearchSortController.inst.getMediaTracksSortingComparables(MediaType.folder));
}

void stepOut() {
Expand Down
50 changes: 41 additions & 9 deletions lib/controller/indexer_controller.dart
Expand Up @@ -149,14 +149,42 @@ class Indexer {
mainMapFolders.addForce(tr.folder, tr);
});

mainMapAlbums.value.updateAll((key, value) => value..sortByAlts((e) => e.year, [(e) => e.trackNo, (e) => e.title]));
mainMapArtists.value.updateAll((key, value) => value..sortByAlt((e) => e.year, (e) => e.title));
mainMapGenres.value.updateAll((key, value) => value..sortByAlt((e) => e.year, (e) => e.title));
mainMapFolders.updateAll((key, value) => value..sortBy((e) => e.filename.toLowerCase()));

sortMediaTracksSubLists(MediaType.values);
_sortAll();
}

void sortMediaTracksSubLists(List<MediaType> medias) {
medias.loop((e, index) {
final sorters = SearchSortController.inst.getMediaTracksSortingComparables(e);
void sortPls(Iterable<List<Track>> trs) {
for (final e in trs) {
e.sortByAlts(sorters);
}
}

switch (e) {
case MediaType.album:
sortPls(mainMapAlbums.value.values);
mainMapAlbums.refresh();
break;
case MediaType.artist:
sortPls(mainMapArtists.value.values);
mainMapArtists.refresh();
break;
case MediaType.genre:
sortPls(mainMapGenres.value.values);
mainMapGenres.refresh();
break;
case MediaType.folder:
sortPls(mainMapFolders.values);
mainMapFolders.refresh();
break;
default:
null;
}
});
}

void _sortAll() => SearchSortController.inst.sortAll();

/// Removes Specific tracks from their corresponding media, useful when updating track metadata or reindexing a track.
Expand Down Expand Up @@ -209,25 +237,29 @@ class Indexer {
addedFolders.add(tr.folder);
});

final albumSorters = SearchSortController.inst.getMediaTracksSortingComparables(MediaType.album);
final artistSorters = SearchSortController.inst.getMediaTracksSortingComparables(MediaType.artist);
final genreSorters = SearchSortController.inst.getMediaTracksSortingComparables(MediaType.genre);
final folderSorters = SearchSortController.inst.getMediaTracksSortingComparables(MediaType.folder);
addedAlbums
..removeDuplicates()
..loop((e, index) {
mainMapAlbums.value[e]?.sortByAlts((e) => e.year, [(e) => e.trackNo, (e) => e.title]);
mainMapAlbums.value[e]?.sortByAlts(albumSorters);
});
addedArtists
..removeDuplicates()
..loop((e, index) {
mainMapArtists.value[e]?.sortByAlt((e) => e.year, (e) => e.title);
mainMapArtists.value[e]?.sortByAlts(artistSorters);
});
addedGenres
..removeDuplicates()
..loop((e, index) {
mainMapGenres.value[e]?.sortByAlt((e) => e.year, (e) => e.title);
mainMapGenres.value[e]?.sortByAlts(genreSorters);
});
addedFolders
..removeDuplicates()
..loop((e, index) {
mainMapFolders[e]?.sortBy((e) => e.filename.toLowerCase());
mainMapFolders[e]?.sortByAlts(folderSorters);
});

_sortAll();
Expand Down
69 changes: 63 additions & 6 deletions lib/controller/search_sort_controller.dart
Expand Up @@ -97,6 +97,35 @@ class SearchSortController {
}
}

List<Comparable Function(Track tr)> getMediaTracksSortingComparables(MediaType media) {
final sorts = settings.mediaItemsTrackSorting[media] ?? <SortType>[SortType.title];

final map = <SortType, Comparable Function(Track e)>{
SortType.title: (e) => e.title.toLowerCase(),
SortType.album: (e) => e.album.toLowerCase(),
SortType.albumArtist: (e) => e.albumArtist.toLowerCase(),
SortType.year: (e) => e.year,
SortType.artistsList: (e) => e.artistsList.join().toLowerCase(),
SortType.genresList: (e) => e.genresList.join().toLowerCase(),
SortType.dateAdded: (e) => e.dateAdded,
SortType.dateModified: (e) => e.dateModified,
SortType.bitrate: (e) => e.bitrate,
SortType.composer: (e) => e.composer.toLowerCase(),
SortType.trackNo: (e) => e.trackNo,
SortType.discNo: (e) => e.discNo,
SortType.filename: (e) => e.filename.toLowerCase(),
SortType.duration: (e) => e.duration,
SortType.sampleRate: (e) => e.sampleRate,
SortType.size: (e) => e.size,
SortType.rating: (e) => e.stats.rating,
};
final l = <Comparable Function(Track e)>[];
sorts.loop((e, index) {
if (map[e] != null) l.add(map[e]!);
});
return l;
}

void _searchTracks(String text, {bool temp = false}) async {
if (text == '') {
if (temp) {
Expand Down Expand Up @@ -262,25 +291,50 @@ class SearchSortController {
sortBy ??= settings.tracksSort.value;
reverse ??= settings.tracksSortReversed.value;

void sortThis(Comparable Function(Track tr) comparable) => reverse! ? tracksInfoList.sortByReverse(comparable) : tracksInfoList.sortBy(comparable);
void sortThis(Comparable Function(Track e) comparable) => reverse! ? tracksInfoList.sortByReverse(comparable) : tracksInfoList.sortBy(comparable);
void sortThisAlts(List<Comparable<dynamic> Function(Track tr)> alternatives) =>
reverse! ? tracksInfoList.sortByReverseAlts(alternatives) : tracksInfoList.sortByAlts(alternatives);

final sameAlbumSorters = getMediaTracksSortingComparables(MediaType.album);
final sameArtistSorters = getMediaTracksSortingComparables(MediaType.artist);
final sameGenreSorters = getMediaTracksSortingComparables(MediaType.genre);
switch (sortBy) {
case SortType.title:
sortThis((e) => e.title.toLowerCase());
case SortType.album:
sortThis((e) => e.album.toLowerCase());
sortThisAlts(
[
(tr) => tr.album.toLowerCase(),
...sameAlbumSorters,
],
);
break;
case SortType.albumArtist:
sortThis((e) => e.albumArtist.toLowerCase());
sortThisAlts(
[
(tr) => tr.albumArtist.toLowerCase(),
...sameAlbumSorters,
],
);
break;
case SortType.year:
sortThis((e) => e.year);
break;
case SortType.artistsList:
sortThis((e) => e.artistsList.join().toLowerCase());
sortThisAlts(
[
(tr) => tr.artistsList.join().toLowerCase(),
...sameArtistSorters,
],
);
break;
case SortType.genresList:
sortThis((e) => e.genresList.join().toLowerCase());
sortThisAlts(
[
(tr) => tr.genresList.join().toLowerCase(),
...sameGenreSorters,
],
);
break;
case SortType.dateAdded:
sortThis((e) => e.dateAdded);
Expand All @@ -292,7 +346,10 @@ class SearchSortController {
sortThis((e) => e.bitrate);
break;
case SortType.composer:
sortThis((e) => e.composer);
sortThis((e) => e.composer.toLowerCase());
break;
case SortType.trackNo:
sortThis((e) => e.trackNo);
break;
case SortType.discNo:
sortThis((e) => e.discNo);
Expand Down
22 changes: 21 additions & 1 deletion lib/controller/settings_controller.dart
Expand Up @@ -241,6 +241,13 @@ class SettingsController {
AlbumIdentifier.albumName,
].obs;

final mediaItemsTrackSorting = <MediaType, List<SortType>>{
MediaType.album: [SortType.trackNo, SortType.year, SortType.title],
MediaType.artist: [SortType.year, SortType.title],
MediaType.genre: [SortType.year, SortType.title],
MediaType.folder: [SortType.filename],
}.obs;

bool didSupportNamida = false;

Future<void> prepareSettingsFile() async {
Expand Down Expand Up @@ -432,7 +439,11 @@ class SettingsController {
)) ??
queueInsertion.map((key, value) => MapEntry(key, value));

///
final mediaItemsTrackSortingInStorage = json["mediaItemsTrackSorting"] as Map? ?? {};
mediaItemsTrackSorting.value = {
for (final e in mediaItemsTrackSortingInStorage.entries)
MediaType.values.getEnum(e.key) ?? MediaType.track: (e.value as List?)?.map((v) => SortType.values.getEnum(v) ?? SortType.title).toList() ?? <SortType>[SortType.year]
};
} catch (e) {
printy(e, isError: true);
await file.delete();
Expand Down Expand Up @@ -594,6 +605,7 @@ class SettingsController {
'trackItem': trackItem.map((key, value) => MapEntry(key.convertToString, value.convertToString)),
'playerOnInterrupted': playerOnInterrupted.map((key, value) => MapEntry(key.convertToString, value.convertToString)),
'queueInsertion': queueInsertion.map((key, value) => MapEntry(key.convertToString, value.toJson())),
'mediaItemsTrackSorting': mediaItemsTrackSorting.map((key, value) => MapEntry(key.convertToString, value.map((e) => e.convertToString).toList())),
};
await file.writeAsJson(res);

Expand Down Expand Up @@ -1185,6 +1197,7 @@ class SettingsController {
if (mostPlayedCustomisStartOfDay != null) {
this.mostPlayedCustomisStartOfDay.value = mostPlayedCustomisStartOfDay;
}

if (didSupportNamida != null) {
this.didSupportNamida = didSupportNamida;
}
Expand All @@ -1210,6 +1223,7 @@ class SettingsController {
if (tagFieldsToEdit1 != null) {
tagFieldsToEdit.insertSafe(index, tagFieldsToEdit1);
}

_writeToStorage();
}

Expand Down Expand Up @@ -1335,6 +1349,7 @@ class SettingsController {
tagFieldsToEdit.remove(t);
});
}

_writeToStorage();
}

Expand All @@ -1352,4 +1367,9 @@ class SettingsController {
queueInsertion[type] = qi;
_writeToStorage();
}

void updateMediaItemsTrackSorting(MediaType media, List<SortType> allsorts) {
mediaItemsTrackSorting[media] = allsorts;
_writeToStorage();
}
}
1 change: 1 addition & 0 deletions lib/core/enums.dart
Expand Up @@ -14,6 +14,7 @@ enum SortType {
dateModified,
bitrate,
composer,
trackNo,
discNo,
filename,
duration,
Expand Down

0 comments on commit b82dce2

Please sign in to comment.