Refactor compose layout package

This commit is contained in:
tarsin committed 2023-05-14 14:44:07 +08:00
1 parent 6246d01247
commit 41991b8f22
8 files changed
+121 -114

No files matched your search

@@ -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())
}
@@ -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(
@@ -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(
@@ -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())
}
@@ -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()) {
@@ -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) {
@@ -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
@@ -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