implemented playlist methods

This commit is contained in:
Moritz Weber 2021-10-17 01:10:45 +02:00
parent bfde239ca1
commit 2328454610
7 changed files with 100 additions and 18 deletions

View file

@ -51,6 +51,8 @@ abstract class MusicDataRepository extends MusicDataInfoRepository {
Future<void> updatePlaylist(int id, String name);
Future<void> removePlaylist(Playlist playlist);
Future<void> appendSongToPlaylist(Playlist playlist, Song song);
Future<void> removePlaylistEntry(int playlistId, int index);
Future<void> movePlaylistEntry(int playlistId, int oldIndex, int newIndex);
Future<void> insertSmartList({
required String name,

View file

@ -40,6 +40,7 @@ import 'system/datasources/music_data_source_contract.dart';
import 'system/datasources/persistent_state_data_source.dart';
import 'system/datasources/platform_integration_data_source.dart';
import 'system/datasources/platform_integration_data_source_impl.dart';
import 'system/datasources/playlist_data_source.dart';
import 'system/datasources/settings_data_source.dart';
import 'system/repositories/audio_player_repository_impl.dart';
import 'system/repositories/music_data_repository_impl.dart';
@ -200,6 +201,7 @@ Future<void> setupGetIt() async {
getIt.registerLazySingleton<MusicDataSource>(() => moorDatabase.musicDataDao);
getIt.registerLazySingleton<PersistentStateDataSource>(() => moorDatabase.persistentStateDao);
getIt.registerLazySingleton<SettingsDataSource>(() => moorDatabase.settingsDao);
getIt.registerLazySingleton<PlaylistDataSource>(() => moorDatabase.playlistDao);
getIt.registerLazySingleton<LocalMusicFetcher>(
() => LocalMusicFetcherImpl(
getIt(),

View file

@ -1,5 +1,6 @@
import 'package:flutter/material.dart';
import 'package:get_it/get_it.dart';
import 'package:reorderables/reorderables.dart';
import '../../domain/entities/playlist.dart';
import '../../domain/entities/song.dart';
@ -36,26 +37,39 @@ class PlaylistPage extends StatelessWidget {
onPressed: () => Navigator.pop(context),
),
actions: [
IconButton(icon: const Icon(Icons.edit), onPressed: () => _editPlaylist(context, uPlaylist)),
IconButton(
icon: const Icon(Icons.edit),
onPressed: () => _editPlaylist(context, uPlaylist)),
],
titleSpacing: 0.0,
),
body: Scrollbar(
child: ListView.separated(
itemCount: uPlaylist.songs.length,
itemBuilder: (_, int index) {
final Song song = uPlaylist.songs[index];
return SongListTile(
song: song,
showAlbum: true,
subtitle: Subtitle.artistAlbum,
onTap: () => audioStore.playSong(index, uPlaylist.songs),
onTapMore: () => SongBottomSheet()(song, context),
);
},
separatorBuilder: (BuildContext context, int index) => const SizedBox(
height: 4.0,
),
child: CustomScrollView(
slivers: [
ReorderableSliverList(
delegate: ReorderableSliverChildBuilderDelegate(
(context, int index) {
final Song song = uPlaylist.songs[index];
return Dismissible(
key: ValueKey(song.path),
child: SongListTile(
song: song,
showAlbum: true,
subtitle: Subtitle.artistAlbum,
onTap: () => audioStore.playSong(index, uPlaylist.songs),
onTapMore: () => SongBottomSheet()(song, context),
),
onDismissed: (direction) {
musicDataStore.removePlaylistEntry(uPlaylist.id, index);
},
);
},
childCount: uPlaylist.songs.length,
),
onReorder: (oldIndex, newIndex) =>
musicDataStore.movePlaylistEntry(uPlaylist.id, oldIndex, newIndex),
)
],
),
),
);
@ -90,7 +104,7 @@ class _PlaylistFormState extends State<_PlaylistForm> {
late TextEditingController _controller;
@override
void initState() {
void initState() {
super.initState();
_controller = TextEditingController(text: widget.playlist.name);
}

View file

@ -87,6 +87,14 @@ abstract class _MusicDataStore with Store {
_musicDataRepository.appendSongToPlaylist(playlist, song);
}
Future<void> removePlaylistEntry(int playlistId, int index) async {
_musicDataRepository.removePlaylistEntry(playlistId, index);
}
Future<void> movePlaylistEntry(int playlistId, int oldIndex, int newIndex) async {
_musicDataRepository.movePlaylistEntry(playlistId, oldIndex, newIndex);
}
Stream<Playlist> getPlaylistStream(int playlistId) {
return _musicDataRepository.getPlaylistStream(playlistId);
}

View file

@ -94,6 +94,51 @@ class PlaylistDao extends DatabaseAccessor<MoorDatabase>
.write(PlaylistsCompanion(name: Value(name)));
}
@override
Future<void> moveEntry(int playlistId, int oldIndex, int newIndex) async {
if (oldIndex != newIndex) {
transaction(() async {
await (update(playlistEntries)
..where((tbl) => tbl.position.equals(oldIndex) & tbl.playlistId.equals(playlistId)))
.write(const PlaylistEntriesCompanion(position: Value(-1)));
if (oldIndex < newIndex) {
for (int i = oldIndex + 1; i <= newIndex; i++) {
await (update(playlistEntries)
..where((tbl) => tbl.position.equals(i) & tbl.playlistId.equals(playlistId)))
.write(PlaylistEntriesCompanion(position: Value(i - 1)));
}
} else {
for (int i = oldIndex - 1; i >= newIndex; i--) {
await (update(playlistEntries)
..where((tbl) => tbl.position.equals(i) & tbl.playlistId.equals(playlistId)))
.write(PlaylistEntriesCompanion(position: Value(i + 1)));
}
}
await (update(playlistEntries)
..where((tbl) => tbl.position.equals(-1) & tbl.playlistId.equals(playlistId)))
.write(PlaylistEntriesCompanion(position: Value(newIndex)));
});
}
}
@override
Future<void> removeIndex(int playlistId, int index) async {
final entries =
await (select(playlistEntries)..where((tbl) => tbl.playlistId.equals(playlistId))).get();
final count = entries.length;
transaction(() async {
await (delete(playlistEntries)
..where((tbl) => tbl.position.equals(index) & tbl.playlistId.equals(playlistId)))
.go();
for (int i = index + 1; i < count; i++) {
await (update(playlistEntries)
..where((tbl) => tbl.position.equals(i) & tbl.playlistId.equals(playlistId)))
.write(PlaylistEntriesCompanion(position: Value(i - 1)));
}
});
}
@override
Future<void> insertSmartList(
String name,

View file

@ -11,7 +11,8 @@ abstract class PlaylistDataSource {
Future<void> updatePlaylist(int id, String name);
Future<void> removePlaylist(PlaylistModel playlist);
Future<void> appendSongToPlaylist(PlaylistModel playlist, SongModel song);
// TODO: move and remove index
Future<void> removeIndex(int playlistId, int index);
Future<void> moveEntry(int playlistId, int oldIndex, int newIndex);
Stream<List<SmartListModel>> get smartListsStream;
Stream<SmartListModel> getSmartListStream(int smartListId);

View file

@ -299,6 +299,16 @@ class MusicDataRepositoryImpl implements MusicDataRepository {
_playlistDataSource.updatePlaylist(id, name);
}
@override
Future<void> movePlaylistEntry(int playlistId, int oldIndex, int newIndex) async {
_playlistDataSource.moveEntry(playlistId, oldIndex, newIndex);
}
@override
Future<void> removePlaylistEntry(int playlistId, int index) async {
_playlistDataSource.removeIndex(playlistId, index);
}
@override
Future<void> insertSmartList({
required String name,