Auswahl-Modus: Auf den Server laden (nur in Meine Musik)

This commit is contained in:
Hermes (Server)
2026-08-27 12:14:07 +02:00
parent 78968fd6b8
commit fcf53dcb6c
4 changed files with 214 additions and 0 deletions
+27
View File
@@ -7,6 +7,7 @@ import '../library/playlist_service.dart';
import '../library/song_media.dart';
import '../player/audio_handler.dart';
import '../playlists/create_playlist_dialog.dart';
import '../services/sync_service.dart';
import '../settings/app_settings.dart';
import 'auswahl.dart';
import 'theme.dart';
@@ -22,6 +23,7 @@ class AuswahlLeiste extends StatelessWidget {
required this.onAbbrechen,
required this.onWiedergabeliste,
required this.onWarteschlange,
this.onServerLaden,
});
final int anzahl;
@@ -29,6 +31,10 @@ class AuswahlLeiste extends StatelessWidget {
final VoidCallback onWiedergabeliste;
final VoidCallback onWarteschlange;
/// Nur gesetzt, wo der Upload hingehört („Meine Musik"). Sonst erschiene
/// die Aktion in allen fünf Ansichten, die diese Leiste benutzen.
final VoidCallback? onServerLaden;
@override
Widget build(BuildContext context) {
return Padding(
@@ -49,6 +55,12 @@ class AuswahlLeiste extends StatelessWidget {
style: const TextStyle(fontWeight: FontWeight.w600),
),
),
if (onServerLaden != null)
IconButton(
tooltip: 'Auf den Server laden',
icon: const Icon(Icons.cloud_upload),
onPressed: onServerLaden,
),
IconButton(
tooltip: 'Zur Warteschlange hinzufügen',
icon: const Icon(Icons.queue),
@@ -159,3 +171,18 @@ Future<void> fuegeZuWarteschlangeHinzu(
: '$angehaengt von ${gewaehlte.length} Titeln angehängt'),
));
}
/// Lädt [gewaehlte] zum Melo-Server und meldet das Ergebnis.
///
/// Wohnt neben [fuegeZuWiedergabelisteHinzu]: dieselbe Bauart, dieselbe Art
/// Rückmeldung.
Future<void> ladeAufServer(
BuildContext context, List<Song> gewaehlte) async {
final sync = context.read<SyncService>();
final messenger = ScaffoldMessenger.of(context);
final ergebnis = await sync.ladeAusgewaehlteHoch(gewaehlte);
if (!context.mounted) return;
messenger.showSnackBar(
SnackBar(content: Text(sync.fehler ?? ergebnis.meldung)),
);
}
+13
View File
@@ -23,6 +23,7 @@ class SortableSongList extends StatefulWidget {
required this.songs,
required this.storeKey,
this.empty,
this.serverUpload = false,
});
final List<Song> songs;
@@ -31,6 +32,10 @@ class SortableSongList extends StatefulWidget {
/// Wird statt der Liste gezeigt, wenn [songs] leer ist.
final Widget? empty;
/// Ob der Auswahl-Modus „Auf den Server laden" anbietet. Standard `false`:
/// dieses Widget steckt in fünf Ansichten, gemeint ist nur „Meine Musik".
final bool serverUpload;
@override
State<SortableSongList> createState() => _SortableSongListState();
}
@@ -67,6 +72,11 @@ class _SortableSongListState extends State<SortableSongList> {
if (mounted) _beendeAuswahl();
}
Future<void> _aufServer(List<Song> gewaehlte) async {
await ladeAufServer(context, gewaehlte);
if (mounted) _beendeAuswahl();
}
@override
void dispose() {
_scroll.dispose();
@@ -196,6 +206,9 @@ class _SortableSongListState extends State<SortableSongList> {
onAbbrechen: _beendeAuswahl,
onWiedergabeliste: () => _inWiedergabeliste(_gewaehlte(sorted)),
onWarteschlange: () => _inWarteschlange(_gewaehlte(sorted)),
onServerLaden: widget.serverUpload
? () => _aufServer(_gewaehlte(sorted))
: null,
)
else
Padding(