From a88740f14c93a75b1bf98a7cf6bc801b83f11806 Mon Sep 17 00:00:00 2001 From: Syer10 Date: Fri, 30 Dec 2022 16:58:16 -0500 Subject: [PATCH] Fix jumping when scrolling up in reader --- .../kotlin/ca/gosyer/jui/ui/reader/ReaderMenu.kt | 11 ++++++++++- .../jui/ui/reader/loader/TachideskPageLoader.kt | 10 +++++++++- .../ca/gosyer/jui/ui/reader/model/ReaderPage.kt | 5 +++++ 3 files changed, 24 insertions(+), 2 deletions(-) diff --git a/presentation/src/commonMain/kotlin/ca/gosyer/jui/ui/reader/ReaderMenu.kt b/presentation/src/commonMain/kotlin/ca/gosyer/jui/ui/reader/ReaderMenu.kt index b3a10222..3f9d64b4 100644 --- a/presentation/src/commonMain/kotlin/ca/gosyer/jui/ui/reader/ReaderMenu.kt +++ b/presentation/src/commonMain/kotlin/ca/gosyer/jui/ui/reader/ReaderMenu.kt @@ -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 diff --git a/presentation/src/commonMain/kotlin/ca/gosyer/jui/ui/reader/loader/TachideskPageLoader.kt b/presentation/src/commonMain/kotlin/ca/gosyer/jui/ui/reader/loader/TachideskPageLoader.kt index f3fe5af4..e5bc4559 100644 --- a/presentation/src/commonMain/kotlin/ca/gosyer/jui/ui/reader/loader/TachideskPageLoader.kt +++ b/presentation/src/commonMain/kotlin/ca/gosyer/jui/ui/reader/loader/TachideskPageLoader.kt @@ -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), diff --git a/presentation/src/commonMain/kotlin/ca/gosyer/jui/ui/reader/model/ReaderPage.kt b/presentation/src/commonMain/kotlin/ca/gosyer/jui/ui/reader/model/ReaderPage.kt index 5206a898..5d92dda0 100644 --- a/presentation/src/commonMain/kotlin/ca/gosyer/jui/ui/reader/model/ReaderPage.kt +++ b/presentation/src/commonMain/kotlin/ca/gosyer/jui/ui/reader/model/ReaderPage.kt @@ -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 ImageDecodeState)?>>, + val bitmapInfo: MutableStateFlow, val progress: MutableStateFlow, val status: MutableStateFlow, val error: MutableStateFlow, @@ -27,6 +29,9 @@ data class ReaderPage( ERROR } + @Immutable + data class BitmapInfo(val size: IntSize) + @Immutable sealed class ImageDecodeState { @Immutable