From df8cf73385da6ef3ef295c6e4d0a78fd420dba29 Mon Sep 17 00:00:00 2001 From: austinried <4966622+austinried@users.noreply.github.com> Date: Sat, 14 Nov 2026 05:43:47 +0000 Subject: [PATCH] ui: preserve pending older queue loads --- .../com/subtracks/ui/playback/QueueScreen.kt | 34 +++++++++++-------- 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/app/src/main/kotlin/com/subtracks/ui/playback/QueueScreen.kt b/app/src/main/kotlin/com/subtracks/ui/playback/QueueScreen.kt index 67e6dfa5..5a475c71 100644 --- a/app/src/main/kotlin/com/subtracks/ui/playback/QueueScreen.kt +++ b/app/src/main/kotlin/com/subtracks/ui/playback/QueueScreen.kt @@ -120,6 +120,7 @@ class QueueViewModel( private set private var reorderPending = false + private var olderLoadPending = false private var dragRollback: ReorderRollback? = null private var nextId = 0L @@ -189,7 +190,7 @@ class QueueViewModel( val scanned = loaded.map { rowFor(it, reused, snapshot.resetVersion) } val firstRow = rows.minByOrNull { it.position } val windowStart = - if (firstRow == null) { + if (firstRow == null || olderLoadPending) { start } else { scanned.firstOrNull { it.id == firstRow.id && it.position < firstPosition }?.position ?: firstPosition @@ -214,21 +215,26 @@ class QueueViewModel( fun loadOlder() { val top = rows.minOfOrNull { it.position } ?: return if (top <= 0L) return + olderLoadPending = true viewModelScope.launch { - mutex.withLock { - val first = rows.minOfOrNull { it.position } ?: return@withLock - if (first <= 0L) return@withLock - val snapshot = queueRepository.snapshot() - val collected = mutableListOf() - var end = first - 1 - while (end >= 0L && collected.size < QUEUE_CHUNK) { - val start = (end - QUEUE_CHUNK + 1).coerceAtLeast(0) - collected.addAll(0, queueRepository.range(snapshot, start, end).filter(::visible)) - end = start - 1 + try { + mutex.withLock { + val first = rows.minOfOrNull { it.position } ?: return@withLock + if (first <= 0L) return@withLock + val snapshot = queueRepository.snapshot() + val collected = mutableListOf() + var end = first - 1 + while (end >= 0L && collected.size < QUEUE_CHUNK) { + val start = (end - QUEUE_CHUNK + 1).coerceAtLeast(0) + collected.addAll(0, queueRepository.range(snapshot, start, end).filter(::visible)) + end = start - 1 + } + if (collected.isEmpty()) return@withLock + rows.addAll(0, collected.map { newRow(it, snapshot.resetVersion) }) + while (rows.size > QUEUE_WINDOW_ROWS) rows.removeAt(rows.size - 1) } - if (collected.isEmpty()) return@withLock - rows.addAll(0, collected.map { newRow(it, snapshot.resetVersion) }) - while (rows.size > QUEUE_WINDOW_ROWS) rows.removeAt(rows.size - 1) + } finally { + olderLoadPending = false } } }