import 'package:audio_service/audio_service.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import '../shared/cover.dart'; import '../shared/theme.dart'; import 'audio_handler.dart'; /// Warteschlangen-Ansicht: aktuelle Queue anzeigen, zu einem Titel springen, /// Titel entfernen oder per Drag & Drop umsortieren. /// /// Der `MeloAudioHandler` mutiert die Warteschlange direkt /// ([MeloAudioHandler.removeQueueItemAt], [MeloAudioHandler.moveQueueItem]) — /// die laufende Wiedergabe bleibt dabei unangetastet. class QueueScreen extends StatelessWidget { const QueueScreen({super.key}); @override Widget build(BuildContext context) { final handler = context.read(); return Scaffold( appBar: AppBar(title: const Text('Warteschlange')), body: StreamBuilder>( stream: handler.queue, builder: (context, queueSnap) { final queue = queueSnap.data ?? const []; if (queue.isEmpty) { return const Center( child: Text('Warteschlange ist leer', style: TextStyle(color: MeloTheme.text2)), ); } return StreamBuilder( stream: handler.mediaItem, builder: (context, currentSnap) { final currentId = currentSnap.data?.id; return ReorderableListView.builder( itemCount: queue.length, onReorderItem: (oldIndex, newIndex) => handler.moveQueueItem(oldIndex, newIndex), itemBuilder: (context, i) { final item = queue[i]; final playing = item.id == currentId; return ListTile( key: ValueKey(item.id), leading: CoverImage(artUri: item.artUri, size: 48, radius: 6), title: Text( item.title, maxLines: 1, overflow: TextOverflow.ellipsis, style: playing ? const TextStyle( color: MeloTheme.red, fontWeight: FontWeight.bold) : null, ), subtitle: Text(item.artist ?? 'Unbekannt', maxLines: 1, overflow: TextOverflow.ellipsis), trailing: IconButton( tooltip: 'Aus Warteschlange entfernen', icon: const Icon(Icons.close), onPressed: () => handler.removeQueueItemAt(i), ), onTap: () => handler.skipToQueueItem(i), ); }, ); }, ); }, ), ); } }