mirror of
https://github.com/Suwayomi/TachideskJUI.git
synced 2025-12-10 06:42:05 +01:00
Fix jumping when scrolling up in reader
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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),
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user