UX-Simulation, Teil 2: Player-Feinschliff, Downloads, Einstellungen

Zweiter Block aus der UX-Simulation (39 Funde insgesamt):

- Songtext-Icon deaktiviert statt totem Knopf, wenn kein Ziel bekannt ist
- Sleep-Timer-Restzeit jetzt auch im Sheet sichtbar, nicht nur im Tooltip
- Drag-Handle in der Warteschlange, Wisch-nach-unten schließt den
  Vollbild-Player
- Fehlender Tooltip am Songtext-Sheet-Schließen-Knopf ergänzt
- YouTube-Download: Zeitüberschreitung meldet sich anders als toter Server
- Server-Tab zeigte beim Öffnen kurz fälschlich "nicht verbunden"
- Einstellungen: Favoriten-/Playlisten-Sync von "Speicher" zu
  "Musikserver" verschoben, Navidrome-Eintrag erklärt jetzt seinen Zweck
- Kommentar in geteilte_adresse.dart korrigiert (Verhalten unverändert,
  dafür gibt es einen Test)

Bewusst zurückgestellt: ServerFavoriteButton bleibt lokal-only (dokumentierte
Architektur-Entscheidung, siehe G3 im UX-Review), Live-Wischgeste am
Mini-Player, YouTube-Download-Abbrechen, Download-Badge im inaktiven
Unterreiter, Versionsnummer (neue Abhängigkeit nötig).

539 Tests grün (vorher 537), flutter analyze ohne Befund.
This commit is contained in:
Hermes (Server)
2026-08-25 09:49:47 +02:00
parent 07acf77ba4
commit 5645660a2d
8 changed files with 186 additions and 40 deletions
+13 -3
View File
@@ -101,6 +101,10 @@ class _ServerBrowserState extends State<_ServerBrowser> {
List<SubsonicArtist> _artists = [];
bool _loading = false;
bool _laedtNach = false;
// Solange die gespeicherten Zugangsdaten noch geladen werden, ist
// _nav.istVerbunden fälschlich noch false — ohne diesen Zustand blitzte
// beim Öffnen kurz "nicht verbunden" auf, obwohl der Server verbunden ist.
bool _pruefeZugangsdaten = true;
/// Der Server hat weniger als eine volle Seite geliefert — dann ist Schluss.
bool _alleAlbenDa = false;
bool _showArtists = false;
@@ -110,9 +114,9 @@ class _ServerBrowserState extends State<_ServerBrowser> {
void initState() {
super.initState();
_nav.ladeGespeicherteZugangsdaten().then((_) {
if (_nav.istVerbunden && mounted) {
_loadAlbums();
}
if (!mounted) return;
setState(() => _pruefeZugangsdaten = false);
if (_nav.istVerbunden) _loadAlbums();
});
}
@@ -197,6 +201,12 @@ class _ServerBrowserState extends State<_ServerBrowser> {
@override
Widget build(BuildContext context) {
if (_pruefeZugangsdaten) {
return const Center(
child: CircularProgressIndicator(color: MeloTheme.red),
);
}
if (!_nav.istVerbunden) {
return Center(
child: Column(