fix queue overlay, focus and artwork loading glitches

- scope QueueViewModel to the queue overlay so its rows are released on close
  and a reopened queue cannot show two overlapping lists; key open() on the
  overlay visibility so a fast reopen still rescans and refocuses
- reuse row ids by song identity when a window (re)loads so Compose does not
  cross-fade the old rows out while the new ones fade in
- fade the artist name scrim in and key its busy check on the thumbnail, the
  same ref the theme already uses, so a cached seed shows it immediately
- start detail gradients from the neutral base artwork until the seed resolves
  instead of inheriting the now playing theme and snapping to the artist colours
- fade the now playing and detail status bar scrims by putting the graphicsLayer
  before statusBarScrim(), which otherwise drew the background outside the layer
- decode full-size and hero covers with FilterQuality.High to stop the moire
  during overscroll stretch
This commit is contained in:
austinried
2026-10-04 00:29:59 +00:00
parent 5fb38a7c9b
commit da71bccb58
7 changed files with 78 additions and 27 deletions
@@ -108,6 +108,23 @@ class QueueViewModelTest {
assertEquals(1L, dropTarget(listOf(row(0), row(3), row(1), row(2)), index = 1, from = 3))
}
@Test
fun reopeningReusesRowIdentitySoComposeDoesNotCrossFadeTwoLists() {
runBlocking { seedSongs(200) }
controller.playSongs(1, 100)
await { controller.state.value.position == 100L }
viewModel.open()
await { viewModel.ready }
val firstIds = viewModel.rows.map { it.id }
val firstGeneration = viewModel.generation
viewModel.open()
await { viewModel.generation > firstGeneration }
assertEquals(firstIds, viewModel.rows.map { it.id })
}
@Test
fun reorderingMovesTheRowLocally() {
runBlocking { seedSongs(200) }