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
+25 -23
View File
@@ -166,9 +166,11 @@ class _SettingsScreenState extends State<SettingsScreen> {
ListTile(
leading: const Icon(Icons.cloud_circle),
title: const Text('Navidrome'),
subtitle: _navidrome.istVerbunden
? const Text('Verbunden')
: const Text('Nicht verbunden'),
// "Navidrome" allein ist nur der Name der Server-Software — ohne
// den Zusatz muss man raten, wofür der Eintrag da ist.
subtitle: Text(_navidrome.istVerbunden
? 'Eigener Musik-Server · Verbunden'
: 'Eigener Musik-Server (optional) · Nicht verbunden'),
trailing: _navidrome.istVerbunden
? IconButton(
icon: const Icon(Icons.logout),
@@ -201,6 +203,26 @@ class _SettingsScreenState extends State<SettingsScreen> {
},
),
),
ListTile(
leading: const Icon(Icons.favorite),
title: const Text('Favoriten-Sync'),
subtitle: const Text('Favoriten vom Server importieren'),
trailing: IconButton(
tooltip: 'Vom Server laden',
icon: const Icon(Icons.cloud_download),
onPressed: () => _syncServerFavorites(),
),
),
ListTile(
leading: const Icon(Icons.playlist_play),
title: const Text('Playlisten-Sync'),
subtitle: const Text('Server-Playlisten importieren'),
trailing: IconButton(
tooltip: 'Vom Server laden',
icon: const Icon(Icons.cloud_download),
onPressed: () => _syncServerPlaylists(),
),
),
const _SectionLabel('Speicher'),
StreamBuilder<List<Download>>(
stream: db.watchDownloads(),
@@ -256,26 +278,6 @@ class _SettingsScreenState extends State<SettingsScreen> {
},
),
),
ListTile(
leading: const Icon(Icons.favorite),
title: const Text('Favoriten-Sync'),
subtitle: const Text('Favoriten vom Server importieren'),
trailing: IconButton(
tooltip: 'Vom Server laden',
icon: const Icon(Icons.cloud_download),
onPressed: () => _syncServerFavorites(),
),
),
ListTile(
leading: const Icon(Icons.playlist_play),
title: const Text('Playlisten-Sync'),
subtitle: const Text('Server-Playlisten importieren'),
trailing: IconButton(
tooltip: 'Vom Server laden',
icon: const Icon(Icons.cloud_download),
onPressed: () => _syncServerPlaylists(),
),
),
const Divider(height: 1),
const _SectionLabel('Geräte-Abgleich'),
const _CloudSyncBereich(),