Card UI changes, transparent

This commit is contained in:
Damontecres 2025-10-04 22:42:21 -04:00
parent 3109b4c003
commit 887dd7001c
No known key found for this signature in database
5 changed files with 72 additions and 23 deletions

View file

@ -37,7 +37,7 @@ fun BannerCard(
onClick: () -> Unit, onClick: () -> Unit,
onLongClick: () -> Unit, onLongClick: () -> Unit,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
cardHeight: Dp = 140.dp, cardHeight: Dp = 140.dp * .85f,
aspectRatio: Float = 16f / 9, aspectRatio: Float = 16f / 9,
interactionSource: MutableInteractionSource? = null, interactionSource: MutableInteractionSource? = null,
) { ) {

View file

@ -28,7 +28,7 @@ fun ChapterCard(
imageUrl: String?, imageUrl: String?,
onClick: () -> Unit, onClick: () -> Unit,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
cardHeight: Dp = 140.dp, cardHeight: Dp = 140.dp * .85f,
aspectRatio: Float = 16f / 9, aspectRatio: Float = 16f / 9,
onLongClick: (() -> Unit)? = null, onLongClick: (() -> Unit)? = null,
interactionSource: MutableInteractionSource? = null, interactionSource: MutableInteractionSource? = null,

View file

@ -27,14 +27,17 @@ import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip import androidx.compose.ui.draw.clip
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.RectangleShape import androidx.compose.ui.graphics.RectangleShape
import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.res.colorResource import androidx.compose.ui.res.colorResource
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp import androidx.compose.ui.unit.sp
import androidx.tv.material3.Card import androidx.tv.material3.Card
import androidx.tv.material3.CardDefaults
import androidx.tv.material3.Icon import androidx.tv.material3.Icon
import androidx.tv.material3.MaterialTheme import androidx.tv.material3.MaterialTheme
import androidx.tv.material3.Text import androidx.tv.material3.Text
@ -43,6 +46,7 @@ import com.github.damontecres.dolphin.R
import com.github.damontecres.dolphin.data.model.BaseItem import com.github.damontecres.dolphin.data.model.BaseItem
import com.github.damontecres.dolphin.ui.FontAwesome import com.github.damontecres.dolphin.ui.FontAwesome
import com.github.damontecres.dolphin.ui.enableMarquee import com.github.damontecres.dolphin.ui.enableMarquee
import com.github.damontecres.dolphin.ui.ifElse
import kotlinx.coroutines.delay import kotlinx.coroutines.delay
import org.jellyfin.sdk.model.api.BaseItemKind import org.jellyfin.sdk.model.api.BaseItemKind
@ -52,11 +56,11 @@ fun ItemCard(
onClick: () -> Unit, onClick: () -> Unit,
onLongClick: () -> Unit, onLongClick: () -> Unit,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
cardWidth: Dp = 150.dp, cardWidth: Dp? = null,
cardHeight: Dp = 200.dp, cardHeight: Dp = 200.dp * .85f,
interactionSource: MutableInteractionSource = remember { MutableInteractionSource() }, interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },
) { ) {
val hideOverlayDelay = 1_000L val hideOverlayDelay = 750L
val focused = interactionSource.collectIsFocusedAsState().value val focused = interactionSource.collectIsFocusedAsState().value
var focusedAfterDelay by remember { mutableStateOf(false) } var focusedAfterDelay by remember { mutableStateOf(false) }
@ -79,17 +83,21 @@ fun ItemCard(
} else { } else {
val dto = item.data val dto = item.data
// TODO better aspect ratio handling // TODO better aspect ratio handling
val height = // val height =
if (dto.primaryImageAspectRatio != null && dto.primaryImageAspectRatio!! > 1) cardWidth else cardHeight // if (dto.primaryImageAspectRatio != null && dto.primaryImageAspectRatio!! > 1) cardWidth else cardHeight
Card( Card(
modifier = modifier, modifier = modifier,
onClick = onClick, onClick = onClick,
onLongClick = onLongClick, onLongClick = onLongClick,
interactionSource = interactionSource, interactionSource = interactionSource,
colors =
CardDefaults.colors(
containerColor = Color.Transparent,
),
) { ) {
Column( Column(
verticalArrangement = Arrangement.spacedBy(4.dp), verticalArrangement = Arrangement.spacedBy(4.dp),
modifier = Modifier.width(cardWidth), modifier = Modifier.ifElse(cardWidth != null, { Modifier.width(cardWidth!!) }),
) { ) {
ItemCardImage( ItemCardImage(
imageUrl = item.imageUrl, imageUrl = item.imageUrl,
@ -102,15 +110,33 @@ fun ItemCard(
modifier = modifier =
Modifier Modifier
.fillMaxWidth() .fillMaxWidth()
.height(height), .height(cardHeight),
) )
Column(
verticalArrangement = Arrangement.spacedBy(0.dp),
modifier = Modifier.padding(bottom = 4.dp),
) {
Text( Text(
text = item.name ?: "", text = item.name ?: "",
maxLines = 1, maxLines = 1,
textAlign = TextAlign.Center,
modifier = modifier =
Modifier Modifier
.fillMaxWidth()
.padding(horizontal = 4.dp)
.enableMarquee(focusedAfterDelay), .enableMarquee(focusedAfterDelay),
) )
Text(
text = item.data.productionYear?.toString() ?: "",
maxLines = 1,
textAlign = TextAlign.Center,
modifier =
Modifier
.fillMaxWidth()
.padding(horizontal = 4.dp)
.enableMarquee(focusedAfterDelay),
)
}
if (dto.type == BaseItemKind.EPISODE) { if (dto.type == BaseItemKind.EPISODE) {
if (dto.parentIndexNumber != null && dto.indexNumber != null) { if (dto.parentIndexNumber != null && dto.indexNumber != null) {
Text( Text(
@ -139,7 +165,11 @@ fun ItemCardImage(
model = imageUrl, model = imageUrl,
contentDescription = name, contentDescription = name,
contentScale = ContentScale.Fit, contentScale = ContentScale.Fit,
modifier = Modifier.fillMaxSize(), alignment = Alignment.Center,
modifier =
Modifier
.fillMaxSize()
.align(Alignment.TopCenter),
) )
AnimatedVisibility( AnimatedVisibility(
visible = showOverlay, visible = showOverlay,

View file

@ -2,19 +2,21 @@ package com.github.damontecres.dolphin.ui.cards
import androidx.compose.foundation.interaction.MutableInteractionSource import androidx.compose.foundation.interaction.MutableInteractionSource
import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.width
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.tv.material3.Card import androidx.tv.material3.Card
import androidx.tv.material3.Text import androidx.tv.material3.Text
import com.github.damontecres.dolphin.ui.ifElse
@Composable @Composable
fun NullCard( fun NullCard(
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
cardWidth: Dp = 150.dp, cardWidth: Dp? = null,
cardHeight: Dp = 200.dp, cardHeight: Dp = 200.dp * .75f,
interactionSource: MutableInteractionSource? = null, interactionSource: MutableInteractionSource? = null,
) { ) {
Card( Card(
@ -23,7 +25,10 @@ fun NullCard(
interactionSource = interactionSource, interactionSource = interactionSource,
) { ) {
Column( Column(
modifier = Modifier.size(cardWidth, cardHeight), modifier =
Modifier
.height(cardHeight)
.ifElse(cardWidth != null, { Modifier.width(cardWidth!!) }),
) { ) {
Text( Text(
text = "Loading...", text = "Loading...",

View file

@ -6,6 +6,7 @@ import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.width import androidx.compose.foundation.layout.width
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.LaunchedEffect
@ -14,9 +15,12 @@ import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.tv.material3.Card import androidx.tv.material3.Card
import androidx.tv.material3.CardDefaults
import androidx.tv.material3.Text import androidx.tv.material3.Text
import com.github.damontecres.dolphin.data.model.Person import com.github.damontecres.dolphin.data.model.Person
import com.github.damontecres.dolphin.ui.enableMarquee import com.github.damontecres.dolphin.ui.enableMarquee
@ -28,8 +32,8 @@ fun PersonCard(
onClick: () -> Unit, onClick: () -> Unit,
onLongClick: () -> Unit, onLongClick: () -> Unit,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
cardWidth: Dp = 150.dp, cardWidth: Dp = 150.dp * .75f,
cardHeight: Dp = 200.dp, cardHeight: Dp = 200.dp * .75f,
interactionSource: MutableInteractionSource = remember { MutableInteractionSource() }, interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },
) { ) {
val hideOverlayDelay = 1_000L val hideOverlayDelay = 1_000L
@ -55,6 +59,10 @@ fun PersonCard(
onClick = onClick, onClick = onClick,
onLongClick = onLongClick, onLongClick = onLongClick,
interactionSource = interactionSource, interactionSource = interactionSource,
colors =
CardDefaults.colors(
containerColor = Color.Transparent,
),
) { ) {
Column( Column(
verticalArrangement = Arrangement.spacedBy(4.dp), verticalArrangement = Arrangement.spacedBy(4.dp),
@ -76,16 +84,22 @@ fun PersonCard(
Text( Text(
text = item.name ?: "", text = item.name ?: "",
maxLines = 1, maxLines = 1,
textAlign = TextAlign.Center,
modifier = modifier =
Modifier Modifier
.fillMaxWidth()
.padding(horizontal = 4.dp)
.enableMarquee(focusedAfterDelay), .enableMarquee(focusedAfterDelay),
) )
item.role?.let { item.role?.let {
Text( Text(
text = item.role, text = item.role,
maxLines = 1, maxLines = 1,
textAlign = TextAlign.Center,
modifier = modifier =
Modifier Modifier
.fillMaxWidth()
.padding(horizontal = 4.dp)
.enableMarquee(focusedAfterDelay), .enableMarquee(focusedAfterDelay),
) )
} }