From 41991b8f2262a63a50ef8849be87f86296275974 Mon Sep 17 00:00:00 2001 From: tarsin Date: Sun, 14 May 2023 14:44:07 +0800 Subject: [PATCH] Refactor compose layout package --- .../hippo/ehviewer/ui/compose/EhAsyncThumb.kt | 85 --------------- .../GalleryDetail.kt} | 3 +- .../GalleryInfo.kt} | 7 +- .../ui/compose/data/GalleryPreview.kt | 103 ++++++++++++++++++ .../ehviewer/ui/scene/GalleryDetailScene.kt | 29 +---- .../hippo/ehviewer/ui/scene/GalleryHolder.kt | 4 +- .../ehviewer/ui/scene/GalleryPreviewScreen.kt | 2 +- .../hippo/ehviewer/ui/scene/HistoryScene.kt | 2 +- 8 files changed, 121 insertions(+), 114 deletions(-) rename app/src/main/java/com/hippo/ehviewer/ui/compose/{GalleryDetailWidgets.kt => data/GalleryDetail.kt} (98%) rename app/src/main/java/com/hippo/ehviewer/ui/compose/{GalleryInfoCard.kt => data/GalleryInfo.kt} (95%) create mode 100644 app/src/main/java/com/hippo/ehviewer/ui/compose/data/GalleryPreview.kt diff --git a/app/src/main/java/com/hippo/ehviewer/ui/compose/EhAsyncThumb.kt b/app/src/main/java/com/hippo/ehviewer/ui/compose/EhAsyncThumb.kt index d392b769e..73b350e2f 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/compose/EhAsyncThumb.kt +++ b/app/src/main/java/com/hippo/ehviewer/ui/compose/EhAsyncThumb.kt @@ -1,31 +1,17 @@ package com.hippo.ehviewer.ui.compose -import android.graphics.drawable.BitmapDrawable -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.aspectRatio -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.ReadOnlyComposable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue -import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.asImageBitmap -import androidx.compose.ui.graphics.painter.BitmapPainter import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.unit.IntOffset -import androidx.compose.ui.unit.IntSize import coil.compose.AsyncImage import coil.compose.AsyncImagePainter import coil.request.ImageRequest -import com.hippo.ehviewer.client.data.GalleryPreview -import com.hippo.ehviewer.client.data.NormalGalleryPreview import com.hippo.ehviewer.coil.imageRequest @Composable @@ -34,12 +20,6 @@ fun requestOf(model: String?): ImageRequest { return LocalContext.current.imageRequest(model) } -@Composable -@ReadOnlyComposable -fun requestOf(model: GalleryPreview): ImageRequest { - return LocalContext.current.imageRequest(model) -} - @Composable fun EhAsyncThumb( model: String?, @@ -74,68 +54,3 @@ fun EhAsyncCropThumb( contentScale = contentScale, ) } - -/** - * Show a part of the original drawable, non-animated only implementation. - */ -@Composable -fun EhAsyncPreview( - model: GalleryPreview, - modifier: Modifier = Modifier, -) { - var contentScale by remember { mutableStateOf(ContentScale.Fit) } - AsyncImage( - model = requestOf(model), - contentDescription = "", - modifier = modifier, - transform = { - model.run { - if (it is AsyncImagePainter.State.Success && this is NormalGalleryPreview) { - it.copy( - painter = BitmapPainter( - (it.result.drawable as BitmapDrawable).bitmap.asImageBitmap(), - IntOffset(offsetX, 0), - IntSize(clipWidth - 1, clipHeight - 1), - ), - ) - } else { - it - } - } - }, - onState = { - if (it is AsyncImagePainter.State.Success) { - model.run { - if (this is NormalGalleryPreview) { - if (clipWidth.toFloat() / clipHeight in 0.5..0.8) { - if (contentScale == ContentScale.Fit) contentScale = ContentScale.Crop - } - } else { - it.result.drawable.run { - if (intrinsicWidth.toFloat() / intrinsicHeight in 0.5..0.8) { - if (contentScale == ContentScale.Fit) contentScale = ContentScale.Crop - } - } - } - } - } - }, - contentScale = contentScale, - ) -} - -@Composable -fun EhPreviewItem( - galleryPreview: GalleryPreview, - onClick: (() -> Unit), -) = Column(horizontalAlignment = Alignment.CenterHorizontally) { - Box(contentAlignment = Alignment.Center) { - CrystalCard( - onClick = onClick, - modifier = Modifier.fillMaxWidth().aspectRatio(0.6666667F), - ) { - EhAsyncPreview(model = galleryPreview, modifier = Modifier.fillMaxSize()) - } - } - Text((galleryPreview.position + 1).toString()) -} diff --git a/app/src/main/java/com/hippo/ehviewer/ui/compose/GalleryDetailWidgets.kt b/app/src/main/java/com/hippo/ehviewer/ui/compose/data/GalleryDetail.kt similarity index 98% rename from app/src/main/java/com/hippo/ehviewer/ui/compose/GalleryDetailWidgets.kt rename to app/src/main/java/com/hippo/ehviewer/ui/compose/data/GalleryDetail.kt index d5f0dbae8..1c2c23ba1 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/compose/GalleryDetailWidgets.kt +++ b/app/src/main/java/com/hippo/ehviewer/ui/compose/data/GalleryDetail.kt @@ -1,4 +1,4 @@ -package com.hippo.ehviewer.ui.compose +package com.hippo.ehviewer.ui.compose.data import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Column @@ -29,6 +29,7 @@ import com.hippo.ehviewer.R import com.hippo.ehviewer.client.EhUtils import com.hippo.ehviewer.client.data.GalleryDetail import com.hippo.ehviewer.client.data.GalleryInfo +import com.hippo.ehviewer.ui.compose.EhAsyncCropThumb @Composable fun GalleryDetailHeaderInfoCard( diff --git a/app/src/main/java/com/hippo/ehviewer/ui/compose/GalleryInfoCard.kt b/app/src/main/java/com/hippo/ehviewer/ui/compose/data/GalleryInfo.kt similarity index 95% rename from app/src/main/java/com/hippo/ehviewer/ui/compose/GalleryInfoCard.kt rename to app/src/main/java/com/hippo/ehviewer/ui/compose/data/GalleryInfo.kt index f60466369..eb4e8a9d4 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/compose/GalleryInfoCard.kt +++ b/app/src/main/java/com/hippo/ehviewer/ui/compose/data/GalleryInfo.kt @@ -1,4 +1,4 @@ -package com.hippo.ehviewer.ui.compose +package com.hippo.ehviewer.ui.compose.data import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement @@ -34,6 +34,11 @@ import androidx.compose.ui.unit.dp import com.hippo.ehviewer.client.EhUtils import com.hippo.ehviewer.client.data.GalleryInfo import com.hippo.ehviewer.download.DownloadManager +import com.hippo.ehviewer.ui.compose.CrystalCard +import com.hippo.ehviewer.ui.compose.EhAsyncCropThumb +import com.hippo.ehviewer.ui.compose.EhAsyncThumb +import com.hippo.ehviewer.ui.compose.ElevatedCard +import com.hippo.ehviewer.ui.compose.GalleryListCardRating @Composable fun GalleryInfoListItem( diff --git a/app/src/main/java/com/hippo/ehviewer/ui/compose/data/GalleryPreview.kt b/app/src/main/java/com/hippo/ehviewer/ui/compose/data/GalleryPreview.kt new file mode 100644 index 000000000..0f5970e6b --- /dev/null +++ b/app/src/main/java/com/hippo/ehviewer/ui/compose/data/GalleryPreview.kt @@ -0,0 +1,103 @@ +package com.hippo.ehviewer.ui.compose.data + +import android.graphics.drawable.BitmapDrawable +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.aspectRatio +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.ReadOnlyComposable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.asImageBitmap +import androidx.compose.ui.graphics.painter.BitmapPainter +import androidx.compose.ui.layout.ContentScale +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.unit.IntOffset +import androidx.compose.ui.unit.IntSize +import coil.compose.AsyncImage +import coil.compose.AsyncImagePainter +import coil.request.ImageRequest +import com.hippo.ehviewer.client.data.GalleryPreview +import com.hippo.ehviewer.client.data.NormalGalleryPreview +import com.hippo.ehviewer.coil.imageRequest +import com.hippo.ehviewer.ui.compose.CrystalCard + +@Composable +@ReadOnlyComposable +fun requestOf(model: GalleryPreview): ImageRequest { + return LocalContext.current.imageRequest(model) +} + +/** + * Show a part of the original drawable, non-animated only implementation. + */ +@Composable +fun EhAsyncPreview( + model: GalleryPreview, + modifier: Modifier = Modifier, +) { + var contentScale by remember { mutableStateOf(ContentScale.Fit) } + AsyncImage( + model = requestOf(model), + contentDescription = null, + modifier = modifier, + transform = { + model.run { + if (it is AsyncImagePainter.State.Success && this is NormalGalleryPreview) { + it.copy( + painter = BitmapPainter( + (it.result.drawable as BitmapDrawable).bitmap.asImageBitmap(), + IntOffset(offsetX, 0), + IntSize(clipWidth - 1, clipHeight - 1), + ), + ) + } else { + it + } + } + }, + onState = { + if (it is AsyncImagePainter.State.Success) { + model.run { + if (this is NormalGalleryPreview) { + if (clipWidth.toFloat() / clipHeight in 0.5..0.8) { + if (contentScale == ContentScale.Fit) contentScale = ContentScale.Crop + } + } else { + it.result.drawable.run { + if (intrinsicWidth.toFloat() / intrinsicHeight in 0.5..0.8) { + if (contentScale == ContentScale.Fit) { + contentScale = ContentScale.Crop + } + } + } + } + } + } + }, + contentScale = contentScale, + ) +} + +@Composable +fun EhPreviewItem( + galleryPreview: GalleryPreview, + onClick: () -> Unit, +) = Column(horizontalAlignment = Alignment.CenterHorizontally) { + Box(contentAlignment = Alignment.Center) { + CrystalCard( + onClick = onClick, + modifier = Modifier.fillMaxWidth().aspectRatio(0.6666667F), + ) { + EhAsyncPreview(model = galleryPreview, modifier = Modifier.fillMaxSize()) + } + } + Text((galleryPreview.position + 1).toString()) +} diff --git a/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryDetailScene.kt b/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryDetailScene.kt index 80cc07103..b46fa193b 100755 --- a/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryDetailScene.kt +++ b/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryDetailScene.kt @@ -47,7 +47,6 @@ import androidx.compose.foundation.layout.FlowRow import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer -import androidx.compose.foundation.layout.aspectRatio import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height @@ -151,9 +150,9 @@ import com.hippo.ehviewer.ui.GalleryInfoBottomSheet import com.hippo.ehviewer.ui.MainActivity import com.hippo.ehviewer.ui.addToFavorites import com.hippo.ehviewer.ui.compose.CrystalCard -import com.hippo.ehviewer.ui.compose.EhAsyncPreview -import com.hippo.ehviewer.ui.compose.GalleryDetailHeaderCard import com.hippo.ehviewer.ui.compose.GalleryDetailRating +import com.hippo.ehviewer.ui.compose.data.EhPreviewItem +import com.hippo.ehviewer.ui.compose.data.GalleryDetailHeaderCard import com.hippo.ehviewer.ui.compose.setMD3Content import com.hippo.ehviewer.ui.legacy.BaseDialogBuilder import com.hippo.ehviewer.ui.legacy.CheckBoxDialogBuilder @@ -654,26 +653,10 @@ class GalleryDetailScene : BaseScene(), DownloadInfoListener { private fun LazyGridScope.galleryDetailPreview(gd: GalleryDetail) { val previewList = gd.previewList items(previewList) { - Column( - horizontalAlignment = Alignment.CenterHorizontally, - ) { - Box(contentAlignment = Alignment.Center) { - CrystalCard( - onClick = { - mainActivity?.startReaderActivity(gd, it.position) - }, - modifier = Modifier - .fillMaxWidth() - .aspectRatio(0.6666667F), - ) { - EhAsyncPreview( - model = it, - modifier = Modifier.fillMaxSize(), - ) - } - } - Text((it.position + 1).toString()) - } + EhPreviewItem( + galleryPreview = it, + onClick = { mainActivity?.startReaderActivity(gd, it.position) }, + ) } item(span = { GridItemSpan(maxLineSpan) }) { val footerText = if (gd.previewPages <= 0 || previewList.isEmpty()) { diff --git a/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryHolder.kt b/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryHolder.kt index 33484dd4b..37194bf3f 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryHolder.kt +++ b/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryHolder.kt @@ -35,8 +35,8 @@ import androidx.recyclerview.widget.RecyclerView import com.google.accompanist.themeadapter.material3.Mdc3Theme import com.hippo.ehviewer.Settings import com.hippo.ehviewer.client.data.GalleryInfo -import com.hippo.ehviewer.ui.compose.GalleryInfoGridItem -import com.hippo.ehviewer.ui.compose.GalleryInfoListItem +import com.hippo.ehviewer.ui.compose.data.GalleryInfoGridItem +import com.hippo.ehviewer.ui.compose.data.GalleryInfoListItem import eu.kanade.tachiyomi.util.system.pxToDp abstract class GalleryHolder(composeView: CheckableComposeView) : RecyclerView.ViewHolder(composeView) { diff --git a/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryPreviewScreen.kt b/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryPreviewScreen.kt index a77c6e59d..3c2160ea7 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryPreviewScreen.kt +++ b/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryPreviewScreen.kt @@ -54,7 +54,7 @@ import com.hippo.ehviewer.client.EhUrl import com.hippo.ehviewer.client.data.GalleryDetail import com.hippo.ehviewer.client.data.GalleryPreview import com.hippo.ehviewer.coil.imageRequest -import com.hippo.ehviewer.ui.compose.EhPreviewItem +import com.hippo.ehviewer.ui.compose.data.EhPreviewItem import com.hippo.ehviewer.ui.compose.rememberDialogState import com.hippo.ehviewer.ui.compose.setMD3Content import com.hippo.ehviewer.ui.legacy.recyclerview.calculateSuitableSpanCount diff --git a/app/src/main/java/com/hippo/ehviewer/ui/scene/HistoryScene.kt b/app/src/main/java/com/hippo/ehviewer/ui/scene/HistoryScene.kt index 534857884..e8b639a24 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/scene/HistoryScene.kt +++ b/app/src/main/java/com/hippo/ehviewer/ui/scene/HistoryScene.kt @@ -74,7 +74,7 @@ import com.hippo.ehviewer.download.DownloadManager import com.hippo.ehviewer.ui.CommonOperations import com.hippo.ehviewer.ui.addToFavorites import com.hippo.ehviewer.ui.compose.Deferred -import com.hippo.ehviewer.ui.compose.GalleryInfoListItem +import com.hippo.ehviewer.ui.compose.data.GalleryInfoListItem import com.hippo.ehviewer.ui.compose.rememberDialogState import com.hippo.ehviewer.ui.compose.setMD3Content import com.hippo.ehviewer.ui.dialog.SelectItemWithIconAdapter