diff --git a/lib/screens/home_screen.dart b/lib/screens/home_screen.dart index 90333f5..5f1f2ff 100644 --- a/lib/screens/home_screen.dart +++ b/lib/screens/home_screen.dart @@ -388,6 +388,18 @@ class _MeloHomeState extends State { onPlay: _vm.spieleSong, onMetadataChanged: _vm.ladeSongs, onAddToPlaylist: _zeigeAddToPlaylist, + onSpieleAlsNaechstes: (song) { + _vm.spieleAlsNaechstes(song); + ScaffoldMessenger.of(context).showSnackBar( + SnackBar(content: Text('▶ Als Nächstes: ${song.titel}')), + ); + }, + onAmEndeHinzufuegen: (song) { + _vm.amEndeHinzufuegen(song); + ScaffoldMessenger.of(context).showSnackBar( + SnackBar(content: Text('→ Am Ende hinzugefügt: ${song.titel}')), + ); + }, ), ), ), diff --git a/lib/viewmodels/melo_home_viewmodel.dart b/lib/viewmodels/melo_home_viewmodel.dart index 2cad2ba..d330576 100644 --- a/lib/viewmodels/melo_home_viewmodel.dart +++ b/lib/viewmodels/melo_home_viewmodel.dart @@ -266,6 +266,12 @@ class MeloHomeViewModel extends ChangeNotifier { player.spiele(song); } + /// Fügt den Song direkt nach dem aktuellen in die Warteschlange ein + void spieleAlsNaechstes(Song song) => player.spieleAlsNaechstes(song); + + /// Hängt den Song ans Ende der Warteschlange an + void amEndeHinzufuegen(Song song) => player.amEndeHinzufuegen(song); + @override void dispose() { _positionsSub?.cancel(); diff --git a/lib/widgets/song_tile.dart b/lib/widgets/song_tile.dart index 3fc611b..80499c7 100644 --- a/lib/widgets/song_tile.dart +++ b/lib/widgets/song_tile.dart @@ -13,6 +13,8 @@ class SongTile extends StatelessWidget { final VoidCallback onMetadataChanged; final ValueChanged? onAddToPlaylist; final ValueChanged? onErneutHerunterladen; + final ValueChanged? onSpieleAlsNaechstes; + final ValueChanged? onAmEndeHinzufuegen; const SongTile({ super.key, @@ -23,6 +25,8 @@ class SongTile extends StatelessWidget { required this.onMetadataChanged, this.onAddToPlaylist, this.onErneutHerunterladen, + this.onSpieleAlsNaechstes, + this.onAmEndeHinzufuegen, }); @override @@ -130,6 +134,47 @@ class SongTile extends StatelessWidget { ], ), onTap: hatDatei ? () => onPlay(song) : null, + onLongPress: (hatDatei && (onSpieleAlsNaechstes != null || onAmEndeHinzufuegen != null)) + ? () => _zeigeKontextMenu(context) + : null, + ); + } + + /// Kontextmenü per Long-Press: "Als Nächstes abspielen" + "Am Ende hinzufügen" + void _zeigeKontextMenu(BuildContext context) { + showModalBottomSheet( + context: context, + backgroundColor: MeloTheme.dunkel1, + builder: (ctx) => SafeArea( + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + ListTile( + leading: const Icon(Icons.playlist_play, color: MeloTheme.rot, size: 20), + title: const Text( + 'Als Nächstes abspielen', + style: TextStyle(color: Colors.white, fontSize: 14), + ), + onTap: () { + Navigator.pop(ctx); + onSpieleAlsNaechstes?.call(song); + }, + ), + if (onAmEndeHinzufuegen != null) + ListTile( + leading: const Icon(Icons.playlist_add, color: MeloTheme.rot, size: 20), + title: const Text( + 'Am Ende hinzufügen', + style: TextStyle(color: Colors.white, fontSize: 14), + ), + onTap: () { + Navigator.pop(ctx); + onAmEndeHinzufuegen!(song); + }, + ), + ], + ), + ), ); } }