From 92148bc97c77d087b4dc83861acf554731c1f43f Mon Sep 17 00:00:00 2001 From: "Hermes (Server)" Date: Sat, 29 Aug 2026 14:54:05 +0200 Subject: [PATCH] Mini-Player-Wischgeste steuert PlayerExpansionController statt lokalen Versatz --- lib/player/mini_player.dart | 70 ++++++++++++++++--------------------- 1 file changed, 30 insertions(+), 40 deletions(-) diff --git a/lib/player/mini_player.dart b/lib/player/mini_player.dart index eb79c7d..6b4c59a 100644 --- a/lib/player/mini_player.dart +++ b/lib/player/mini_player.dart @@ -4,7 +4,7 @@ import 'package:provider/provider.dart'; import '../shared/theme.dart'; import 'audio_handler.dart'; -import 'now_playing_screen.dart'; +import 'player_expansion_controller.dart'; import 'wischen.dart'; /// Kompakte Wiedergabe-Leiste über der Bottom-Nav. @@ -52,23 +52,20 @@ class _Leiste extends StatefulWidget { } class _LeisteState extends State<_Leiste> { - /// Wie weit der Finger die Leiste gerade zieht — nur zur Anzeige, die - /// eigentliche Entscheidung fällt erst bei [onVerticalDragEnd]/ - /// [onHorizontalDragEnd]. `dy` bleibt <= 0: nach unten ist unbelegt, ein - /// Mitführen dorthin würde Wirkung vortäuschen, die es nicht gibt. - Offset _versatz = Offset.zero; - bool _ziehtGerade = false; + /// Für die horizontale Titel-Wechsel-Geste (unverändert). + double _horizontalVersatz = 0; + bool _ziehtHorizontalGerade = false; - void _oeffne(BuildContext context) => Navigator.of(context).push( - MaterialPageRoute(builder: (_) => const NowPlayingScreen()), - ); + /// Rohe, aufsummierte vertikale Zugstrecke seit Gestenbeginn — exakt wie + /// bisher `_versatz.dy`, nur ohne die Optik-Verantwortung (die liegt jetzt + /// im PlayerExpansionController). Wird für [PlayerExpansionController. + /// dragEnd] gebraucht, das dieselbe rohe Strecke wie wischen.dart erwartet; + /// aus `progress` ließe sich das wegen des Clampings nicht mehr exakt + /// zurückrechnen. + double _vertikaleStrecke = 0; - void _zurueckschnappen() { - setState(() { - _ziehtGerade = false; - _versatz = Offset.zero; - }); - } + void _oeffne(BuildContext context) => + context.read().open(context); @override Widget build(BuildContext context) { @@ -87,30 +84,26 @@ class _LeisteState extends State<_Leiste> { mainAxisSize: MainAxisSize.min, children: [ GestureDetector( - // Wischen wie in jeder anderen Musik-App: nach oben öffnet die - // Vollbild-Wiedergabe, seitwärts wechselt den Titel. Die Leiste - // folgt dabei sichtbar dem Finger — sonst blieb ein - // bedächtiges, aber weites Wischen (unter der Schwung-Schwelle) - // ganz ohne Reaktion. - onVerticalDragUpdate: (details) => setState(() { - _ziehtGerade = true; - final dy = _versatz.dy + details.delta.dy; - _versatz = Offset(_versatz.dx, dy > 0 ? 0 : dy); - }), - onVerticalDragEnd: (details) { - final oeffnet = oeffnetVollbildMitStrecke( - _versatz.dy, details.velocity.pixelsPerSecond.dy); - _zurueckschnappen(); - if (oeffnet) _oeffne(context); + onVerticalDragStart: (_) => _vertikaleStrecke = 0, + onVerticalDragUpdate: (details) { + _vertikaleStrecke += details.delta.dy; + context.read().dragBy(details.delta.dy); }, + onVerticalDragEnd: (details) => context + .read() + .dragEnd(context, _vertikaleStrecke, + details.velocity.pixelsPerSecond.dy), onHorizontalDragUpdate: (details) => setState(() { - _ziehtGerade = true; - _versatz = Offset(_versatz.dx + details.delta.dx, _versatz.dy); + _ziehtHorizontalGerade = true; + _horizontalVersatz += details.delta.dx; }), onHorizontalDragEnd: (details) { final wechsel = titelWechselMitStrecke( - _versatz.dx, details.velocity.pixelsPerSecond.dx); - _zurueckschnappen(); + _horizontalVersatz, details.velocity.pixelsPerSecond.dx); + setState(() { + _ziehtHorizontalGerade = false; + _horizontalVersatz = 0; + }); switch (wechsel) { case Wechsel.naechster: handler.skipToNext(); @@ -123,14 +116,11 @@ class _LeisteState extends State<_Leiste> { child: InkWell( onTap: () => _oeffne(context), child: AnimatedContainer( - // Während des Ziehens sofort folgen (keine Verzögerung); - // beim Loslassen ohne Wirkung sichtbar zurückschnappen. - duration: _ziehtGerade + duration: _ziehtHorizontalGerade ? Duration.zero : MeloMotion.ruhig(context, MeloMotion.normal), curve: MeloMotion.curve, - transform: - Matrix4.translationValues(_versatz.dx, _versatz.dy, 0), + transform: Matrix4.translationValues(_horizontalVersatz, 0, 0), height: MiniPlayer.hoehe, child: Row( children: [