UX-Simulation: Mehrfachauswahl überall, Baka-Login, Bestätigungen, Suche

7 Agenten sind die App als normaler Nutzer durchgegangen (Erststart,
Bibliothek, Download, Suche, Favoriten, Player, Einstellungen) und haben
39 Reibungspunkte gefunden. Erster Block:

- Mehrfachauswahl lief nur im Lieder-/Favoriten-Reiter, nicht in
  Kategorie-/Künstler-/Album-Ansichten — jetzt überall, per geteilter
  auswahl_leiste.dart
- Zwei unterschiedlich ausgestattete Favoriten-Listen (Tab vs. Playlisten)
  vereinheitlicht
- Baka-Login zeigt Ladezustand + Fehler im Dialog statt bis zu 15s stumm
  zu bleiben (wie der Navidrome-Login)
- Cache leeren, Navidrome-Abmelden, Download einzeln entfernen fragen jetzt
  nach
- Download-Fehlermeldung bei toter Serververbindung nennt den echten Grund
  statt "War schon heruntergeladen"
- YouTube-Fehlermeldungen sind jetzt rot statt neutralfarben
- Suche schließt die Tastatur nach Auswahl, nennt den Suchbegriff bei
  "Nichts gefunden", einzelne Verlaufseinträge sind entfernbar
- Icon-/Text-Korrekturen (Mikrofon-Icon fälschlich bei Speicherzugriff,
  "Online"-Tab existiert nicht, ReplayGain-Jargon)

537 Tests grün (vorher 533), flutter analyze ohne Befund.
This commit is contained in:
Hermes (Server)
2026-08-25 09:42:41 +02:00
parent 60c57577a3
commit 07acf77ba4
15 changed files with 511 additions and 202 deletions
+44 -3
View File
@@ -133,7 +133,8 @@ class _SettingsScreenState extends State<SettingsScreen> {
secondary: const Icon(Icons.equalizer),
title: const Text('Gleiche Lautstärke'),
subtitle: const Text(
'Senkt laute Titel ab (nur bei Dateien mit ReplayGain-Tag)'),
'Senkt laute Titel automatisch ab (wirkt nur bei Titeln '
'mit Lautstärke-Metadaten)'),
value: settings.normalizeVolume,
onChanged: settings.setNormalizeVolume,
),
@@ -281,7 +282,7 @@ class _SettingsScreenState extends State<SettingsScreen> {
const Divider(height: 1),
const _SectionLabel('Berechtigungen'),
ListTile(
leading: const Icon(Icons.mic_none),
leading: const Icon(Icons.perm_media_outlined),
title: const Text('Musik-Berechtigung'),
trailing: TextButton(
onPressed: openMusicPermissionSettings,
@@ -457,11 +458,51 @@ class _SettingsScreenState extends State<SettingsScreen> {
}
Future<void> _trennNavidrome() async {
final ja = await showDialog<bool>(
context: context,
builder: (ctx) => AlertDialog(
title: const Text('Von Navidrome abmelden?'),
content: const Text(
'Die gespeicherten Zugangsdaten werden gelöscht. Für die '
'erneute Anmeldung brauchst du Server-Adresse, Benutzername '
'und Passwort wieder.'),
actions: [
TextButton(
onPressed: () => Navigator.pop(ctx, false),
child: const Text('Abbrechen'),
),
FilledButton(
onPressed: () => Navigator.pop(ctx, true),
child: const Text('Abmelden'),
),
],
),
);
if (ja != true) return;
await _navidrome.loescheZugangsdaten();
if (mounted) setState(() {});
}
Future<void> _clearCache() async {
final ja = await showDialog<bool>(
context: context,
builder: (ctx) => AlertDialog(
title: const Text('Zwischenspeicher leeren?'),
content: Text('${_formatBytes(_cacheSize)} werden gelöscht. '
'Beim nächsten Abspielen lädt Melo diese Titel erneut.'),
actions: [
TextButton(
onPressed: () => Navigator.pop(ctx, false),
child: const Text('Abbrechen'),
),
FilledButton(
onPressed: () => Navigator.pop(ctx, true),
child: const Text('Leeren'),
),
],
),
);
if (ja != true) return;
await _cache.clearCache();
if (mounted) {
setState(() => _cacheSize = 0);
@@ -558,7 +599,7 @@ class _CloudSyncBereich extends StatelessWidget {
leading: Icon(Icons.cloud_off),
title: Text('Nicht angemeldet'),
subtitle: Text(
'Für den Abgleich im Tab „Online“ beim Baka-Konto anmelden'),
'Für den Abgleich im Download-Tab beim Baka-Konto anmelden'),
);
}