Update the highligh element of a "isNew" item

This commit is contained in:
Thomas Andres Gomez 2024-01-11 10:26:33 +01:00
parent 1079f4e5c6
commit 9f82746a64
8 changed files with 271 additions and 159 deletions

View file

@ -2,13 +2,23 @@ package com.pixelized.rplexicon.ui.screens.lexicon.list
import android.content.res.Configuration.UI_MODE_NIGHT_NO import android.content.res.Configuration.UI_MODE_NIGHT_NO
import android.content.res.Configuration.UI_MODE_NIGHT_YES import android.content.res.Configuration.UI_MODE_NIGHT_YES
import androidx.compose.animation.AnimatedVisibility
import androidx.compose.animation.fadeIn
import androidx.compose.animation.fadeOut
import androidx.compose.foundation.background
import androidx.compose.foundation.clickable import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.IntrinsicSize
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxHeight
import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.heightIn import androidx.compose.foundation.layout.heightIn
import androidx.compose.foundation.layout.offset import androidx.compose.foundation.layout.offset
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.width
import androidx.compose.material3.Icon import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton import androidx.compose.material3.IconButton
import androidx.compose.material3.MaterialTheme import androidx.compose.material3.MaterialTheme
@ -30,10 +40,8 @@ import androidx.compose.ui.unit.dp
import com.pixelized.rplexicon.R import com.pixelized.rplexicon.R
import com.pixelized.rplexicon.ui.theme.LexiconTheme import com.pixelized.rplexicon.ui.theme.LexiconTheme
import com.pixelized.rplexicon.utilitary.LOS_FULL import com.pixelized.rplexicon.utilitary.LOS_FULL
import com.pixelized.rplexicon.utilitary.LOS_HOLLOW
import com.pixelized.rplexicon.utilitary.extentions.lexicon import com.pixelized.rplexicon.utilitary.extentions.lexicon
import com.pixelized.rplexicon.utilitary.extentions.placeholder import com.pixelized.rplexicon.utilitary.extentions.placeholder
import java.util.UUID
@Stable @Stable
class LexiconGroupUio( class LexiconGroupUio(
@ -53,14 +61,23 @@ data class LexiconItemUio(
val isNew: Boolean = false, val isNew: Boolean = false,
) { ) {
companion object { companion object {
fun placeholder() = LexiconItemUio( fun preview(
id = UUID.randomUUID().toString(), name: String,
name = "placeholder", diminutive: String? = null,
diminutive = null, gender: String? = "Homme",
gender = null, race: String? = "Humain",
race = null, isPlayingCharacter: Boolean = false,
isPlayingCharacter = false, placeholder: Boolean = false,
placeholder = true, isNew: Boolean = false,
) = LexiconItemUio(
id = name,
name = name,
diminutive = diminutive,
gender = gender,
race = race,
isPlayingCharacter = isPlayingCharacter,
placeholder = placeholder,
isNew = isNew,
) )
} }
} }
@ -68,108 +85,125 @@ data class LexiconItemUio(
@Composable @Composable
fun LexiconItem( fun LexiconItem(
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
padding: PaddingValues = PaddingValues(start = 16.dp, end = 8.dp, top = 4.dp, bottom = 4.dp),
item: LexiconItemUio, item: LexiconItemUio,
onItem: (LexiconItemUio) -> Unit, onItem: (LexiconItemUio) -> Unit,
onCharacterSheet: (LexiconItemUio) -> Unit, onCharacterSheet: (LexiconItemUio) -> Unit,
) { ) {
val typography = MaterialTheme.lexicon.typography val typography = MaterialTheme.lexicon.typography
Row( Box(
modifier = modifier modifier = Modifier.height(intrinsicSize = IntrinsicSize.Min)
.clickable { item.let(onItem) }
.fillMaxWidth()
.heightIn(min = MaterialTheme.lexicon.dimens.item)
.padding(vertical = 4.dp)
.padding(start = 16.dp, end = 8.dp),
verticalAlignment = Alignment.CenterVertically,
) { ) {
Row( Row(
modifier = Modifier modifier = Modifier
.weight(weight = 1f) .clickable { item.let(onItem) }
.padding(end = 8.dp), .fillMaxWidth()
horizontalArrangement = Arrangement.spacedBy(space = 4.dp), .heightIn(min = MaterialTheme.lexicon.dimens.item)
.padding(paddingValues = padding)
.then(other = modifier),
verticalAlignment = Alignment.CenterVertically,
) { ) {
Text( Row(
modifier = Modifier modifier = Modifier
.padding(end = 4.dp) .weight(weight = 1f)
.alignByBaseline(), .padding(end = 8.dp),
style = typography.base.titleMedium, horizontalArrangement = Arrangement.spacedBy(space = 4.dp),
color = if (item.isNew) MaterialTheme.colorScheme.primary else MaterialTheme.colorScheme.onSurface, ) {
text = LOS_FULL, Text(
) modifier = Modifier
.padding(end = 4.dp)
.alignByBaseline(),
style = typography.base.titleMedium,
color = if (item.isNew) MaterialTheme.colorScheme.primary else MaterialTheme.colorScheme.onSurface,
text = LOS_FULL,
)
Text(
modifier = Modifier
.alignByBaseline()
.placeholder { item.placeholder },
style = typography.base.titleMedium,
fontWeight = FontWeight.Bold,
maxLines = 1,
overflow = TextOverflow.Ellipsis,
text = AnnotatedString(
text = item.name,
spanStyles = when (item.placeholder) {
true -> emptyList()
else -> listOf(
AnnotatedString.Range(
item = typography.titleMediumDropCap,
start = 0,
end = 1,
)
)
},
),
)
item.diminutive?.let {
Text( Text(
modifier = Modifier modifier = Modifier
.alignByBaseline() .alignByBaseline()
.placeholder { item.placeholder }, .placeholder { item.placeholder },
style = typography.base.labelMedium, style = typography.base.titleMedium,
fontWeight = FontWeight.Bold,
maxLines = 1, maxLines = 1,
overflow = TextOverflow.Ellipsis, overflow = TextOverflow.Ellipsis,
text = it, text = AnnotatedString(
text = item.name,
spanStyles = when (item.placeholder) {
true -> emptyList()
else -> listOf(
AnnotatedString.Range(
item = typography.titleMediumDropCap,
start = 0,
end = 1,
)
)
},
),
) )
item.diminutive?.let {
Text(
modifier = Modifier
.alignByBaseline()
.placeholder { item.placeholder },
style = typography.base.labelMedium,
maxLines = 1,
overflow = TextOverflow.Ellipsis,
text = it,
)
}
item.gender?.let {
Text(
modifier = Modifier
.alignByBaseline()
.placeholder { item.placeholder },
style = typography.base.labelMedium,
fontStyle = FontStyle.Italic,
fontWeight = FontWeight.Light,
maxLines = 1,
text = it,
)
}
item.race?.let {
Text(
modifier = Modifier
.alignByBaseline()
.placeholder { item.placeholder },
style = typography.base.labelMedium,
fontStyle = FontStyle.Italic,
fontWeight = FontWeight.Light,
maxLines = 1,
text = it,
)
}
} }
item.gender?.let { if (item.isPlayingCharacter) {
Text( IconButton(
modifier = Modifier modifier = Modifier.offset(x = 4.dp),
.alignByBaseline() onClick = { item.let(onCharacterSheet) }
.placeholder { item.placeholder }, ) {
style = typography.base.labelMedium, Icon(
fontStyle = FontStyle.Italic, painter = painterResource(id = R.drawable.ic_d20_24),
fontWeight = FontWeight.Light, contentDescription = null
maxLines = 1, )
text = it, }
)
}
item.race?.let {
Text(
modifier = Modifier
.alignByBaseline()
.placeholder { item.placeholder },
style = typography.base.labelMedium,
fontStyle = FontStyle.Italic,
fontWeight = FontWeight.Light,
maxLines = 1,
text = it,
)
} }
} }
AnimatedVisibility(
if (item.isPlayingCharacter) { visible = item.isNew,
IconButton( enter = fadeIn(),
modifier = Modifier.offset(x = 4.dp), exit = fadeOut(),
onClick = { item.let(onCharacterSheet) } ) {
) { Box(
Icon( modifier = Modifier
painter = painterResource(id = R.drawable.ic_d20_24), .fillMaxHeight()
contentDescription = null .width(width = 2.dp)
) .background(color = MaterialTheme.colorScheme.primary)
} )
} }
} }
} }
@ -194,22 +228,23 @@ private fun LexiconItemPreview(
private class LexiconItemPreviewProvider : PreviewParameterProvider<LexiconItemUio> { private class LexiconItemPreviewProvider : PreviewParameterProvider<LexiconItemUio> {
override val values: Sequence<LexiconItemUio> = sequenceOf( override val values: Sequence<LexiconItemUio> = sequenceOf(
LexiconItemUio( LexiconItemUio.preview(
id = "",
name = "Mundas-Naltum-Brulkhai-Arauishi", name = "Mundas-Naltum-Brulkhai-Arauishi",
diminutive = "Mun-Nalt-Bru-Arahi", diminutive = "Mun-Nalt-Bru-Arahi",
gender = "Femme", gender = "Femme",
race = "Demi-orc", race = "Demi-orc",
isPlayingCharacter = true, isPlayingCharacter = true,
), ),
LexiconItemUio( LexiconItemUio.preview(
id = "",
name = "Brulkhai", name = "Brulkhai",
diminutive = "Bru", diminutive = "Bru",
gender = "Femme", gender = "Femme",
race = "Demi-orc", race = "Demi-orc",
isNew = true, isNew = true,
), ),
LexiconItemUio.placeholder(), LexiconItemUio.preview(
name = "Isaac Asimov",
placeholder = true,
),
) )
} }

View file

@ -5,7 +5,6 @@ import android.content.res.Configuration.UI_MODE_NIGHT_YES
import androidx.compose.animation.AnimatedVisibility import androidx.compose.animation.AnimatedVisibility
import androidx.compose.animation.fadeIn import androidx.compose.animation.fadeIn
import androidx.compose.animation.fadeOut import androidx.compose.animation.fadeOut
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
@ -45,7 +44,6 @@ import com.pixelized.rplexicon.ui.navigation.screens.navigateToCharacterSheet
import com.pixelized.rplexicon.ui.navigation.screens.navigateToLexiconDetail import com.pixelized.rplexicon.ui.navigation.screens.navigateToLexiconDetail
import com.pixelized.rplexicon.ui.navigation.screens.navigateToSearch import com.pixelized.rplexicon.ui.navigation.screens.navigateToSearch
import com.pixelized.rplexicon.ui.theme.LexiconTheme import com.pixelized.rplexicon.ui.theme.LexiconTheme
import com.pixelized.rplexicon.utilitary.extentions.cell
import com.pixelized.rplexicon.utilitary.extentions.lexicon import com.pixelized.rplexicon.utilitary.extentions.lexicon
import com.pixelized.rplexicon.utilitary.extentions.scroll import com.pixelized.rplexicon.utilitary.extentions.scroll
import kotlinx.coroutines.launch import kotlinx.coroutines.launch

View file

@ -15,64 +15,78 @@ fun rememberLexiconGroupStatePreview(): State<List<LexiconGroupUio>> {
LexiconGroupUio( LexiconGroupUio(
category = "Personnage joueur", category = "Personnage joueur",
items = listOf( items = listOf(
LexiconItemUio( LexiconItemUio.preview(
id = "Brulkhai-1",
name = "Brulkhai", name = "Brulkhai",
diminutive = "Bru", diminutive = "./ Bru",
gender = "Femme", gender = "Femme",
race = "Demi-orc", race = "Demi-orc",
isPlayingCharacter = true,
), ),
LexiconItemUio( LexiconItemUio.preview(
id = "Léandre-1",
name = "Léandre", name = "Léandre",
diminutive = null,
gender = "Homme", gender = "Homme",
race = "Humain", race = "Humain",
isPlayingCharacter = true,
), ),
LexiconItemUio( LexiconItemUio.preview(
id = "Nelia-1",
name = "Nelia", name = "Nelia",
diminutive = "Nel",
gender = "Femme", gender = "Femme",
race = "Elfe", race = "Elfe",
isPlayingCharacter = true,
), ),
LexiconItemUio( LexiconItemUio.preview(
id = "Tigrane-1",
name = "Tigrane", name = "Tigrane",
diminutive = null,
gender = "Homme", gender = "Homme",
race = "Tieffelin", race = "Tieffelin",
isPlayingCharacter = true,
), ),
LexiconItemUio( LexiconItemUio.preview(
id = "Unathana-1",
name = "Unathana", name = "Unathana",
diminutive = "Una", diminutive = "./ Una",
gender = "Femme", gender = "Femme",
race = "Demi-elfe", race = "Demi-elfe",
isPlayingCharacter = true,
), ),
), ),
), ),
LexiconGroupUio( LexiconGroupUio(
category = "Argynvosthold", category = "Argynvosthold",
items = listOf( items = listOf(
LexiconItemUio( LexiconItemUio.preview(
id = "Godfrey Gwylin-1",
name = "Godfrey Gwylin", name = "Godfrey Gwylin",
diminutive = null,
gender = "Homme", gender = "Homme",
race = "Inconnu",
), ),
), ),
), ),
LexiconGroupUio( LexiconGroupUio(
category = "Vallakiens", category = "Vallakiens",
items = listOf( items = listOf(
LexiconItemUio( LexiconItemUio.preview(
id = "Godfrey Gwylin-1", name = "Père Petrovich",
name = "Godfrey Gwylin",
diminutive = null,
gender = "Homme", gender = "Homme",
race = "Inconnu", ),
LexiconItemUio.preview(
name = "Yeska",
gender = "Homme",
isNew = true,
),
LexiconItemUio.preview(
name = "Milivoj",
gender = "Homme",
),
LexiconItemUio.preview(
name = "Claudia Belasco",
gender = "Femme",
isNew = true,
),
LexiconItemUio.preview(
name = "Henrik van der Voort",
gender = "Homme",
isNew = true,
),
LexiconItemUio.preview(
name = "Dame Fiona Wachter",
gender = "Femme",
), ),
), ),
), ),

View file

@ -1,9 +1,22 @@
package com.pixelized.rplexicon.ui.screens.location.list package com.pixelized.rplexicon.ui.screens.location.list
import android.content.res.Configuration import android.content.res.Configuration
import androidx.compose.animation.AnimatedVisibility
import androidx.compose.animation.fadeIn
import androidx.compose.animation.fadeOut
import androidx.compose.foundation.background
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.IntrinsicSize
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxHeight
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.heightIn
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.width
import androidx.compose.material3.MaterialTheme import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Surface import androidx.compose.material3.Surface
import androidx.compose.material3.Text import androidx.compose.material3.Text
@ -21,9 +34,6 @@ import androidx.compose.ui.tooling.preview.PreviewParameterProvider
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import com.pixelized.rplexicon.ui.theme.LexiconTheme import com.pixelized.rplexicon.ui.theme.LexiconTheme
import com.pixelized.rplexicon.utilitary.LOS_FULL import com.pixelized.rplexicon.utilitary.LOS_FULL
import com.pixelized.rplexicon.utilitary.LOS_HOLLOW
import com.pixelized.rplexicon.utilitary.annotateWithDropCap
import com.pixelized.rplexicon.utilitary.extentions.cell
import com.pixelized.rplexicon.utilitary.extentions.lexicon import com.pixelized.rplexicon.utilitary.extentions.lexicon
import com.pixelized.rplexicon.utilitary.extentions.placeholder import com.pixelized.rplexicon.utilitary.extentions.placeholder
@ -42,14 +52,15 @@ data class LocationItemUio(
) { ) {
companion object { companion object {
fun preview( fun preview(
id: String = "0",
title: String = "Daggerfall", title: String = "Daggerfall",
placeHolder: Boolean = false, placeHolder: Boolean = false,
isNew: Boolean = false,
): LocationItemUio { ): LocationItemUio {
return LocationItemUio( return LocationItemUio(
id = id, id = title,
title = title, title = title,
placeholder = placeHolder, placeholder = placeHolder,
isNew = isNew,
) )
} }
} }
@ -58,15 +69,22 @@ data class LocationItemUio(
@Composable @Composable
fun LocationItem( fun LocationItem(
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
padding: PaddingValues = PaddingValues(horizontal = 16.dp, vertical = 4.dp),
item: LocationItemUio, item: LocationItemUio,
onItem: (LocationItemUio) -> Unit,
) { ) {
val typography = MaterialTheme.lexicon.typography val typography = MaterialTheme.lexicon.typography
Box( Box(
modifier = modifier, modifier = Modifier
.clickable { item.let(onItem) }
.fillMaxWidth()
.heightIn(min = MaterialTheme.lexicon.dimens.item)
.height(intrinsicSize = IntrinsicSize.Min)
.then(other = modifier),
contentAlignment = Alignment.CenterStart, contentAlignment = Alignment.CenterStart,
) { ) {
Row( Row(
modifier = Modifier.padding(paddingValues = padding),
horizontalArrangement = Arrangement.spacedBy(8.dp), horizontalArrangement = Arrangement.spacedBy(8.dp),
) { ) {
Text( Text(
@ -104,6 +122,18 @@ fun LocationItem(
}, },
) )
} }
AnimatedVisibility(
visible = item.isNew,
enter = fadeIn(),
exit = fadeOut(),
) {
Box(
modifier = Modifier
.fillMaxHeight()
.width(width = 2.dp)
.background(color = MaterialTheme.colorScheme.primary)
)
}
} }
} }
@ -116,8 +146,8 @@ private fun QuestItemPreview(
LexiconTheme { LexiconTheme {
Surface { Surface {
LocationItem( LocationItem(
modifier = Modifier.cell(),
item = preview, item = preview,
onItem = { },
) )
} }
} }
@ -126,6 +156,7 @@ private fun QuestItemPreview(
private class QuestItemPreviewProvider : PreviewParameterProvider<LocationItemUio> { private class QuestItemPreviewProvider : PreviewParameterProvider<LocationItemUio> {
override val values: Sequence<LocationItemUio> = sequenceOf( override val values: Sequence<LocationItemUio> = sequenceOf(
LocationItemUio.preview(placeHolder = false), LocationItemUio.preview(placeHolder = false),
LocationItemUio.preview(placeHolder = false, isNew = true),
LocationItemUio.preview(placeHolder = true), LocationItemUio.preview(placeHolder = true),
) )
} }

View file

@ -4,7 +4,6 @@ import android.content.res.Configuration
import androidx.compose.animation.AnimatedVisibility import androidx.compose.animation.AnimatedVisibility
import androidx.compose.animation.fadeIn import androidx.compose.animation.fadeIn
import androidx.compose.animation.fadeOut import androidx.compose.animation.fadeOut
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
@ -40,10 +39,9 @@ import com.pixelized.rplexicon.ui.composable.FloatingActionButton
import com.pixelized.rplexicon.ui.composable.Loader import com.pixelized.rplexicon.ui.composable.Loader
import com.pixelized.rplexicon.ui.composable.error.HandleFetchError import com.pixelized.rplexicon.ui.composable.error.HandleFetchError
import com.pixelized.rplexicon.ui.navigation.LocalScreenNavHost import com.pixelized.rplexicon.ui.navigation.LocalScreenNavHost
import com.pixelized.rplexicon.ui.navigation.screens.navigateToSearch
import com.pixelized.rplexicon.ui.navigation.screens.navigateToLocationDetail import com.pixelized.rplexicon.ui.navigation.screens.navigateToLocationDetail
import com.pixelized.rplexicon.ui.navigation.screens.navigateToSearch
import com.pixelized.rplexicon.ui.theme.LexiconTheme import com.pixelized.rplexicon.ui.theme.LexiconTheme
import com.pixelized.rplexicon.utilitary.extentions.cell
import com.pixelized.rplexicon.utilitary.extentions.lexicon import com.pixelized.rplexicon.utilitary.extentions.lexicon
import com.pixelized.rplexicon.utilitary.extentions.scroll import com.pixelized.rplexicon.utilitary.extentions.scroll
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
@ -137,10 +135,8 @@ private fun LocationContent(
contentType = { "Location" }, contentType = { "Location" },
) { ) {
LocationItem( LocationItem(
modifier = Modifier
.clickable { onItem(it) }
.cell(),
item = it, item = it,
onItem = onItem,
) )
} }
} }
@ -191,7 +187,7 @@ private fun QuestListPreview() {
lazyColumnState = rememberLazyListState(), lazyColumnState = rememberLazyListState(),
refreshState = rememberPullRefreshState( refreshState = rememberPullRefreshState(
refreshing = false, refreshing = false,
onRefresh = {}, onRefresh = { },
), ),
refreshing = remember { mutableStateOf(false) }, refreshing = remember { mutableStateOf(false) },
items = remember { items = remember {
@ -200,8 +196,16 @@ private fun QuestListPreview() {
LocationGroupUio( LocationGroupUio(
category = null, category = null,
maps = listOf( maps = listOf(
LocationItemUio.preview(id = "0", title = "Daggerfall"), LocationItemUio.preview(
LocationItemUio.preview(id = "1", title = "Athkatla"), title = "Daggerfall",
),
LocationItemUio.preview(
title = "Athkatla",
),
LocationItemUio.preview(
title = "Vallaki",
isNew = true,
),
), ),
) )
), ),

View file

@ -1,9 +1,22 @@
package com.pixelized.rplexicon.ui.screens.quest.list package com.pixelized.rplexicon.ui.screens.quest.list
import android.content.res.Configuration import android.content.res.Configuration
import androidx.compose.animation.AnimatedVisibility
import androidx.compose.animation.fadeIn
import androidx.compose.animation.fadeOut
import androidx.compose.foundation.background
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.IntrinsicSize
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxHeight
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.heightIn
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.width
import androidx.compose.material3.MaterialTheme import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Surface import androidx.compose.material3.Surface
import androidx.compose.material3.Text import androidx.compose.material3.Text
@ -22,7 +35,6 @@ import androidx.compose.ui.unit.dp
import com.pixelized.rplexicon.ui.theme.LexiconTheme import com.pixelized.rplexicon.ui.theme.LexiconTheme
import com.pixelized.rplexicon.utilitary.LOS_FULL import com.pixelized.rplexicon.utilitary.LOS_FULL
import com.pixelized.rplexicon.utilitary.LOS_HOLLOW import com.pixelized.rplexicon.utilitary.LOS_HOLLOW
import com.pixelized.rplexicon.utilitary.extentions.cell
import com.pixelized.rplexicon.utilitary.extentions.lexicon import com.pixelized.rplexicon.utilitary.extentions.lexicon
import com.pixelized.rplexicon.utilitary.extentions.placeholder import com.pixelized.rplexicon.utilitary.extentions.placeholder
@ -44,16 +56,17 @@ data class QuestItemUio(
) { ) {
companion object { companion object {
fun preview( fun preview(
id: String = "La chasse aux loups",
title: String = "La chasse aux loups", title: String = "La chasse aux loups",
complete: Boolean = false, complete: Boolean = false,
placeHolder: Boolean = false, placeHolder: Boolean = false,
isNew: Boolean = false,
): QuestItemUio { ): QuestItemUio {
return QuestItemUio( return QuestItemUio(
id = id, id = title,
title = title, title = title,
complete = complete, complete = complete,
placeholder = placeHolder, placeholder = placeHolder,
isNew = isNew,
) )
} }
} }
@ -62,14 +75,22 @@ data class QuestItemUio(
@Composable @Composable
fun QuestItem( fun QuestItem(
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
padding: PaddingValues = PaddingValues(horizontal = 16.dp, vertical = 4.dp),
item: QuestItemUio, item: QuestItemUio,
onItem: (QuestItemUio) -> Unit,
) { ) {
val typography = MaterialTheme.lexicon.typography val typography = MaterialTheme.lexicon.typography
Box( Box(
modifier = modifier, modifier = Modifier
.clickable { item.let(onItem) }
.fillMaxWidth()
.heightIn(min = MaterialTheme.lexicon.dimens.item)
.height(intrinsicSize = IntrinsicSize.Min)
.then(other = modifier),
contentAlignment = Alignment.CenterStart, contentAlignment = Alignment.CenterStart,
) { ) {
Row( Row(
modifier = Modifier.padding(paddingValues = padding),
horizontalArrangement = Arrangement.spacedBy(8.dp), horizontalArrangement = Arrangement.spacedBy(8.dp),
) { ) {
val alignModifier = Modifier val alignModifier = Modifier
@ -104,6 +125,18 @@ fun QuestItem(
}, },
) )
} }
AnimatedVisibility(
visible = item.isNew,
enter = fadeIn(),
exit = fadeOut(),
) {
Box(
modifier = Modifier
.fillMaxHeight()
.width(width = 2.dp)
.background(color = MaterialTheme.colorScheme.primary)
)
}
} }
} }
@ -116,8 +149,8 @@ private fun QuestItemPreview(
LexiconTheme { LexiconTheme {
Surface { Surface {
QuestItem( QuestItem(
modifier = Modifier.cell(),
item = preview, item = preview,
onItem = { },
) )
} }
} }
@ -127,6 +160,7 @@ private class QuestItemPreviewProvider : PreviewParameterProvider<QuestItemUio>
override val values: Sequence<QuestItemUio> = sequenceOf( override val values: Sequence<QuestItemUio> = sequenceOf(
QuestItemUio.preview(complete = false, placeHolder = false), QuestItemUio.preview(complete = false, placeHolder = false),
QuestItemUio.preview(complete = true, placeHolder = false), QuestItemUio.preview(complete = true, placeHolder = false),
QuestItemUio.preview(complete = false, isNew = true),
QuestItemUio.preview(complete = true, placeHolder = true), QuestItemUio.preview(complete = true, placeHolder = true),
) )
} }

View file

@ -4,7 +4,6 @@ import android.content.res.Configuration
import androidx.compose.animation.AnimatedVisibility import androidx.compose.animation.AnimatedVisibility
import androidx.compose.animation.fadeIn import androidx.compose.animation.fadeIn
import androidx.compose.animation.fadeOut import androidx.compose.animation.fadeOut
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
@ -43,7 +42,6 @@ import com.pixelized.rplexicon.ui.navigation.LocalScreenNavHost
import com.pixelized.rplexicon.ui.navigation.screens.navigateToQuestDetail import com.pixelized.rplexicon.ui.navigation.screens.navigateToQuestDetail
import com.pixelized.rplexicon.ui.navigation.screens.navigateToSearch import com.pixelized.rplexicon.ui.navigation.screens.navigateToSearch
import com.pixelized.rplexicon.ui.theme.LexiconTheme import com.pixelized.rplexicon.ui.theme.LexiconTheme
import com.pixelized.rplexicon.utilitary.extentions.cell
import com.pixelized.rplexicon.utilitary.extentions.lexicon import com.pixelized.rplexicon.utilitary.extentions.lexicon
import com.pixelized.rplexicon.utilitary.extentions.scroll import com.pixelized.rplexicon.utilitary.extentions.scroll
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
@ -135,10 +133,8 @@ private fun QuestListContent(
contentType = { "Quest" }, contentType = { "Quest" },
) { ) {
QuestItem( QuestItem(
modifier = Modifier
.clickable { onItem(it) }
.cell(),
item = it, item = it,
onItem = onItem,
) )
} }
} }
@ -195,15 +191,25 @@ private fun QuestListPreview() {
items = remember { items = remember {
mutableStateOf( mutableStateOf(
listOf( listOf(
QuestGroupUio(
category = "La ville de Vallaki",
quests = listOf(
QuestItemUio.preview(
title = "Aider les réfugier",
),
QuestItemUio.preview(
title = "Invitation à diner",
isNew = true,
),
),
),
QuestGroupUio( QuestGroupUio(
category = "Faerûn", category = "Faerûn",
quests = listOf( quests = listOf(
QuestItemUio.preview( QuestItemUio.preview(
id = "La chasse aux loups",
title = "La chasse aux loups", title = "La chasse aux loups",
), ),
QuestItemUio.preview( QuestItemUio.preview(
id = "Les enfants de la caravanes",
title = "Les enfants de la caravanes", title = "Les enfants de la caravanes",
), ),
), ),

View file

@ -11,8 +11,6 @@ import androidx.compose.foundation.gestures.detectTransformGestures
import androidx.compose.foundation.interaction.MutableInteractionSource import androidx.compose.foundation.interaction.MutableInteractionSource
import androidx.compose.foundation.isSystemInDarkTheme import androidx.compose.foundation.isSystemInDarkTheme
import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.fillMaxHeight
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.heightIn
import androidx.compose.foundation.layout.offset import androidx.compose.foundation.layout.offset
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.width import androidx.compose.foundation.layout.width
@ -90,14 +88,6 @@ fun Modifier.zoomable() = composed {
} }
} }
@Stable
fun Modifier.cell() = composed {
this then Modifier
.fillMaxWidth()
.heightIn(min = MaterialTheme.lexicon.dimens.item)
.padding(horizontal = 16.dp, vertical = 4.dp)
}
@Stable @Stable
fun Modifier.scrollOffset( fun Modifier.scrollOffset(
scrollState: ScrollState, scrollState: ScrollState,