Implement CheckableComposeCardView

This commit is contained in:
tarsin committed 2023-05-12 19:58:48 +08:00
1 parent 6b0ac4bf0a
commit 346b614999
2 files changed
+29 -16

No files matched your search

@@ -21,7 +21,6 @@ import android.graphics.Rect
import android.view.View
import android.view.ViewGroup
import androidx.annotation.IntDef
import androidx.compose.ui.platform.ComposeView
import androidx.recyclerview.widget.RecyclerView
import androidx.recyclerview.widget.RecyclerView.ItemDecoration
import androidx.recyclerview.widget.StaggeredGridLayoutManager
@@ -147,11 +146,8 @@ abstract class GalleryAdapter(
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): GalleryHolder {
val holder = when (viewType) {
TYPE_LIST -> ListGalleryHolder(
ComposeView(parent.context),
mShowFavourited,
)
TYPE_GRID -> GridGalleryHolder(ComposeView(parent.context))
TYPE_LIST -> ListGalleryHolder(CheckableComposeView(parent.context), mShowFavourited)
TYPE_GRID -> GridGalleryHolder(CheckableComposeView(parent.context))
else -> throw IllegalStateException("Unexpected value: $viewType")
}
return holder
@@ -18,24 +18,29 @@ package com.hippo.ehviewer.ui.scene
import android.content.Context
import android.util.AttributeSet
import android.widget.Checkable
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.size
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.CheckCircle
import androidx.compose.material3.Icon
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.AbstractComposeView
import androidx.compose.ui.platform.ComposeView
import androidx.compose.ui.unit.dp
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.widget.GalleryInfoGridItem
import com.hippo.ehviewer.ui.widget.GalleryInfoListItem
import com.hippo.ehviewer.ui.widget.setMD3Content
import eu.kanade.tachiyomi.util.system.pxToDp
abstract class GalleryHolder(composeView: ComposeView) : RecyclerView.ViewHolder(composeView) {
abstract class GalleryHolder(composeView: CheckableComposeView) : RecyclerView.ViewHolder(composeView) {
abstract fun bind(
galleryInfo: GalleryInfo,
onClick: () -> Unit,
@@ -43,10 +48,7 @@ abstract class GalleryHolder(composeView: ComposeView) : RecyclerView.ViewHolder
)
}
class ListGalleryHolder(
private val composeView: ComposeView,
private val showFavourite: Boolean,
) : GalleryHolder(composeView) {
class ListGalleryHolder(private val composeView: CheckableComposeView, private val showFavourite: Boolean) : GalleryHolder(composeView) {
private val height = (Settings.listThumbSize * 3).pxToDp.dp
private val showPages = Settings.showGalleryPages
@@ -65,7 +67,7 @@ class ListGalleryHolder(
}
}
class GridGalleryHolder(private val composeView: ComposeView) : GalleryHolder(composeView) {
class GridGalleryHolder(private val composeView: CheckableComposeView) : GalleryHolder(composeView) {
override fun bind(galleryInfo: GalleryInfo, onClick: () -> Unit, onLongClick: () -> Unit) {
composeView.setMD3Content {
GalleryInfoGridItem(
@@ -104,9 +106,22 @@ class CheckableComposeView @JvmOverloads constructor(
return javaClass.name
}
fun setContent(content: @Composable (Boolean) -> Unit) {
private fun setContent(content: @Composable () -> Unit) {
shouldCreateCompositionOnAttachedToWindow = true
this.content.value = content
this.content.value = { selected ->
Mdc3Theme {
Box {
content()
if (selected) {
Icon(
imageVector = Icons.Default.CheckCircle,
contentDescription = null,
modifier = Modifier.align(Alignment.TopEnd).size(48.dp),
)
}
}
}
}
if (isAttachedToWindow) {
createComposition()
}
@@ -121,4 +136,6 @@ class CheckableComposeView @JvmOverloads constructor(
override fun toggle() {
mChecked = !mChecked
}
fun setMD3Content(content: @Composable () -> Unit) = setContent(content)
}