Fix jumping when scrolling up in reader

This commit is contained in:
Syer10
2022-12-30 16:58:16 -05:00
parent 4732ace043
commit a88740f14c
3 changed files with 24 additions and 2 deletions

View File

@@ -24,6 +24,7 @@ import androidx.compose.foundation.layout.aspectRatio
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.heightIn
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.widthIn
import androidx.compose.material.Icon
@@ -51,6 +52,7 @@ import androidx.compose.ui.input.key.Key
import androidx.compose.ui.input.key.KeyEvent
import androidx.compose.ui.input.key.key
import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.unit.dp
import ca.gosyer.jui.core.lang.withIOContext
import ca.gosyer.jui.domain.reader.model.Direction
@@ -502,6 +504,7 @@ fun SideMenuButton(sideMenuOpen: Boolean, onOpenSideMenuClicked: () -> Unit) {
fun ReaderImage(
imageIndex: Int,
drawableHolder: StableHolder<(suspend () -> ReaderPage.ImageDecodeState)?>,
bitmapInfo: ReaderPage.BitmapInfo?,
progress: Float,
status: ReaderPage.Status,
error: String?,
@@ -531,7 +534,13 @@ fun ReaderImage(
} else {
LoadingScreen(
status == ReaderPage.Status.QUEUE || status == ReaderPage.Status.WORKING,
loadingModifier,
loadingModifier.let { modifier ->
if (bitmapInfo != null) {
modifier.heightIn(min = with(LocalDensity.current) { bitmapInfo.size.height.toDp() })
} else {
modifier
}
},
progress,
error ?: when (decode) {
is ReaderPage.ImageDecodeState.FailedToDecode -> decode.exception.message

View File

@@ -6,6 +6,7 @@
package ca.gosyer.jui.ui.reader.loader
import androidx.compose.ui.unit.IntSize
import ca.gosyer.jui.core.io.SYSTEM
import ca.gosyer.jui.core.lang.IO
import ca.gosyer.jui.core.lang.PriorityChannel
@@ -115,7 +116,13 @@ class TachideskPageLoader(
if (decoder != null) {
runCatching { decoder.decode() as DecodeImageResult }
.mapCatching {
ReaderPage.ImageDecodeState.Success(it.image.asImageBitmap())
ReaderPage.ImageDecodeState.Success(
it.image.asImageBitmap().also {
page.bitmapInfo.value = ReaderPage.BitmapInfo(
IntSize(it.width, it.height)
)
}
)
}
.getOrElse {
ReaderPage.ImageDecodeState.FailedToDecode(it)
@@ -184,6 +191,7 @@ class TachideskPageLoader(
ReaderPage(
index = it,
bitmap = MutableStateFlow(StableHolder(null)),
bitmapInfo = MutableStateFlow(null),
progress = MutableStateFlow(0.0F),
status = MutableStateFlow(ReaderPage.Status.QUEUE),
error = MutableStateFlow(null),

View File

@@ -8,6 +8,7 @@ package ca.gosyer.jui.ui.reader.model
import androidx.compose.runtime.Immutable
import androidx.compose.ui.graphics.ImageBitmap
import androidx.compose.ui.unit.IntSize
import ca.gosyer.jui.ui.base.model.StableHolder
import kotlinx.coroutines.flow.MutableStateFlow
@@ -15,6 +16,7 @@ import kotlinx.coroutines.flow.MutableStateFlow
data class ReaderPage(
val index: Int,
val bitmap: MutableStateFlow<StableHolder<(suspend () -> ImageDecodeState)?>>,
val bitmapInfo: MutableStateFlow<BitmapInfo?>,
val progress: MutableStateFlow<Float>,
val status: MutableStateFlow<Status>,
val error: MutableStateFlow<String?>,
@@ -27,6 +29,9 @@ data class ReaderPage(
ERROR
}
@Immutable
data class BitmapInfo(val size: IntSize)
@Immutable
sealed class ImageDecodeState {
@Immutable