feat(web+android): Warteschlange bearbeiten — ziehen und entfernen

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
marcandClaude Opus 5 committed 2026-09-22 20:31:08 +02:00
1 parent 77a3bb33f0
commit d5b5c8cf84
9 files changed
+330 -7

No files matched your search

+28 -1
View File
@@ -16,6 +16,7 @@ Die Android-App zählt eigenständig weiter (mehrere APKs pro Release). Welche d
| Music playback (Navidrome) | ✅ | ✅ |
| Seek bar / scrubbing | ✅ | ✅ |
| Queue management | ✅ | ✅ |
| Warteschlange bearbeiten (ziehen/löschen) | ✅ | ✅ |
| Shuffle / Repeat | ✅ | ✅ |
| Radio mode (similar songs) | ✅ | ✅ |
| Now Playing overlay | ✅ | ✅ |
@@ -79,7 +80,33 @@ Die Android-App zählt eigenständig weiter (mehrere APKs pro Release). Welche d
## [3.1] — 2026-09-22
**Android:** 1.15 (versionCode 18) → 1.18 (versionCode 21). 1.16 brachte den Rollbalken, 1.17 und 1.18 machten ihn tatsächlich bedienbar.
**Android:** 1.15 (versionCode 18) → 1.19 (versionCode 22). 1.16 brachte den Rollbalken, 1.17 und 1.18 machten ihn bedienbar, 1.19 bringt das Bearbeiten der Warteschlange.
### Added
- **Die Warteschlange lässt sich bearbeiten (Web + Android)** — bisher war sie eine reine Anzeige:
reinlegen ging, umsortieren oder wieder herausnehmen nicht. Jetzt trägt jede Zeile einen Griff
zum Ziehen und ein ✕ zum Entfernen, auf beiden Plattformen und in beiden Web-Listen (Seitenleiste
und Now-Playing).
- **Der Zeiger auf den laufenden Titel wandert mit.** Das ist der Teil, bei dem ein Fehler nicht
auffällt, sondern später den falschen Song spielt: fällt ein Titel **vor** dem laufenden weg,
rutscht dieser eine Stelle vor; trifft es den laufenden selbst, rückt der nächste nach (am
Ende der Liste der davor); beim Verschieben wird der Zeiger über die **Position** des laufenden
Titels neu bestimmt statt gerechnet — das stimmt auch, wenn er selbst gezogen wurde.
- Diese Rechnung liegt im Web als reines Modul ohne Importe in `src/player/queueMath.js`, damit
sie ohne DOM und ohne Wiedergabe prüfbar ist: **12 Fälle, alle grün.**
- **Web: Zeiger-Ereignisse statt HTML5-Drag-and-Drop.** Dessen `dragstart` gibt es auf
Touch-Geräten gar nicht — die Warteschlange wäre am Handy unbearbeitbar geblieben.
`setPointerCapture` bedient Maus und Finger über denselben Weg. Die Zeilen zwischen Start und
Ziel weichen aus, damit die Lücke dorthin wandert, wo man loslässt.
- **Android: getauscht wird laufend**, sobald der Finger eine Zeilenhöhe zurückgelegt hat — so
braucht es kein Geisterbild, die Liste zeigt die neue Reihenfolge sofort. Gezogen wird am
Griff, nicht an der Zeile, sonst ließen sich Ziehen und Scrollen nicht auseinanderhalten; und
der erste Fingerkontakt wird verbraucht, sonst beansprucht die `LazyColumn` die Geste (dieselbe
Falle wie beim Rollbalken).
- Im Player laufen die lokale Liste und Media3 im Gleichschritt (`moveMediaItem`,
`removeMediaItem`). Liefen sie auseinander, zeigte die Oberfläche den falschen Song an, weil
der laufende Index vom Controller kommt, der Titel dazu aber aus der lokalen Liste.
### Changed
- **Der Rollbalken ist greifbar (Web)** — er war 4 px breit. Sichtbar reichte das, mit der Maus war