feat(ui): finales 5-Tab-Layout (Player/Bibliothek/Playlisten/Suche/Settings)
- "Zuletzt hinzugefügt" aus dem alten HomeScreen in die Bibliothek verschoben: horizontal scrollende Leiste über der vollen Songliste, nur sichtbar wenn nicht leer und nicht gerade gescannt wird - home_screen.dart entfernt (Funktionalität jetzt Teil von LibraryScreen) - HomeShell-Tabs auf die finale Struktur umgestellt: NowPlayingScreen an Position 0, Playlisten- und Settings-Platzhalter an ihren finalen Positionen (werden in späteren Tasks durch echte Screens ersetzt) - BottomNavigationBar-Icons/Labels an die neue Reihenfolge angepasst - MiniPlayer wird ausgeblendet, solange der Now-Playing-Tab aktiv ist (redundant, da der Tab selbst schon die volle Wiedergabe-Ansicht zeigt) Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Haiku 4.5
parent
be1248d7ba
commit
3a040b4661
@@ -1,10 +1,13 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
|
||||
import '../player/audio_handler.dart';
|
||||
import '../shared/cover.dart';
|
||||
import 'database.dart';
|
||||
import 'library_service.dart';
|
||||
import 'permissions.dart';
|
||||
import 'song_list.dart';
|
||||
import 'song_media.dart';
|
||||
|
||||
class LibraryScreen extends StatelessWidget {
|
||||
const LibraryScreen({super.key});
|
||||
@@ -69,6 +72,14 @@ class LibraryScreen extends StatelessWidget {
|
||||
],
|
||||
),
|
||||
),
|
||||
StreamBuilder<List<Song>>(
|
||||
stream: db.watchRecent(limit: 10),
|
||||
builder: (context, snapshot) {
|
||||
final recent = snapshot.data ?? const [];
|
||||
if (recent.isEmpty || lib.scanning) return const SizedBox.shrink();
|
||||
return _RecentlyAdded(songs: recent);
|
||||
},
|
||||
),
|
||||
Expanded(
|
||||
child: StreamBuilder<List<Song>>(
|
||||
stream: db.watchSongs(),
|
||||
@@ -93,6 +104,76 @@ class LibraryScreen extends StatelessWidget {
|
||||
}
|
||||
}
|
||||
|
||||
/// Horizontal scrollende Leiste mit den zuletzt hinzugefügten Songs.
|
||||
class _RecentlyAdded extends StatelessWidget {
|
||||
const _RecentlyAdded({required this.songs});
|
||||
final List<Song> songs;
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final handler = context.read<MeloAudioHandler>();
|
||||
return Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
const Padding(
|
||||
padding: EdgeInsets.fromLTRB(16, 8, 16, 8),
|
||||
child: Text('Zuletzt hinzugefügt',
|
||||
style: TextStyle(fontSize: 18, fontWeight: FontWeight.w600)),
|
||||
),
|
||||
SizedBox(
|
||||
height: 140,
|
||||
child: ListView.builder(
|
||||
scrollDirection: Axis.horizontal,
|
||||
padding: const EdgeInsets.symmetric(horizontal: 16),
|
||||
itemCount: songs.length,
|
||||
itemBuilder: (context, i) {
|
||||
final s = songs[i];
|
||||
return Padding(
|
||||
padding: const EdgeInsets.only(right: 12),
|
||||
child: SizedBox(
|
||||
width: 96,
|
||||
child: InkWell(
|
||||
onTap: () async {
|
||||
try {
|
||||
await playSongs(handler, songs, i);
|
||||
} catch (e) {
|
||||
if (context.mounted) {
|
||||
ScaffoldMessenger.of(context).showSnackBar(
|
||||
SnackBar(
|
||||
content: Text('Wiedergabe fehlgeschlagen: $e')),
|
||||
);
|
||||
}
|
||||
}
|
||||
},
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
CoverImage(
|
||||
artUri:
|
||||
s.coverPath != null ? Uri.file(s.coverPath!) : null,
|
||||
size: 96,
|
||||
radius: 8,
|
||||
),
|
||||
const SizedBox(height: 4),
|
||||
Text(
|
||||
s.title,
|
||||
maxLines: 1,
|
||||
overflow: TextOverflow.ellipsis,
|
||||
style: const TextStyle(fontSize: 12),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
},
|
||||
),
|
||||
),
|
||||
],
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
class _Empty extends StatelessWidget {
|
||||
const _Empty();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user