import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import '../library/category_service.dart'; import '../library/database.dart'; import '../library/playlist_service.dart'; import '../library/song_media.dart'; import '../player/audio_handler.dart'; import '../settings/app_settings.dart'; import '../shared/cover.dart'; import '../shared/theme.dart'; /// Playlist-Detailansicht: Songs anzeigen, per Drag & Drop umsortieren, entfernen. class PlaylistDetailScreen extends StatelessWidget { const PlaylistDetailScreen({super.key, required this.playlist}); final Playlist playlist; @override Widget build(BuildContext context) { final db = context.read(); final handler = context.read(); final service = context.read(); final categories = context.watch(); final settings = context.watch(); return Scaffold( appBar: AppBar(title: Text(playlist.name)), body: StreamBuilder>( stream: db.watchPlaylistSongs(playlist.id), builder: (context, snapshot) { if (snapshot.hasError) { return Center( child: Text('Fehler: ${snapshot.error}', style: const TextStyle(color: MeloTheme.text2)), ); } final songs = snapshot.data ?? const []; if (songs.isEmpty) { return const Center( child: Text('Playlist ist leer — füge Songs aus der Bibliothek hinzu', style: TextStyle(color: MeloTheme.text2)), ); } return ReorderableListView.builder( itemCount: songs.length, onReorderItem: (oldIndex, newIndex) { final reordered = List.from(songs); final moved = reordered.removeAt(oldIndex); reordered.insert(newIndex, moved); service.reorderAll(playlist.id, reordered.map((s) => s.id).toList()); }, itemBuilder: (context, i) { final s = songs[i]; return ListTile( key: ValueKey(s.id), leading: Builder(builder: (context) { final cover = categories.coverFor(s, groupByCategory: settings.groupCoversByCategory); return CoverImage( artUri: cover != null ? Uri.file(cover) : null, size: 48, radius: 6, ); }), title: Text(s.title, maxLines: 1, overflow: TextOverflow.ellipsis), subtitle: Text(s.artist ?? 'Unbekannt', maxLines: 1, overflow: TextOverflow.ellipsis), trailing: IconButton( tooltip: 'Aus Playlist entfernen', icon: const Icon(Icons.remove_circle_outline), onPressed: () => service.removeSongFromPlaylist(playlist.id, s.id), ), onTap: () async { try { await playSongs( handler, songs, i, coverOf: (song) => categories.coverFor(song, groupByCategory: settings.groupCoversByCategory), ); } catch (e) { if (context.mounted) { ScaffoldMessenger.of(context).showSnackBar( SnackBar(content: Text('Wiedergabe fehlgeschlagen: $e')), ); } } }, ); }, ); }, ), ); } }