Refactor compose layout package
This commit is contained in:
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())
|
||||
}
|
||||
+2
-1
@@ -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(
|
||||
+6
-1
@@ -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
|
||||
|
||||
Reference in new issue
Block a user