Files
Melo/lib/player/wischen.dart
T
Hermes (Server) c2f31dee01 UX-Simulation, Teil 3: Abbrechen, Badge, Versionsnummer, Wisch-Strecke
Die vier zuletzt zurückgestellten Punkte aus der UX-Simulation:

- Abbrechen-Knopf für hängende YouTube-Downloads (Future.any gegen ein
  Abbruch-Signal, Anfrage läuft im Hintergrund aus statt die App zu
  blockieren)
- Punkt am inaktiven Download-Unterreiter, wenn dort etwas im Hintergrund
  läuft (SubTabs bekommt einen optionalen badges-Parameter)
- Versionsnummer unter "Über Melo" (neue Abhängigkeit: package_info_plus)
- Mini-Player führt beim Wischen jetzt sichtbar mit und wertet zusätzlich
  zum Schwung auch die zurückgelegte Strecke aus — ein langsames, aber
  weites Wischen wurde vorher komplett ignoriert

Dabei drei bestehende Widget-Tests korrigiert, die den Download-Tab ohne
Provider<DownloadService> aufbauten (hauptmenue_test.dart,
home_shell_test.dart, online_screen_test.dart) — lief bisher nur, weil
niemand danach fragte; das neue Badge tut das jetzt app-weit.

550 Tests grün (vorher 539), flutter analyze ohne Befund.
2026-08-25 10:25:43 +02:00

51 lines
2.1 KiB
Dart

/// Was eine waagerechte Wischbewegung am Mini-Player bewirkt.
enum Wechsel { vorheriger, naechster }
/// Ab welcher Wisch-Geschwindigkeit (Pixel pro Sekunde) eine Geste zählt.
///
/// Bewusst nicht null: der Mini-Player ist zugleich ein Knopf, und beim
/// Antippen wandert der Finger fast immer ein paar Pixel. Ohne Schwelle
/// spränge bei jedem zweiten Tipp der Titel.
const wischSchwelle = 300.0;
/// Zu welchem Titel eine waagerechte Bewegung führt, oder `null`, wenn sie
/// zu zaghaft war.
///
/// Nach links wischen holt den nächsten Titel herein — so, wie man ein Blatt
/// zur Seite schiebt und das darunter sichtbar wird.
Wechsel? titelWechsel(double geschwindigkeit) {
if (geschwindigkeit.abs() <= wischSchwelle) return null;
return geschwindigkeit < 0 ? Wechsel.naechster : Wechsel.vorheriger;
}
/// Ob eine senkrechte Bewegung die Vollbild-Wiedergabe öffnet.
/// Nur nach oben — nach unten ist bewusst unbelegt, damit niemand die
/// Wiedergabe aus Versehen wegschiebt.
bool oeffnetVollbild(double geschwindigkeit) =>
geschwindigkeit < -wischSchwelle;
/// Ab welcher zurückgelegten Strecke (in Pixeln) eine langsame, aber
/// eindeutige Wischbewegung auch ohne Schwung zählt.
///
/// Ohne diese Schwelle bekam ein bedächtiges, aber weites Wischen (unter
/// [wischSchwelle] Pixel pro Sekunde) überhaupt keine Reaktion — für den
/// Nutzer sah das aus wie ein nicht reagierender Bildschirm statt "zu
/// langsam gewischt".
const wischStreckeSchwelle = 80.0;
/// Wie [titelWechsel], aber eine ausreichend weite Bewegung zählt zusätzlich
/// auch bei geringem Schwung.
Wechsel? titelWechselMitStrecke(double strecke, double geschwindigkeit) {
final ausSchwung = titelWechsel(geschwindigkeit);
if (ausSchwung != null) return ausSchwung;
if (strecke.abs() <= wischStreckeSchwelle) return null;
return strecke < 0 ? Wechsel.naechster : Wechsel.vorheriger;
}
/// Wie [oeffnetVollbild], aber eine ausreichend weite Bewegung nach oben
/// zählt zusätzlich auch bei geringem Schwung.
bool oeffnetVollbildMitStrecke(double strecke, double geschwindigkeit) {
if (oeffnetVollbild(geschwindigkeit)) return true;
return strecke < -wischStreckeSchwelle;
}