import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import '../settings/app_settings.dart'; import '../shared/cover.dart'; import 'categories.dart'; import 'category_service.dart'; import 'database.dart'; import 'song_list.dart'; import '../shared/theme.dart'; /// Bibliotheks-Reiter „Kategorie": alle Kategorien der Bibliothek. /// /// Ersetzt den früheren Alben-Reiter — der Album-Titel eines Liedes **ist** /// in Melo seine Kategorie (siehe [kategorienAusTags]). Wer seine Sammlung /// über das Album-Feld sortiert hat, findet sie hier unverändert wieder. class CategoryListScreen extends StatelessWidget { const CategoryListScreen({super.key}); @override Widget build(BuildContext context) { final db = context.read(); final categories = context.watch(); final settings = context.watch(); return StreamBuilder>( stream: db.watchSongs(), builder: (context, snapshot) { final songs = snapshot.data ?? const []; if (songs.isEmpty) { return const Center( child: Text('Keine Kategorien', style: TextStyle(color: MeloTheme.text2)), ); } final grouped = groupByCategory( songs, {for (final s in songs) s.id: categories.of(s.id)}, ); final namen = grouped.keys.toList(); return ListView.builder( itemCount: namen.length, itemBuilder: (context, i) { final name = namen[i]; final lieder = grouped[name]!; final cover = categories.coverFor(lieder.first, groupByCategory: settings.groupCoversByCategory); return ListTile( leading: CoverImage( artUri: cover != null ? Uri.file(cover) : null, size: 48, radius: 6, ), title: Text(name, maxLines: 1, overflow: TextOverflow.ellipsis), subtitle: Text('${lieder.length} Lieder'), onTap: () => Navigator.push( context, MaterialPageRoute( builder: (_) => _KategorieLiederScreen(name: name, songs: lieder), ), ), ); }, ); }, ); } } /// Zeigt alle Lieder einer Kategorie. class _KategorieLiederScreen extends StatelessWidget { const _KategorieLiederScreen({required this.name, required this.songs}); final String name; final List songs; @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: Text(name)), body: SongList(songs), ); } }