diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/composable/CategoryHeader.kt b/app/src/main/java/com/pixelized/rplexicon/ui/composable/CategoryHeader.kt new file mode 100644 index 0000000..790b0e3 --- /dev/null +++ b/app/src/main/java/com/pixelized/rplexicon/ui/composable/CategoryHeader.kt @@ -0,0 +1,54 @@ +package com.pixelized.rplexicon.ui.composable + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.Stable +import androidx.compose.runtime.remember +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Brush +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.dp + +@Composable +fun CategoryHeader( + modifier: Modifier = Modifier, + text: String, +) { + Column( + modifier = modifier, + verticalArrangement = Arrangement.spacedBy(space = 2.dp), + ) { + Text( + style = MaterialTheme.typography.labelSmall, + fontWeight = FontWeight.Light, + text = text, + ) + Box( + modifier = Modifier + .fillMaxWidth(0.5f) + .height(1.dp) + .background(brush = rememberHorizontalGradient()) + ) + } +} + +@Stable +@Composable +private fun rememberHorizontalGradient(): Brush { + val colorScheme = MaterialTheme.colorScheme + return remember { + Brush.horizontalGradient( + colors = listOf( + colorScheme.onSurface.copy(alpha = 1f), Color.Transparent, + ) + ) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/screens/lexicon/list/LexiconCategory.kt b/app/src/main/java/com/pixelized/rplexicon/ui/screens/lexicon/list/LexiconCategory.kt deleted file mode 100644 index 51ceadb..0000000 --- a/app/src/main/java/com/pixelized/rplexicon/ui/screens/lexicon/list/LexiconCategory.kt +++ /dev/null @@ -1,26 +0,0 @@ -package com.pixelized.rplexicon.ui.screens.lexicon.list - -import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.Text -import androidx.compose.runtime.Composable -import androidx.compose.runtime.Stable -import androidx.compose.ui.Modifier -import androidx.compose.ui.text.font.FontWeight - -@Stable -data class LexiconCategoryUio( - val title: String, -) - -@Composable -fun LexiconCategory( - modifier: Modifier = Modifier, - item: LexiconCategoryUio, -) { - Text( - modifier = modifier, - style = MaterialTheme.typography.labelSmall, - fontWeight = FontWeight.Light, - text = item.title, - ) -} \ No newline at end of file diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/screens/lexicon/list/LexiconGroupUio.kt b/app/src/main/java/com/pixelized/rplexicon/ui/screens/lexicon/list/LexiconGroupUio.kt deleted file mode 100644 index f60ef43..0000000 --- a/app/src/main/java/com/pixelized/rplexicon/ui/screens/lexicon/list/LexiconGroupUio.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.pixelized.rplexicon.ui.screens.lexicon.list - -import androidx.compose.runtime.Stable - -@Stable -class LexiconGroupUio( - val category: LexiconCategoryUio?, - val items: List, -) \ No newline at end of file diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/screens/lexicon/list/LexiconItem.kt b/app/src/main/java/com/pixelized/rplexicon/ui/screens/lexicon/list/LexiconItem.kt index 3e22d80..13fdba4 100644 --- a/app/src/main/java/com/pixelized/rplexicon/ui/screens/lexicon/list/LexiconItem.kt +++ b/app/src/main/java/com/pixelized/rplexicon/ui/screens/lexicon/list/LexiconItem.kt @@ -27,6 +27,13 @@ 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.placeholder +import java.util.UUID + +@Stable +class LexiconGroupUio( + val category: String?, + val items: List, +) @Stable data class LexiconItemUio( @@ -39,23 +46,14 @@ data class LexiconItemUio( val placeholder: Boolean = false, ) { companion object { - @Stable - fun preview( - id: String = "Brulkhai-1", - name: String = "Brulkhai", - diminutive: String? = null, - gender: String? = null, - race: String? = null, - isPlayingCharacter: Boolean = false, - placeholder: Boolean = false, - ) = LexiconItemUio( - id = id, - name = name, - diminutive = diminutive, - gender = gender, - race = race, - isPlayingCharacter = isPlayingCharacter, - placeholder = placeholder, + fun placeholder() = LexiconItemUio( + id = UUID.randomUUID().toString(), + name = "placeholder", + diminutive = null, + gender = null, + race = null, + isPlayingCharacter = false, + placeholder = true, ) } } @@ -77,8 +75,7 @@ fun LexiconItem( Text( modifier = Modifier .padding(end = 4.dp) - .alignByBaseline() - .placeholder { item.placeholder }, + .alignByBaseline(), style = typography.base.titleMedium, text = if (item.isPlayingCharacter) LOS_FULL else LOS_HOLLOW, ) @@ -166,19 +163,21 @@ private fun LexiconItemPreview( private class LexiconItemPreviewProvider : PreviewParameterProvider { override val values: Sequence = sequenceOf( - LexiconItemUio.preview( + LexiconItemUio( + id = "", name = "Mundas-Naltum-Brulkhai-Arauishi", diminutive = "Mun-Nalt-Bru-Arahi", - placeholder = false, + gender = "Femme", + race = "Demi-orc", isPlayingCharacter = true, ), - LexiconItemUio.preview( + LexiconItemUio( + id = "", name = "Brulkhai", diminutive = "Bru", - placeholder = false, - ), - LexiconItemUio.preview( - placeholder = true, + gender = "Femme", + race = "Demi-orc", ), + LexiconItemUio.placeholder(), ) } \ No newline at end of file diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/screens/lexicon/list/LexiconScreen.kt b/app/src/main/java/com/pixelized/rplexicon/ui/screens/lexicon/list/LexiconScreen.kt index 3a67842..105a17e 100644 --- a/app/src/main/java/com/pixelized/rplexicon/ui/screens/lexicon/list/LexiconScreen.kt +++ b/app/src/main/java/com/pixelized/rplexicon/ui/screens/lexicon/list/LexiconScreen.kt @@ -37,13 +37,13 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel import com.pixelized.rplexicon.R +import com.pixelized.rplexicon.ui.composable.CategoryHeader import com.pixelized.rplexicon.ui.composable.FloatingActionButton import com.pixelized.rplexicon.ui.composable.Loader import com.pixelized.rplexicon.ui.composable.error.HandleFetchError import com.pixelized.rplexicon.ui.navigation.LocalScreenNavHost import com.pixelized.rplexicon.ui.navigation.screens.navigateToLexiconDetail import com.pixelized.rplexicon.ui.navigation.screens.navigateToLexiconSearch -import com.pixelized.rplexicon.ui.screens.quest.list.QuestCategory import com.pixelized.rplexicon.ui.theme.LexiconTheme import com.pixelized.rplexicon.utilitary.extentions.cell import com.pixelized.rplexicon.utilitary.extentions.lexicon @@ -56,9 +56,8 @@ fun LexiconScreen( viewModel: LexiconViewModel = hiltViewModel(), lazyListState: LazyListState, ) { - val scope = rememberCoroutineScope() val screen = LocalScreenNavHost.current - + val scope = rememberCoroutineScope() val refresh = rememberPullRefreshState( refreshing = false, onRefresh = { @@ -67,7 +66,6 @@ fun LexiconScreen( } }, ) - val isFabExpended = remember { derivedStateOf { lazyListState.canScrollForward.not() && viewModel.items.value.isNotEmpty() @@ -126,7 +124,7 @@ private fun LexiconScreenContent( items(count = 16) { LexiconItem( modifier = Modifier.cell(), - item = LexiconItemUio.preview(placeholder = true), + item = LexiconItemUio.placeholder(), ) } } @@ -143,11 +141,11 @@ private fun LexiconScreenContent( item( contentType = { "Header" }, ) { - LexiconCategory( + CategoryHeader( modifier = Modifier .padding(top = if (index == 0) 0.dp else 16.dp) .padding(horizontal = 16.dp), - item = it, + text = it, ) } } @@ -218,24 +216,7 @@ private fun LexiconScreenContentPreview() { ), refreshing = remember { mutableStateOf(false) }, isFabExpended = remember { mutableStateOf(true) }, - items = remember { - mutableStateOf( - listOf( - LexiconGroupUio( - category = null, - items = listOf( - LexiconItemUio( - id = "Brulkhai-1", - name = "Brulkhai", - diminutive = "Bru", - gender = "Female", - race = "Half-orc", - ) - ), - ), - ) - ) - }, + items = rememberLexiconGroupStatePreview(), onSearch = { }, onItem = { }, ) diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/screens/lexicon/list/LexiconViewModel.kt b/app/src/main/java/com/pixelized/rplexicon/ui/screens/lexicon/list/LexiconViewModel.kt index d1a7547..27c0822 100644 --- a/app/src/main/java/com/pixelized/rplexicon/ui/screens/lexicon/list/LexiconViewModel.kt +++ b/app/src/main/java/com/pixelized/rplexicon/ui/screens/lexicon/list/LexiconViewModel.kt @@ -52,10 +52,8 @@ class LexiconViewModel @Inject constructor( .sortedBy { it.name } .groupBy( keySelector = { - LexiconCategoryUio( - title = it.category - ?: context.getString(R.string.default_category_other) - ) + it.category + ?: context.getString(R.string.default_category_other) }, valueTransform = { item -> LexiconItemUio( @@ -74,7 +72,7 @@ class LexiconViewModel @Inject constructor( items = item.value, ) } - .sortedBy { orderRepository.findLexiconOrder(quest = it.category?.title) } + .sortedBy { orderRepository.findLexiconOrder(quest = it.category) } } } launch { diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/screens/lexicon/list/rememberLexiconGroupStatePreview.kt b/app/src/main/java/com/pixelized/rplexicon/ui/screens/lexicon/list/rememberLexiconGroupStatePreview.kt new file mode 100644 index 0000000..4bcd420 --- /dev/null +++ b/app/src/main/java/com/pixelized/rplexicon/ui/screens/lexicon/list/rememberLexiconGroupStatePreview.kt @@ -0,0 +1,82 @@ +package com.pixelized.rplexicon.ui.screens.lexicon.list + +import androidx.compose.runtime.Composable +import androidx.compose.runtime.Stable +import androidx.compose.runtime.State +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember + +@Composable +@Stable +fun rememberLexiconGroupStatePreview(): State> { + return remember { + mutableStateOf( + listOf( + LexiconGroupUio( + category = "Personnage joueur", + items = listOf( + LexiconItemUio( + id = "Brulkhai-1", + name = "Brulkhai", + diminutive = "Bru", + gender = "Femme", + race = "Demi-orc", + ), + LexiconItemUio( + id = "Léandre-1", + name = "Léandre", + diminutive = null, + gender = "Homme", + race = "Humain", + ), + LexiconItemUio( + id = "Nelia-1", + name = "Nelia", + diminutive = "Nel", + gender = "Femme", + race = "Elfe", + ), + LexiconItemUio( + id = "Tigrane-1", + name = "Tigrane", + diminutive = null, + gender = "Homme", + race = "Tieffelin", + ), + LexiconItemUio( + id = "Unathana-1", + name = "Unathana", + diminutive = "Una", + gender = "Femme", + race = "Demi-elfe", + ), + ), + ), + LexiconGroupUio( + category = "Argynvosthold", + items = listOf( + LexiconItemUio( + id = "Godfrey Gwylin-1", + name = "Godfrey Gwylin", + diminutive = null, + gender = "Homme", + race = "Inconnu", + ), + ), + ), + LexiconGroupUio( + category = "Vallakiens", + items = listOf( + LexiconItemUio( + id = "Godfrey Gwylin-1", + name = "Godfrey Gwylin", + diminutive = null, + gender = "Homme", + race = "Inconnu", + ), + ), + ), + ) + ) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/screens/location/list/LocationCategory.kt b/app/src/main/java/com/pixelized/rplexicon/ui/screens/location/list/LocationCategory.kt deleted file mode 100644 index 3224e29..0000000 --- a/app/src/main/java/com/pixelized/rplexicon/ui/screens/location/list/LocationCategory.kt +++ /dev/null @@ -1,26 +0,0 @@ -package com.pixelized.rplexicon.ui.screens.location.list - -import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.Text -import androidx.compose.runtime.Composable -import androidx.compose.runtime.Stable -import androidx.compose.ui.Modifier -import androidx.compose.ui.text.font.FontWeight - -@Stable -data class LocationCategoryUio( - val title: String, -) - -@Composable -fun LocationCategory( - modifier: Modifier = Modifier, - item: LocationCategoryUio, -) { - Text( - modifier = modifier, - style = MaterialTheme.typography.labelSmall, - fontWeight = FontWeight.Light, - text = item.title, - ) -} \ No newline at end of file diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/screens/location/list/LocationGroupUio.kt b/app/src/main/java/com/pixelized/rplexicon/ui/screens/location/list/LocationGroupUio.kt deleted file mode 100644 index 5eee568..0000000 --- a/app/src/main/java/com/pixelized/rplexicon/ui/screens/location/list/LocationGroupUio.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.pixelized.rplexicon.ui.screens.location.list - -import androidx.compose.runtime.Stable - -@Stable -data class LocationGroupUio( - val category: LocationCategoryUio?, - val maps: List, -) \ No newline at end of file diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/screens/location/list/LocationItem.kt b/app/src/main/java/com/pixelized/rplexicon/ui/screens/location/list/LocationItem.kt index 268dd1f..9cc65e8 100644 --- a/app/src/main/java/com/pixelized/rplexicon/ui/screens/location/list/LocationItem.kt +++ b/app/src/main/java/com/pixelized/rplexicon/ui/screens/location/list/LocationItem.kt @@ -26,6 +26,12 @@ import com.pixelized.rplexicon.utilitary.extentions.cell import com.pixelized.rplexicon.utilitary.extentions.lexicon import com.pixelized.rplexicon.utilitary.extentions.placeholder +@Stable +data class LocationGroupUio( + val category: String?, + val maps: List, +) + @Stable data class LocationItemUio( val id: String, diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/screens/location/list/LocationScreen.kt b/app/src/main/java/com/pixelized/rplexicon/ui/screens/location/list/LocationScreen.kt index 5efea5d..04b2930 100644 --- a/app/src/main/java/com/pixelized/rplexicon/ui/screens/location/list/LocationScreen.kt +++ b/app/src/main/java/com/pixelized/rplexicon/ui/screens/location/list/LocationScreen.kt @@ -26,6 +26,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel +import com.pixelized.rplexicon.ui.composable.CategoryHeader import com.pixelized.rplexicon.ui.composable.Loader import com.pixelized.rplexicon.ui.composable.error.HandleFetchError import com.pixelized.rplexicon.ui.navigation.LocalScreenNavHost @@ -118,11 +119,11 @@ private fun LocationContent( item( contentType = { "Header" }, ) { - LocationCategory( + CategoryHeader( modifier = Modifier .padding(top = if (index == 0) 0.dp else 16.dp) .padding(horizontal = 16.dp), - item = it, + text = it, ) } } diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/screens/location/list/LocationViewModel.kt b/app/src/main/java/com/pixelized/rplexicon/ui/screens/location/list/LocationViewModel.kt index 00693e5..e7afd5b 100644 --- a/app/src/main/java/com/pixelized/rplexicon/ui/screens/location/list/LocationViewModel.kt +++ b/app/src/main/java/com/pixelized/rplexicon/ui/screens/location/list/LocationViewModel.kt @@ -50,10 +50,8 @@ class LocationViewModel @Inject constructor( .sortedBy { it.name } .groupBy( keySelector = { entry -> - LocationCategoryUio( - title = entry.category - ?: context.getString(R.string.default_category_other) - ) + entry.category + ?: context.getString(R.string.default_category_other) }, valueTransform = { entry -> LocationItemUio( @@ -69,7 +67,7 @@ class LocationViewModel @Inject constructor( ) } .sortedBy { item -> - item.category?.title?.let { + item.category?.let { orderRepository.findMapOrder(quest = it) } } diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/screens/quest/list/QuestCategory.kt b/app/src/main/java/com/pixelized/rplexicon/ui/screens/quest/list/QuestCategory.kt deleted file mode 100644 index b9d4d09..0000000 --- a/app/src/main/java/com/pixelized/rplexicon/ui/screens/quest/list/QuestCategory.kt +++ /dev/null @@ -1,26 +0,0 @@ -package com.pixelized.rplexicon.ui.screens.quest.list - -import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.Text -import androidx.compose.runtime.Composable -import androidx.compose.runtime.Stable -import androidx.compose.ui.Modifier -import androidx.compose.ui.text.font.FontWeight - -@Stable -data class QuestCategoryUio( - val title: String, -) - -@Composable -fun QuestCategory( - modifier: Modifier = Modifier, - item: QuestCategoryUio, -) { - Text( - modifier = modifier, - style = MaterialTheme.typography.labelSmall, - fontWeight = FontWeight.Light, - text = item.title, - ) -} \ No newline at end of file diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/screens/quest/list/QuestGroupUio.kt b/app/src/main/java/com/pixelized/rplexicon/ui/screens/quest/list/QuestGroupUio.kt deleted file mode 100644 index 37cb01c..0000000 --- a/app/src/main/java/com/pixelized/rplexicon/ui/screens/quest/list/QuestGroupUio.kt +++ /dev/null @@ -1,11 +0,0 @@ -package com.pixelized.rplexicon.ui.screens.quest.list - -import androidx.compose.runtime.Stable - -@Stable -data class QuestGroupUio( - val category: QuestCategoryUio, - val quests: List, -) { - val complete = quests.all { it.complete } -} \ No newline at end of file diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/screens/quest/list/QuestItem.kt b/app/src/main/java/com/pixelized/rplexicon/ui/screens/quest/list/QuestItem.kt index a41349b..b362c61 100644 --- a/app/src/main/java/com/pixelized/rplexicon/ui/screens/quest/list/QuestItem.kt +++ b/app/src/main/java/com/pixelized/rplexicon/ui/screens/quest/list/QuestItem.kt @@ -26,6 +26,14 @@ import com.pixelized.rplexicon.utilitary.extentions.cell import com.pixelized.rplexicon.utilitary.extentions.lexicon import com.pixelized.rplexicon.utilitary.extentions.placeholder +@Stable +data class QuestGroupUio( + val category: String, + val quests: List, +) { + val complete = quests.all { it.complete } +} + @Stable data class QuestItemUio( val id: String, diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/screens/quest/list/QuestListScreen.kt b/app/src/main/java/com/pixelized/rplexicon/ui/screens/quest/list/QuestListScreen.kt index 578c625..ea5bce2 100644 --- a/app/src/main/java/com/pixelized/rplexicon/ui/screens/quest/list/QuestListScreen.kt +++ b/app/src/main/java/com/pixelized/rplexicon/ui/screens/quest/list/QuestListScreen.kt @@ -26,6 +26,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel +import com.pixelized.rplexicon.ui.composable.CategoryHeader import com.pixelized.rplexicon.ui.composable.Loader import com.pixelized.rplexicon.ui.composable.error.HandleFetchError import com.pixelized.rplexicon.ui.navigation.LocalScreenNavHost @@ -117,11 +118,11 @@ private fun QuestListContent( item( contentType = { "Header" }, ) { - QuestCategory( + CategoryHeader( modifier = Modifier .padding(top = if (index == 0) 0.dp else 16.dp) .padding(horizontal = 16.dp), - item = entry.category, + text = entry.category, ) } items( @@ -167,9 +168,7 @@ private fun QuestListPreview() { mutableStateOf( listOf( QuestGroupUio( - category = QuestCategoryUio( - title = "Faerûn", - ), + category = "Faerûn", quests = listOf( QuestItemUio.preview( id = "La chasse aux loups", diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/screens/quest/list/QuestListViewModel.kt b/app/src/main/java/com/pixelized/rplexicon/ui/screens/quest/list/QuestListViewModel.kt index 2b46e94..6061f58 100644 --- a/app/src/main/java/com/pixelized/rplexicon/ui/screens/quest/list/QuestListViewModel.kt +++ b/app/src/main/java/com/pixelized/rplexicon/ui/screens/quest/list/QuestListViewModel.kt @@ -51,10 +51,8 @@ class QuestListViewModel @Inject constructor( .sortedBy { it.complete } .groupBy( keySelector = { - QuestCategoryUio( - title = it.category - ?: context.getString(R.string.default_category_other), - ) + it.category + ?: context.getString(R.string.default_category_other) }, valueTransform = { item -> QuestItemUio( @@ -65,7 +63,7 @@ class QuestListViewModel @Inject constructor( }, ) .map { QuestGroupUio(category = it.key, quests = it.value) } - .sortedBy { order.findQuestOrder(quest = it.category.title) } + .sortedBy { order.findQuestOrder(quest = it.category) } .sortedBy { it.complete } .toList()