implemented playlist methods
This commit is contained in:
parent
bfde239ca1
commit
2328454610
7 changed files with 100 additions and 18 deletions
|
@ -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,
|
||||
|
|
|
@ -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(),
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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,
|
||||
|
|
Loading…
Add table
Reference in a new issue