From 5ccc5dc8825dc9188d34c97b21bad5de3c4a5792 Mon Sep 17 00:00:00 2001 From: "Andres Gomez, Thomas (ITDV CC) - AF (ext)" Date: Wed, 19 Jul 2023 17:58:23 +0200 Subject: [PATCH] Advenced search layout. --- app/src/main/ic_launcher-playstore.png | Bin 0 -> 31940 bytes .../com/pixelized/rplexicon/model/Lexicon.kt | 9 +- .../ui/composable/ScrollingKeyboardHanlder.kt | 18 ++ .../screens/ComposableCharacterDetail.kt | 71 ++++- .../screens/detail/CharacterDetailScreen.kt | 106 ++++++- .../detail/CharacterDetailViewModel.kt | 54 ++-- .../ui/screens/lexicon/LexiconItem.kt | 7 +- .../ui/screens/lexicon/LexiconScreen.kt | 15 +- .../rplexicon/ui/screens/search/SearchItem.kt | 274 ++++++++++++++++++ .../ui/screens/search/SearchScreen.kt | 45 ++- .../ui/screens/search/SearchViewModel.kt | 93 +++--- .../com/pixelized/rplexicon/ui/theme/Theme.kt | 6 +- .../rplexicon/ui/theme/dimen/LexiconDimens.kt | 18 ++ .../composable/StringResource+Gender.kt | 27 ++ .../composable/StringResource+Race.kt | 30 ++ .../rplexicon/utilitary/extentions/RegexEx.kt | 46 +++ .../utilitary/extentions/StringEt.kt | 3 - .../utilitary/extentions/StringEx.kt | 17 ++ .../drawable/ic_dungeons_and_dragons_48dp.xml | 18 ++ .../res/drawable/ic_launcher_foreground.xml | 47 ++- .../ic_launcher.xml | 5 +- .../ic_launcher_round.xml | 5 +- app/src/main/res/mipmap-hdpi/ic_launcher.webp | Bin 1404 -> 1734 bytes .../res/mipmap-hdpi/ic_launcher_round.webp | Bin 2898 -> 3292 bytes app/src/main/res/mipmap-mdpi/ic_launcher.webp | Bin 982 -> 1024 bytes .../res/mipmap-mdpi/ic_launcher_round.webp | Bin 1772 -> 2028 bytes .../main/res/mipmap-xhdpi/ic_launcher.webp | Bin 1900 -> 2424 bytes .../res/mipmap-xhdpi/ic_launcher_round.webp | Bin 3918 -> 4544 bytes .../main/res/mipmap-xxhdpi/ic_launcher.webp | Bin 2884 -> 3748 bytes .../res/mipmap-xxhdpi/ic_launcher_round.webp | Bin 5914 -> 7074 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.webp | Bin 3844 -> 5322 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.webp | Bin 7778 -> 9650 bytes app/src/main/res/values-fr/strings.xml | 2 + .../res/values/ic_launcher_background.xml | 4 + app/src/main/res/values/strings.xml | 2 + 35 files changed, 759 insertions(+), 163 deletions(-) create mode 100644 app/src/main/ic_launcher-playstore.png create mode 100644 app/src/main/java/com/pixelized/rplexicon/ui/composable/ScrollingKeyboardHanlder.kt create mode 100644 app/src/main/java/com/pixelized/rplexicon/ui/screens/search/SearchItem.kt create mode 100644 app/src/main/java/com/pixelized/rplexicon/ui/theme/dimen/LexiconDimens.kt create mode 100644 app/src/main/java/com/pixelized/rplexicon/utilitary/composable/StringResource+Gender.kt create mode 100644 app/src/main/java/com/pixelized/rplexicon/utilitary/composable/StringResource+Race.kt create mode 100644 app/src/main/java/com/pixelized/rplexicon/utilitary/extentions/RegexEx.kt delete mode 100644 app/src/main/java/com/pixelized/rplexicon/utilitary/extentions/StringEt.kt create mode 100644 app/src/main/java/com/pixelized/rplexicon/utilitary/extentions/StringEx.kt create mode 100644 app/src/main/res/drawable/ic_dungeons_and_dragons_48dp.xml rename app/src/main/res/{mipmap-anydpi => mipmap-anydpi-v26}/ic_launcher.xml (56%) rename app/src/main/res/{mipmap-anydpi => mipmap-anydpi-v26}/ic_launcher_round.xml (56%) create mode 100644 app/src/main/res/values/ic_launcher_background.xml diff --git a/app/src/main/ic_launcher-playstore.png b/app/src/main/ic_launcher-playstore.png new file mode 100644 index 0000000000000000000000000000000000000000..8e25798f9fc6fb1306af2bfcad72801eeaf91991 GIT binary patch literal 31940 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 literal 0 HcmV?d00001 diff --git a/app/src/main/java/com/pixelized/rplexicon/model/Lexicon.kt b/app/src/main/java/com/pixelized/rplexicon/model/Lexicon.kt index 55cf2fe..2cf6423 100644 --- a/app/src/main/java/com/pixelized/rplexicon/model/Lexicon.kt +++ b/app/src/main/java/com/pixelized/rplexicon/model/Lexicon.kt @@ -1,7 +1,9 @@ package com.pixelized.rplexicon.model import android.net.Uri +import androidx.compose.runtime.Stable +@Stable data class Lexicon( val id: Int, val name: String, @@ -12,12 +14,15 @@ data class Lexicon( val description: String?, val history: String?, ) { + + @Stable enum class Gender { MALE, FEMALE, - UNDETERMINED + UNDETERMINED, } + @Stable enum class Race { ELF, HALFLING, @@ -32,6 +37,6 @@ data class Lexicon( GENASI, DEEP_GNOME, GOLIATH, - UNDETERMINED + UNDETERMINED, } } \ No newline at end of file diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/composable/ScrollingKeyboardHanlder.kt b/app/src/main/java/com/pixelized/rplexicon/ui/composable/ScrollingKeyboardHanlder.kt new file mode 100644 index 0000000..2b0c612 --- /dev/null +++ b/app/src/main/java/com/pixelized/rplexicon/ui/composable/ScrollingKeyboardHanlder.kt @@ -0,0 +1,18 @@ +package com.pixelized.rplexicon.ui.composable + +import androidx.compose.foundation.lazy.LazyListState +import androidx.compose.runtime.Composable +import androidx.compose.ui.ExperimentalComposeUiApi +import androidx.compose.ui.platform.LocalSoftwareKeyboardController + +@OptIn(ExperimentalComposeUiApi::class) +@Composable +fun ScrollingKeyboardHandler( + lazyListState: LazyListState +) { + val keyboard = LocalSoftwareKeyboardController.current + + if (lazyListState.isScrollInProgress) { + keyboard?.hide() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/navigation/screens/ComposableCharacterDetail.kt b/app/src/main/java/com/pixelized/rplexicon/ui/navigation/screens/ComposableCharacterDetail.kt index 840f5a6..d31e236 100644 --- a/app/src/main/java/com/pixelized/rplexicon/ui/navigation/screens/ComposableCharacterDetail.kt +++ b/app/src/main/java/com/pixelized/rplexicon/ui/navigation/screens/ComposableCharacterDetail.kt @@ -8,6 +8,7 @@ import androidx.navigation.NavHostController import androidx.navigation.NavOptionsBuilder import androidx.navigation.NavType import androidx.navigation.navArgument +import com.pixelized.rplexicon.model.Lexicon import com.pixelized.rplexicon.ui.navigation.NavigationAnimation import com.pixelized.rplexicon.ui.navigation.animatedComposable import com.pixelized.rplexicon.ui.screens.detail.CharacterDetailScreen @@ -15,17 +16,53 @@ import com.pixelized.rplexicon.utilitary.extentions.ARG private const val ROUTE = "CharacterDetail" private const val ARG_ID = "id" -val CHARACTER_DETAIL_ROUTE = "$ROUTE?${ARG_ID.ARG}" +private const val ARG_HIGHLIGHT = "highlight" +private const val ARG_RACE = "race" +private const val ARG_HIGHLIGHT_RACE = "highlightRace" +private const val ARG_GENDER = "gender" +private const val ARG_HIGHLIGHT_GENDER = "highlightGender" + +//CharacterDetail +// ?id=0 +// &highlight=null +// &race=false +// &highlightRace=UNDETERMINED +// &gender=false +// &highlightGender=UNDETERMINED + + +val CHARACTER_DETAIL_ROUTE = ROUTE + + "?${ARG_ID.ARG}" + + "&${ARG_HIGHLIGHT.ARG}" + + "&${ARG_RACE.ARG}" + + "&${ARG_HIGHLIGHT_RACE.ARG}" + + "&${ARG_GENDER.ARG}" + + "&${ARG_HIGHLIGHT_GENDER.ARG}" @Stable @Immutable data class CharacterDetailArgument( val id: Int, + val highlight: String?, + val race: Lexicon.Race, + val highlightRace: Boolean, + val gender: Lexicon.Gender, + val highlightGender: Boolean, ) val SavedStateHandle.characterDetailArgument: CharacterDetailArgument get() = CharacterDetailArgument( - id = get(ARG_ID) ?: error("CharacterDetailArgument argument: id") + id = get(ARG_ID) + ?: error("CharacterDetailArgument argument: $ARG_ID"), + race = get(ARG_RACE) + ?: error("CharacterDetailArgument argument: $ARG_RACE"), + highlightRace = get(ARG_HIGHLIGHT_RACE) + ?: error("CharacterDetailArgument argument: $ARG_HIGHLIGHT_RACE"), + gender = get(ARG_GENDER) + ?: error("CharacterDetailArgument argument: $ARG_GENDER"), + highlightGender = get(ARG_HIGHLIGHT_GENDER) + ?: error("CharacterDetailArgument argument: $ARG_HIGHLIGHT_GENDER"), + highlight = get(ARG_HIGHLIGHT), ) fun NavGraphBuilder.composableCharacterDetail() { @@ -34,7 +71,23 @@ fun NavGraphBuilder.composableCharacterDetail() { arguments = listOf( navArgument(name = ARG_ID) { type = NavType.IntType - } + }, + navArgument(name = ARG_HIGHLIGHT) { + type = NavType.StringType + nullable = true + }, + navArgument(name = ARG_RACE) { + type = NavType.EnumType(Lexicon.Race::class.java) + }, + navArgument(name = ARG_HIGHLIGHT_RACE) { + type = NavType.BoolType + }, + navArgument(name = ARG_GENDER) { + type = NavType.EnumType(Lexicon.Gender::class.java) + }, + navArgument(name = ARG_HIGHLIGHT_GENDER) { + type = NavType.BoolType + }, ), animation = NavigationAnimation.Push, ) { @@ -44,8 +97,18 @@ fun NavGraphBuilder.composableCharacterDetail() { fun NavHostController.navigateToCharacterDetail( id: Int, + highlight: String? = null, + race: Lexicon.Race? = null, + gender: Lexicon.Gender? = null, option: NavOptionsBuilder.() -> Unit = {}, ) { - val route = "$ROUTE?$ARG_ID=$id" + val route = ROUTE + + "?$ARG_ID=$id" + + "&$ARG_HIGHLIGHT=$highlight" + + "&$ARG_RACE=${race ?: Lexicon.Race.UNDETERMINED}" + + "&$ARG_HIGHLIGHT_RACE=${race != null}" + + "&$ARG_GENDER=${gender ?: Lexicon.Gender.UNDETERMINED}" + + "&$ARG_HIGHLIGHT_GENDER=${gender != null}" + navigate(route = route, builder = option) } \ No newline at end of file diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/screens/detail/CharacterDetailScreen.kt b/app/src/main/java/com/pixelized/rplexicon/ui/screens/detail/CharacterDetailScreen.kt index 8952d21..f9f7465 100644 --- a/app/src/main/java/com/pixelized/rplexicon/ui/screens/detail/CharacterDetailScreen.kt +++ b/app/src/main/java/com/pixelized/rplexicon/ui/screens/detail/CharacterDetailScreen.kt @@ -3,7 +3,6 @@ package com.pixelized.rplexicon.ui.screens.detail import android.content.res.Configuration.UI_MODE_NIGHT_NO import android.content.res.Configuration.UI_MODE_NIGHT_YES import android.net.Uri -import androidx.annotation.StringRes import androidx.compose.foundation.ScrollState import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement @@ -51,14 +50,23 @@ import androidx.compose.ui.platform.LocalConfiguration import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.AnnotatedString +import androidx.compose.ui.text.SpanStyle import androidx.compose.ui.text.font.FontStyle import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel import com.pixelized.rplexicon.R +import com.pixelized.rplexicon.model.Lexicon import com.pixelized.rplexicon.ui.navigation.LocalScreenNavHost import com.pixelized.rplexicon.ui.theme.LexiconTheme +import com.pixelized.rplexicon.utilitary.composable.stringResource +import com.pixelized.rplexicon.utilitary.extentions.annotatedSpan +import com.pixelized.rplexicon.utilitary.extentions.annotatedString +import com.pixelized.rplexicon.utilitary.extentions.finderRegex +import com.pixelized.rplexicon.utilitary.extentions.foldAll +import com.pixelized.rplexicon.utilitary.extentions.highlightRegex import com.pixelized.rplexicon.utilitary.rememberLoadingTransition import com.skydoves.landscapist.ImageOptions import com.skydoves.landscapist.glide.GlideImage @@ -66,15 +74,79 @@ import com.skydoves.landscapist.glide.GlideImageState @Stable data class CharacterDetailUio( - val name: String?, + val name: String, val diminutive: String?, - @StringRes val gender: Int, - @StringRes val race: Int, + val gender: Lexicon.Gender, + val race: Lexicon.Race, val portrait: List, val description: String?, val history: String?, + val search: String?, + val highlightGender: Boolean?, + val highlightRace: Boolean?, ) +@Stable +data class AnnotatedCharacterDetailUio( + val name: AnnotatedString, + val diminutive: AnnotatedString?, + val gender: AnnotatedString, + val race: AnnotatedString, + val portrait: List, + val description: AnnotatedString?, + val history: AnnotatedString?, +) + +@Composable +@Stable +fun CharacterDetailUio.annotated(): AnnotatedCharacterDetailUio { + val colorScheme = MaterialTheme.colorScheme + val highlight = remember { SpanStyle(color = colorScheme.primary) } + val highlightRegex = remember(search) { search.highlightRegex } + val finderRegex = remember(search) { search.finderRegex } + val gender = stringResource(id = gender, short = true) + val race = stringResource(id = race) + + return AnnotatedCharacterDetailUio( + name = AnnotatedString( + text = name, + spanStyles = highlightRegex?.annotatedSpan( + input = name, + spanStyle = highlight, + ) ?: emptyList() + ), + diminutive = highlightRegex?.annotatedString( + input = diminutive ?: "", + spanStyle = highlight + ), + gender = gender.let { + AnnotatedString( + text = it, + spanStyles = when (highlightGender) { + true -> listOf(AnnotatedString.Range(highlight, 0, it.length)) + else -> emptyList() + } + ) + }, + race = race.let { + AnnotatedString( + text = it, + spanStyles = when (highlightRace) { + true -> listOf(AnnotatedString.Range(highlight, 0, it.length)) + else -> emptyList() + } + ) + }, + description = finderRegex?.foldAll(description)?.let { description -> + highlightRegex?.annotatedString(description, spanStyle = highlight) + }, + history = finderRegex?.foldAll(history)?.let { history -> + highlightRegex?.annotatedString(history, spanStyle = highlight) + }, + portrait = portrait, + ) +} + @Composable fun CharacterDetailScreen( viewModel: CharacterDetailViewModel = hiltViewModel(), @@ -100,6 +172,7 @@ private fun CharacterDetailScreenContent( ) { val colorScheme = MaterialTheme.colorScheme val typography = MaterialTheme.typography + val annotatedItem = item.value.annotated() Scaffold( modifier = modifier, @@ -123,7 +196,7 @@ private fun CharacterDetailScreenContent( Box( modifier = Modifier.padding(paddingValues = paddingValues), ) { - item.value.portrait.firstOrNull()?.let { uri -> + annotatedItem.portrait.firstOrNull()?.let { uri -> Box( modifier = Modifier .fillMaxWidth() @@ -169,14 +242,14 @@ private fun CharacterDetailScreenContent( modifier = Modifier.padding(horizontal = 16.dp), horizontalArrangement = Arrangement.spacedBy(4.dp) ) { - item.value.name?.let { + annotatedItem.name.let { Text( modifier = Modifier.alignByBaseline(), style = typography.headlineSmall, text = it, ) } - item.value.diminutive?.let { + annotatedItem.diminutive?.let { Text( modifier = Modifier.alignByBaseline(), style = remember { typography.labelMedium.copy(fontStyle = FontStyle.Italic) }, @@ -190,14 +263,14 @@ private fun CharacterDetailScreenContent( ) { Text( style = remember { typography.labelMedium.copy(fontStyle = FontStyle.Italic) }, - text = stringResource(id = item.value.gender), + text = annotatedItem.gender, ) Text( style = remember { typography.labelMedium.copy(fontStyle = FontStyle.Italic) }, - text = stringResource(id = item.value.race), + text = annotatedItem.race, ) } - item.value.description?.let { + annotatedItem.description?.let { Text( modifier = Modifier.padding(start = 16.dp, top = 24.dp, end = 16.dp), style = typography.titleMedium, @@ -216,7 +289,7 @@ private fun CharacterDetailScreenContent( text = it, ) } - item.value.history?.let { + annotatedItem.history?.let { Text( modifier = Modifier.padding(start = 16.dp, top = 24.dp, end = 16.dp), style = typography.titleMedium, @@ -228,7 +301,7 @@ private fun CharacterDetailScreenContent( text = it, ) } - if (item.value.portrait.isNotEmpty()) { + if (annotatedItem.portrait.isNotEmpty()) { val configuration = LocalConfiguration.current val maxSize = remember { (configuration.screenWidthDp.dp - 16.dp * 2) } Text( @@ -240,7 +313,7 @@ private fun CharacterDetailScreenContent( contentPadding = PaddingValues(horizontal = 16.dp), horizontalArrangement = Arrangement.spacedBy(8.dp) ) { - items(items = item.value.portrait) { + items(items = annotatedItem.portrait) { val transition = rememberLoadingTransition { it } GlideImage( modifier = Modifier @@ -298,13 +371,16 @@ private fun CharacterDetailScreenContentPreview() { CharacterDetailUio( name = "Brulkhai", diminutive = "./ Bru", - gender = R.string.gender_female, - race = R.string.race_half_orc, + gender = Lexicon.Gender.FEMALE, + race = Lexicon.Race.HALF_ORC, portrait = listOf( Uri.parse("https://cdnb.artstation.com/p/assets/images/images/003/024/889/large/bayard-wu-0716.jpg?1468642855"), ), description = "Brulkhai, ou plus simplement Bru, est solidement bâti. Elle mesure 192 cm pour 110 kg de muscles lorsqu’elle est en bonne santé. Elle a les cheveux châtains, les yeux noisettes et la peau couleur gris-vert typique de son espèce. D’un tempérament taciturne, elle parle peu et de façon concise. Elle est parfois brutale, aussi bien physiquement que verbalement, Elle ne prend cependant aucun plaisir à malmener ceux qu’elle considère plus faibles qu’elle. D’une nature simple et honnête, elle ne mâche pas ses mots et ne dissimule généralement pas ses pensées. Son intelligence modeste est plus le reflet d’un manque d’éducation et d’une capacité limitée à gérer ses émotions qu’à une débilité congénitale. Elle voue à la force un culte car c’est par son expression qu’elle se sent vraiment vivante et éprouve de grandes difficultés vis à vis de ceux qu’elle nomme foshnu (bébé, chouineur en commun).", history = null, + search = "Bru", + highlightGender = true, + highlightRace = true, ) ) } diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/screens/detail/CharacterDetailViewModel.kt b/app/src/main/java/com/pixelized/rplexicon/ui/screens/detail/CharacterDetailViewModel.kt index 0547e45..9d017b7 100644 --- a/app/src/main/java/com/pixelized/rplexicon/ui/screens/detail/CharacterDetailViewModel.kt +++ b/app/src/main/java/com/pixelized/rplexicon/ui/screens/detail/CharacterDetailViewModel.kt @@ -4,8 +4,6 @@ import androidx.compose.runtime.State import androidx.compose.runtime.mutableStateOf import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.ViewModel -import com.pixelized.rplexicon.R -import com.pixelized.rplexicon.model.Lexicon import com.pixelized.rplexicon.repository.LexiconRepository import com.pixelized.rplexicon.ui.navigation.screens.characterDetailArgument import dagger.hilt.android.lifecycle.HiltViewModel @@ -13,40 +11,28 @@ import javax.inject.Inject @HiltViewModel class CharacterDetailViewModel @Inject constructor( - private val savedStateHandle: SavedStateHandle, - private val repository: LexiconRepository, + savedStateHandle: SavedStateHandle, + repository: LexiconRepository, ) : ViewModel() { - val character: State = mutableStateOf(init()) + val character: State - private fun init(): CharacterDetailUio { - val source = repository.data.value[savedStateHandle.characterDetailArgument.id] - return CharacterDetailUio( - name = source.name, - diminutive = source.diminutive?.let { "./ $it" }, - gender = when (source.gender) { - Lexicon.Gender.MALE -> R.string.gender_male - Lexicon.Gender.FEMALE -> R.string.gender_female - Lexicon.Gender.UNDETERMINED -> R.string.gender_undetermined - }, - race = when (source.race) { - Lexicon.Race.ELF -> R.string.race_elf - Lexicon.Race.HALFLING -> R.string.race_halfling - Lexicon.Race.HUMAN -> R.string.race_human - Lexicon.Race.DWARF -> R.string.race_dwarf - Lexicon.Race.HALF_ELF -> R.string.race_half_elf - Lexicon.Race.HALF_ORC -> R.string.race_half_orc - Lexicon.Race.DRAGONBORN -> R.string.race_dragonborn - Lexicon.Race.GNOME -> R.string.race_gnome - Lexicon.Race.TIEFLING -> R.string.race_tiefling - Lexicon.Race.AARAKOCRA -> R.string.race_aarakocra - Lexicon.Race.GENASI -> R.string.race_genasi - Lexicon.Race.DEEP_GNOME -> R.string.race_deep_gnome - Lexicon.Race.GOLIATH -> R.string.race_goliath - Lexicon.Race.UNDETERMINED -> R.string.race_undetermined - }, - portrait = source.portrait, - description = source.description, - history = source.history, + init { + val argument = savedStateHandle.characterDetailArgument + val source = repository.data.value[argument.id] + + character = mutableStateOf( + CharacterDetailUio( + name = source.name, + diminutive = source.diminutive?.let { "./ $it" }, + gender = source.gender, + race = source.race, + portrait = source.portrait, + description = source.description, + history = source.history, + search = argument.highlight, + highlightGender = argument.highlightGender && argument.gender == source.gender, + highlightRace = argument.highlightRace && argument.race == source.race, + ) ) } } \ No newline at end of file diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/screens/lexicon/LexiconItem.kt b/app/src/main/java/com/pixelized/rplexicon/ui/screens/lexicon/LexiconItem.kt index 03f62d2..0af7cb3 100644 --- a/app/src/main/java/com/pixelized/rplexicon/ui/screens/lexicon/LexiconItem.kt +++ b/app/src/main/java/com/pixelized/rplexicon/ui/screens/lexicon/LexiconItem.kt @@ -4,6 +4,7 @@ import android.content.res.Configuration.UI_MODE_NIGHT_NO import android.content.res.Configuration.UI_MODE_NIGHT_YES import androidx.annotation.StringRes import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.ExperimentalLayoutApi import androidx.compose.foundation.layout.FlowRow @@ -16,6 +17,7 @@ import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.Stable import androidx.compose.runtime.remember +import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.font.FontStyle @@ -55,7 +57,10 @@ fun LexiconItem( ) { val typography = MaterialTheme.typography - Surface(modifier = modifier) { + Box( + modifier = modifier, + contentAlignment = Alignment.Center, + ) { Column( modifier = Modifier .fillMaxWidth() diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/screens/lexicon/LexiconScreen.kt b/app/src/main/java/com/pixelized/rplexicon/ui/screens/lexicon/LexiconScreen.kt index 135fccd..947af39 100644 --- a/app/src/main/java/com/pixelized/rplexicon/ui/screens/lexicon/LexiconScreen.kt +++ b/app/src/main/java/com/pixelized/rplexicon/ui/screens/lexicon/LexiconScreen.kt @@ -12,13 +12,13 @@ import androidx.compose.animation.ExperimentalAnimationApi import androidx.compose.animation.fadeIn import androidx.compose.animation.fadeOut import androidx.compose.animation.with -import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.fillMaxSize 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.systemBarsPadding import androidx.compose.foundation.lazy.LazyColumn @@ -34,6 +34,7 @@ import androidx.compose.material.pullrefresh.pullRefresh import androidx.compose.material.pullrefresh.rememberPullRefreshState import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Icon +import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Scaffold import androidx.compose.material3.Surface import androidx.compose.material3.Text @@ -66,6 +67,7 @@ import com.pixelized.rplexicon.ui.screens.lexicon.LexiconErrorUio.Default import com.pixelized.rplexicon.ui.screens.lexicon.LexiconErrorUio.Permission import com.pixelized.rplexicon.ui.screens.lexicon.LexiconErrorUio.Structure import com.pixelized.rplexicon.ui.theme.LexiconTheme +import com.pixelized.rplexicon.utilitary.extentions.lexicon import kotlinx.coroutines.flow.SharedFlow import kotlinx.coroutines.launch @@ -131,8 +133,9 @@ fun LexiconScreen( } @OptIn( - ExperimentalMaterial3Api::class, ExperimentalMaterialApi::class, - ExperimentalFoundationApi::class, ExperimentalAnimationApi::class + ExperimentalMaterial3Api::class, + ExperimentalMaterialApi::class, + ExperimentalAnimationApi::class, ) @Composable private fun LexiconScreenContent( @@ -208,7 +211,7 @@ private fun LexiconScreenContent( ) { items(count = 6) { LexiconItem( - modifier = Modifier.animateItemPlacement(), + modifier = Modifier.heightIn(min = MaterialTheme.lexicon.dimens.item), item = LexiconItemUio.Brulkhai, ) } @@ -231,8 +234,8 @@ private fun LexiconScreenContent( ) { LexiconItem( modifier = Modifier - .animateItemPlacement() - .clickable { onItem(it) }, + .clickable { onItem(it) } + .heightIn(min = MaterialTheme.lexicon.dimens.item), item = it, ) } diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/screens/search/SearchItem.kt b/app/src/main/java/com/pixelized/rplexicon/ui/screens/search/SearchItem.kt new file mode 100644 index 0000000..b976bb7 --- /dev/null +++ b/app/src/main/java/com/pixelized/rplexicon/ui/screens/search/SearchItem.kt @@ -0,0 +1,274 @@ +package com.pixelized.rplexicon.ui.screens.search + +import androidx.compose.animation.animateContentSize +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.ExperimentalLayoutApi +import androidx.compose.foundation.layout.FlowRow +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.offset +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Surface +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.Stable +import androidx.compose.runtime.remember +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.drawBehind +import androidx.compose.ui.geometry.Offset +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.AnnotatedString +import androidx.compose.ui.text.SpanStyle +import androidx.compose.ui.text.font.FontStyle +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.tooling.preview.PreviewParameter +import androidx.compose.ui.tooling.preview.PreviewParameterProvider +import androidx.compose.ui.unit.dp +import com.pixelized.rplexicon.R +import com.pixelized.rplexicon.model.Lexicon +import com.pixelized.rplexicon.ui.theme.LexiconTheme +import com.pixelized.rplexicon.utilitary.composable.stringResource +import com.pixelized.rplexicon.utilitary.extentions.annotatedSpan +import com.pixelized.rplexicon.utilitary.extentions.annotatedString +import com.pixelized.rplexicon.utilitary.extentions.finderRegex +import com.pixelized.rplexicon.utilitary.extentions.foldAll +import com.pixelized.rplexicon.utilitary.extentions.highlightRegex + +@Stable +class SearchItemUio( + val id: Int, + val name: String, + val diminutive: String?, + val gender: Lexicon.Gender, + val race: Lexicon.Race, + val description: String?, + val history: String?, + val search: String, + val highlightGender: Boolean, + val highlightRace: Boolean, +) { + companion object { + fun preview( + id: Int = 0, + name: String = "Brulkhai", + diminutive: String? = "Bru", + gender: Lexicon.Gender = Lexicon.Gender.FEMALE, + race: Lexicon.Race = Lexicon.Race.HALF_ORC, + description: String? = "Brulkhai, ou plus simplement Bru, est une demi-orc de 38 ans solidement bâti. Elle mesure 192 cm pour 110 kg de muscles lorsqu’elle est en bonne santé. Elle a les cheveux châtains, les yeux noisettes et la peau couleur gris-vert typique de son espèce. D’un tempérament taciturne, elle parle peu et de façon concise. Elle est parfois brutale, aussi bien physiquement que verbalement, Elle ne prend cependant aucun plaisir à malmener ceux qu’elle considère plus faibles qu’elle.\n" + + "D’une nature simple et honnête, elle ne mâche pas ses mots et ne dissimule généralement pas ses pensées. Son intelligence modeste est plus le reflet d’un manque d’éducation et d’une capacité limitée à gérer ses émotions qu’à une débilité congénitale.\n" + + "Elle voue à la force un culte car c’est par son expression qu’elle se sent vraiment vivante et éprouve de grandes difficultés vis à vis de ceux qu’elle nomme foshnu (bébé, chouineur en commun).", + history: String? = null, + search: String = "", + highlightGender: Boolean = false, + highlightRace: Boolean = false, + ): SearchItemUio { + return SearchItemUio( + id = id, + name = name, + diminutive = diminutive, + gender = gender, + race = race, + description = description, + history = history, + search = search, + highlightGender = highlightGender, + highlightRace = highlightRace, + ) + } + } +} + +@Stable +class AnnotatedSearchItemUio( + val id: Int, + val name: AnnotatedString, + val diminutive: AnnotatedString?, + val gender: AnnotatedString, + val race: AnnotatedString, + val description: AnnotatedString?, + val history: AnnotatedString?, +) + +@Composable +@Stable +private fun SearchItemUio.annotate(): AnnotatedSearchItemUio { + val colorScheme = MaterialTheme.colorScheme + val highlight = remember { SpanStyle(color = colorScheme.primary) } + val highlightRegex = remember(search) { search.highlightRegex } + val finderRegex = remember(search) { search.finderRegex } + val gender = stringResource(id = gender, short = true) + val race = stringResource(id = race) + + return remember(search) { + AnnotatedSearchItemUio( + id = id, + name = AnnotatedString( + text = name, + spanStyles = highlightRegex?.annotatedSpan( + input = name, + spanStyle = highlight, + ) ?: emptyList() + ), + diminutive = highlightRegex?.annotatedString( + input = diminutive ?: "", + spanStyle = highlight + ), + gender = gender.let { + AnnotatedString( + text = it, + spanStyles = when (highlightGender) { + true -> listOf(AnnotatedString.Range(highlight, 0, it.length)) + else -> emptyList() + } + ) + }, + race = race.let { + AnnotatedString( + text = it, + spanStyles = when (highlightRace) { + true -> listOf(AnnotatedString.Range(highlight, 0, it.length)) + else -> emptyList() + } + ) + }, + description = finderRegex?.foldAll(description)?.let { description -> + highlightRegex?.annotatedString(description, spanStyle = highlight) + }, + history = finderRegex?.foldAll(history)?.let { history -> + highlightRegex?.annotatedString(history, spanStyle = highlight) + }, + ) + } +} + +@OptIn(ExperimentalLayoutApi::class) +@Composable +fun SearchItem( + modifier: Modifier = Modifier, + item: SearchItemUio, +) { + val typography = MaterialTheme.typography + val colorScheme = MaterialTheme.colorScheme + val annotatedItem = item.annotate() + + Box( + modifier = modifier, + contentAlignment = Alignment.Center, + ) { + Column( + modifier = Modifier + .fillMaxWidth() + .padding(vertical = 8.dp, horizontal = 16.dp) + .animateContentSize(), + verticalArrangement = Arrangement.spacedBy(6.dp), + ) { + FlowRow( + horizontalArrangement = Arrangement.spacedBy(4.dp), + ) { + Text( + modifier = Modifier.alignByBaseline(), + style = remember { typography.bodyLarge.copy(fontWeight = FontWeight.Bold) }, + maxLines = 1, + text = annotatedItem.name, + ) + annotatedItem.diminutive?.let { + Text( + modifier = Modifier.alignByBaseline(), + style = typography.labelMedium, + maxLines = 1, + text = it, + ) + } + } + + Row( + modifier = Modifier.offset(y = (-2).dp), + horizontalArrangement = Arrangement.spacedBy(4.dp), + ) { + Text( + modifier = Modifier.alignByBaseline(), + style = remember { typography.labelMedium.copy(fontStyle = FontStyle.Italic) }, + maxLines = 1, + text = annotatedItem.gender + ) + Text( + modifier = Modifier.alignByBaseline(), + style = remember { typography.labelMedium.copy(fontStyle = FontStyle.Italic) }, + maxLines = 1, + text = annotatedItem.race + ) + } + + Column( + modifier = Modifier.drawBehind { + drawLine( + color = colorScheme.primary, + start = Offset(0f, 0f), + end = Offset(0f, size.height), + strokeWidth = 2.dp.toPx() + ) + }, + verticalArrangement = Arrangement.spacedBy(4.dp), + ) { + annotatedItem.description?.let { + Column( + modifier = Modifier.padding(start = 8.dp) + ) { + Text( + style = remember { typography.labelSmall.copy(fontWeight = FontWeight.Bold) }, + text = stringResource(id = R.string.search_item_description), + ) + Text( + style = typography.labelSmall, + text = it, + ) + } + } + annotatedItem.history?.let { + Column( + modifier = Modifier.padding(start = 8.dp), + ) { + Text( + style = remember { typography.labelSmall.copy(fontWeight = FontWeight.Bold) }, + text = stringResource(id = R.string.search_item_history), + ) + Text( + style = typography.labelSmall, + text = it, + ) + } + } + } + } + } +} + +@Composable +@Preview +private fun SearchItemPreview( + @PreviewParameter(SearchItemPreviewProvider::class) preview: SearchItemUio, +) { + LexiconTheme { + Surface { + SearchItem( + item = preview, + ) + } + } +} + +private class SearchItemPreviewProvider : PreviewParameterProvider { + override val values: Sequence = sequenceOf( + SearchItemUio.preview(), + SearchItemUio.preview(search = "bru"), + SearchItemUio.preview(search = "Brulkhai"), + SearchItemUio.preview(search = "elle"), + SearchItemUio.preview(highlightGender = true), + SearchItemUio.preview(highlightRace = true), + ) +} \ No newline at end of file diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/screens/search/SearchScreen.kt b/app/src/main/java/com/pixelized/rplexicon/ui/screens/search/SearchScreen.kt index 4efdcb9..b0f21a7 100644 --- a/app/src/main/java/com/pixelized/rplexicon/ui/screens/search/SearchScreen.kt +++ b/app/src/main/java/com/pixelized/rplexicon/ui/screens/search/SearchScreen.kt @@ -10,6 +10,7 @@ import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.heightIn import androidx.compose.foundation.layout.imePadding import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.systemBarsPadding @@ -21,6 +22,7 @@ import androidx.compose.material3.Divider import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Icon import androidx.compose.material3.IconButton +import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Scaffold import androidx.compose.material3.Surface import androidx.compose.material3.Text @@ -30,6 +32,7 @@ import androidx.compose.runtime.Stable import androidx.compose.runtime.State import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember +import androidx.compose.ui.ExperimentalComposeUiApi import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalContext @@ -41,15 +44,15 @@ import androidx.hilt.navigation.compose.hiltViewModel import com.pixelized.rplexicon.NO_WINDOW_INSETS import com.pixelized.rplexicon.R import com.pixelized.rplexicon.model.Lexicon +import com.pixelized.rplexicon.ui.composable.ScrollingKeyboardHandler import com.pixelized.rplexicon.ui.composable.form.DropDownField import com.pixelized.rplexicon.ui.composable.form.DropDownFieldUio import com.pixelized.rplexicon.ui.composable.form.TextField import com.pixelized.rplexicon.ui.composable.form.TextFieldUio import com.pixelized.rplexicon.ui.navigation.LocalScreenNavHost import com.pixelized.rplexicon.ui.navigation.screens.navigateToCharacterDetail -import com.pixelized.rplexicon.ui.screens.lexicon.LexiconItem -import com.pixelized.rplexicon.ui.screens.lexicon.LexiconItemUio import com.pixelized.rplexicon.ui.theme.LexiconTheme +import com.pixelized.rplexicon.utilitary.extentions.lexicon @Stable data class SearchFormUio( @@ -63,6 +66,7 @@ fun SearchScreen( viewModel: SearchViewModel = hiltViewModel(), ) { val screen = LocalScreenNavHost.current + val lazyState = rememberLazyListState() Surface { SearchScreenContent( @@ -70,15 +74,25 @@ fun SearchScreen( .fillMaxSize() .systemBarsPadding() .imePadding(), + lazyColumnState = lazyState, items = viewModel.filter, form = viewModel.form, - onItem = { - screen.navigateToCharacterDetail(id = it.id) + onItem = { item -> + val form = viewModel.form + screen.navigateToCharacterDetail( + id = item.id, + highlight = form.search.value.value.takeIf { it.isNotEmpty() }, + race = form.race.value.value.first, + gender = form.gender.value.value.first, + ) }, onBack = { screen.popBackStack() } ) + ScrollingKeyboardHandler( + lazyListState = lazyState, + ) } } @@ -87,10 +101,10 @@ fun SearchScreen( private fun SearchScreenContent( modifier: Modifier = Modifier, lazyColumnState: LazyListState = rememberLazyListState(), - items: State>, + items: State>, form: SearchFormUio, onBack: () -> Unit, - onItem: (LexiconItemUio) -> Unit, + onItem: (SearchItemUio) -> Unit, ) { Scaffold( modifier = modifier, @@ -147,12 +161,12 @@ private fun SearchScreenContent( items( items = items.value, key = { it.id }, - contentType = { "Lexicon" }, + contentType = { "Search" }, ) { - LexiconItem( + SearchItem( modifier = Modifier - .animateItemPlacement() - .clickable { onItem(it) }, + .clickable { onItem(it) } + .heightIn(min = MaterialTheme.lexicon.dimens.item), item = it, ) } @@ -185,12 +199,17 @@ private fun SearchScreenContentPreview() { items = remember { mutableStateOf( listOf( - LexiconItemUio( + SearchItemUio( id = 0, name = "Brulkhai", diminutive = "Bru", - gender = R.string.gender_female_short, - race = R.string.race_half_orc, + gender = Lexicon.Gender.FEMALE, + race = Lexicon.Race.HALF_ORC, + description = null, + history = null, + search = "", + highlightGender = false, + highlightRace = false, ) ) ) diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/screens/search/SearchViewModel.kt b/app/src/main/java/com/pixelized/rplexicon/ui/screens/search/SearchViewModel.kt index 78f44dd..0b4be7c 100644 --- a/app/src/main/java/com/pixelized/rplexicon/ui/screens/search/SearchViewModel.kt +++ b/app/src/main/java/com/pixelized/rplexicon/ui/screens/search/SearchViewModel.kt @@ -10,86 +10,77 @@ import com.pixelized.rplexicon.model.Lexicon.Race import com.pixelized.rplexicon.repository.LexiconRepository import com.pixelized.rplexicon.ui.composable.form.DropDownFieldUio import com.pixelized.rplexicon.ui.composable.form.TextFieldUio -import com.pixelized.rplexicon.ui.screens.lexicon.LexiconItemUio import dagger.hilt.android.lifecycle.HiltViewModel import javax.inject.Inject @HiltViewModel class SearchViewModel @Inject constructor( - private val repository: LexiconRepository, + repository: LexiconRepository, ) : ViewModel() { - private val search = mutableStateOf("") - private val gender = mutableStateOf>(null to "") - private val race = mutableStateOf>(null to "") + private val _search = mutableStateOf("") + private val _gender = mutableStateOf>(null to "") + private val _race = mutableStateOf>(null to "") val form = SearchFormUio( search = TextFieldUio( label = R.string.search_field_search, - value = search, + value = _search, onValueChange = { - search.value = it + _search.value = it } ), gender = DropDownFieldUio( label = R.string.search_field_gender, values = genders(), - value = gender, - onValueChange = { id, value -> gender.value = id to value }, + value = _gender, + onValueChange = { id, value -> _gender.value = id to value }, ), race = DropDownFieldUio( label = R.string.search_field_race, values = races(), - value = race, - onValueChange = { id, value -> race.value = id to value }, + value = _race, + onValueChange = { id, value -> _race.value = id to value }, ), ) private var data: List = repository.data.value val filter = derivedStateOf { - data - .filter { item -> - val gender = gender.value.first?.let { it == item.gender } - val race = race.value.first?.let { it == item.race } - val search = search.value.takeIf { it.isNotEmpty() }?.let { - val name = item.name.contains(search.value, true) - val diminutive = item.diminutive?.contains(search.value, true) == true - val description = item.description?.contains(search.value, true) == true - val history = item.history?.contains(search.value, true) == true - name || diminutive || description || history - } - (gender == null || gender) && (race == null || race) && (search == null || search) - }.map { - LexiconItemUio( - id = it.id, - name = it.name, - diminutive = it.diminutive?.takeIf { it.isNotBlank() }?.let { "./ $it" }, - gender = when (it.gender) { - Gender.MALE -> R.string.gender_male_short - Gender.FEMALE -> R.string.gender_female_short - Gender.UNDETERMINED -> R.string.gender_undetermined_short - }, - race = when (it.race) { - Race.ELF -> R.string.race_elf - Race.HALFLING -> R.string.race_halfling - Race.HUMAN -> R.string.race_human - Race.DWARF -> R.string.race_dwarf - Race.HALF_ELF -> R.string.race_half_elf - Race.HALF_ORC -> R.string.race_half_orc - Race.DRAGONBORN -> R.string.race_dragonborn - Race.GNOME -> R.string.race_gnome - Race.TIEFLING -> R.string.race_tiefling - Race.AARAKOCRA -> R.string.race_aarakocra - Race.GENASI -> R.string.race_genasi - Race.DEEP_GNOME -> R.string.race_deep_gnome - Race.GOLIATH -> R.string.race_goliath - Race.UNDETERMINED -> R.string.race_undetermined - }, - ) + data.filter { item -> + val gender = _gender.value.first?.let { it == item.gender } + val race = _race.value.first?.let { it == item.race } + val search = _search.value.takeIf { it.isNotEmpty() }?.let { + val name = item.name.contains(_search.value, true) + val diminutive = item.diminutive?.contains(_search.value, true) == true + val description = item.description?.contains(_search.value, true) == true + val history = item.history?.contains(_search.value, true) == true + name || diminutive || description || history } - .sortedBy { it.name } + (gender == null || gender) && (race == null || race) && (search == null || search) + }.map { + it.toSearchUio() + }.sortedBy { + it.name + } } + private fun Lexicon.toSearchUio( + search: String = _search.value, + highlightGender: Boolean = this.gender == _gender.value.first, + highlightRace: Boolean = this.race == _race.value.first, + ) = SearchItemUio( + id = this.id, + name = this.name, + diminutive = diminutive?.takeIf { it.isNotBlank() }?.let { "./ $it" }, + gender = this.gender, + race = this.race, + description = this.description, + history = this.history, + search = search, + highlightGender = highlightGender, + highlightRace = highlightRace, + ) + companion object { private fun genders() = listOf( Gender.MALE to R.string.gender_male, diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/theme/Theme.kt b/app/src/main/java/com/pixelized/rplexicon/ui/theme/Theme.kt index 99cec13..6d6c808 100644 --- a/app/src/main/java/com/pixelized/rplexicon/ui/theme/Theme.kt +++ b/app/src/main/java/com/pixelized/rplexicon/ui/theme/Theme.kt @@ -15,6 +15,8 @@ import androidx.core.view.WindowCompat import com.pixelized.rplexicon.ui.theme.colors.LexiconColors import com.pixelized.rplexicon.ui.theme.colors.darkColorScheme import com.pixelized.rplexicon.ui.theme.colors.lightColorScheme +import com.pixelized.rplexicon.ui.theme.dimen.LexiconDimens +import com.pixelized.rplexicon.ui.theme.dimen.lexiconDimen import com.pixelized.rplexicon.ui.theme.shape.LexiconShapes import com.pixelized.rplexicon.ui.theme.shape.lexiconShapes @@ -26,6 +28,7 @@ val LocalLexiconTheme = compositionLocalOf { data class LexiconTheme( val colorScheme: LexiconColors, val shapes: LexiconShapes, + val dimens: LexiconDimens, ) @Composable @@ -39,7 +42,8 @@ fun LexiconTheme( true -> darkColorScheme() else -> lightColorScheme() }, - shapes = lexiconShapes() + shapes = lexiconShapes(), + dimens = lexiconDimen(), ) } diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/theme/dimen/LexiconDimens.kt b/app/src/main/java/com/pixelized/rplexicon/ui/theme/dimen/LexiconDimens.kt new file mode 100644 index 0000000..6b0aad6 --- /dev/null +++ b/app/src/main/java/com/pixelized/rplexicon/ui/theme/dimen/LexiconDimens.kt @@ -0,0 +1,18 @@ +package com.pixelized.rplexicon.ui.theme.dimen + +import androidx.compose.runtime.Immutable +import androidx.compose.runtime.Stable +import androidx.compose.ui.unit.Dp +import androidx.compose.ui.unit.dp + +@Stable +@Immutable +data class LexiconDimens( + val item: Dp +) + +fun lexiconDimen( + item: Dp = 48.dp +) = LexiconDimens( + item = item, +) \ No newline at end of file diff --git a/app/src/main/java/com/pixelized/rplexicon/utilitary/composable/StringResource+Gender.kt b/app/src/main/java/com/pixelized/rplexicon/utilitary/composable/StringResource+Gender.kt new file mode 100644 index 0000000..fae62d4 --- /dev/null +++ b/app/src/main/java/com/pixelized/rplexicon/utilitary/composable/StringResource+Gender.kt @@ -0,0 +1,27 @@ +package com.pixelized.rplexicon.utilitary.composable + +import androidx.compose.runtime.Composable +import androidx.compose.runtime.ReadOnlyComposable +import com.pixelized.rplexicon.R +import com.pixelized.rplexicon.model.Lexicon +import androidx.compose.ui.res.stringResource as androidStringResource + +@Composable +@ReadOnlyComposable +fun stringResource(id: Lexicon.Gender, short: Boolean = false): String { + return androidStringResource( + id = when (short) { + true -> when (id) { + Lexicon.Gender.MALE -> R.string.gender_male_short + Lexicon.Gender.FEMALE -> R.string.gender_female_short + Lexicon.Gender.UNDETERMINED -> R.string.gender_undetermined_short + } + + else -> when (id) { + Lexicon.Gender.MALE -> R.string.gender_male + Lexicon.Gender.FEMALE -> R.string.gender_female + Lexicon.Gender.UNDETERMINED -> R.string.gender_undetermined + } + } + ) +} \ No newline at end of file diff --git a/app/src/main/java/com/pixelized/rplexicon/utilitary/composable/StringResource+Race.kt b/app/src/main/java/com/pixelized/rplexicon/utilitary/composable/StringResource+Race.kt new file mode 100644 index 0000000..3f90f94 --- /dev/null +++ b/app/src/main/java/com/pixelized/rplexicon/utilitary/composable/StringResource+Race.kt @@ -0,0 +1,30 @@ +package com.pixelized.rplexicon.utilitary.composable + +import androidx.compose.runtime.Composable +import androidx.compose.runtime.ReadOnlyComposable +import com.pixelized.rplexicon.R +import com.pixelized.rplexicon.model.Lexicon +import androidx.compose.ui.res.stringResource as androidStringResource + +@Composable +@ReadOnlyComposable +fun stringResource(id: Lexicon.Race): String { + return androidStringResource( + id = when (id) { + Lexicon.Race.ELF -> R.string.race_elf + Lexicon.Race.HALFLING -> R.string.race_halfling + Lexicon.Race.HUMAN -> R.string.race_human + Lexicon.Race.DWARF -> R.string.race_dwarf + Lexicon.Race.HALF_ELF -> R.string.race_half_elf + Lexicon.Race.HALF_ORC -> R.string.race_half_orc + Lexicon.Race.DRAGONBORN -> R.string.race_dragonborn + Lexicon.Race.GNOME -> R.string.race_gnome + Lexicon.Race.TIEFLING -> R.string.race_tiefling + Lexicon.Race.AARAKOCRA -> R.string.race_aarakocra + Lexicon.Race.GENASI -> R.string.race_genasi + Lexicon.Race.DEEP_GNOME -> R.string.race_deep_gnome + Lexicon.Race.GOLIATH -> R.string.race_goliath + Lexicon.Race.UNDETERMINED -> R.string.race_undetermined + } + ) +} \ No newline at end of file diff --git a/app/src/main/java/com/pixelized/rplexicon/utilitary/extentions/RegexEx.kt b/app/src/main/java/com/pixelized/rplexicon/utilitary/extentions/RegexEx.kt new file mode 100644 index 0000000..6d52988 --- /dev/null +++ b/app/src/main/java/com/pixelized/rplexicon/utilitary/extentions/RegexEx.kt @@ -0,0 +1,46 @@ +package com.pixelized.rplexicon.utilitary.extentions + +import androidx.compose.ui.text.AnnotatedString +import androidx.compose.ui.text.SpanStyle + +fun Regex?.foldAll( + input: CharSequence?, + startIndex: Int = 0, +): String? = input?.let { + var previous: MatchResult? = null + this?.findAll(it, startIndex)?.fold("") { acc, item -> + val dummy = acc + when { + previous == null && item.range.first == 0 -> item.value + previous == null && item.range.first != 0 -> "...${item.value}" + item.range.first <= (previous?.range?.last ?: 0) + 1 -> item.value + else -> " ... ${item.value}" + } + previous = item + dummy + } +}?.takeIf { it.isNotEmpty() }?.let { "$it..." } + +fun Regex.annotatedSpan( + input: String, + startIndex: Int = 0, + spanStyle: SpanStyle +): List> { + return findAll(input = input, startIndex = startIndex).map { + AnnotatedString.Range( + item = spanStyle, + start = it.range.first, + end = it.range.last + 1 + ) + }.toList() +} + +fun Regex.annotatedString( + input: String, + startIndex: Int = 0, + spanStyle: SpanStyle +): AnnotatedString { + return AnnotatedString( + text = input, + spanStyles = annotatedSpan(input, startIndex, spanStyle) + ) +} \ No newline at end of file diff --git a/app/src/main/java/com/pixelized/rplexicon/utilitary/extentions/StringEt.kt b/app/src/main/java/com/pixelized/rplexicon/utilitary/extentions/StringEt.kt deleted file mode 100644 index 7f05ee4..0000000 --- a/app/src/main/java/com/pixelized/rplexicon/utilitary/extentions/StringEt.kt +++ /dev/null @@ -1,3 +0,0 @@ -package com.pixelized.rplexicon.utilitary.extentions - -val String.ARG: String get() = "$this={$this}" \ No newline at end of file diff --git a/app/src/main/java/com/pixelized/rplexicon/utilitary/extentions/StringEx.kt b/app/src/main/java/com/pixelized/rplexicon/utilitary/extentions/StringEx.kt new file mode 100644 index 0000000..496996d --- /dev/null +++ b/app/src/main/java/com/pixelized/rplexicon/utilitary/extentions/StringEx.kt @@ -0,0 +1,17 @@ +package com.pixelized.rplexicon.utilitary.extentions + +val String.ARG: String get() = "$this={$this}" + +val String?.highlightRegex: Regex? + get() = this?.takeIf { it.isNotEmpty() }?.let { + Regex(pattern = Regex.escape(it), option = RegexOption.IGNORE_CASE) + } + +val String?.finderRegex: Regex? + get() = this?.takeIf { it.isNotEmpty() }?.let { + Regex( + pattern = "\\w*.{0,30}${Regex.escape(it)}\\w*.{0,30}\\w*", + option = RegexOption.IGNORE_CASE, + ) + } + diff --git a/app/src/main/res/drawable/ic_dungeons_and_dragons_48dp.xml b/app/src/main/res/drawable/ic_dungeons_and_dragons_48dp.xml new file mode 100644 index 0000000..4339564 --- /dev/null +++ b/app/src/main/res/drawable/ic_dungeons_and_dragons_48dp.xml @@ -0,0 +1,18 @@ + + + + + + diff --git a/app/src/main/res/drawable/ic_launcher_foreground.xml b/app/src/main/res/drawable/ic_launcher_foreground.xml index 2b068d1..2172512 100644 --- a/app/src/main/res/drawable/ic_launcher_foreground.xml +++ b/app/src/main/res/drawable/ic_launcher_foreground.xml @@ -1,30 +1,23 @@ - - - - - - - - - - \ No newline at end of file + android:viewportWidth="48" + android:viewportHeight="48"> + + + + + + + diff --git a/app/src/main/res/mipmap-anydpi/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml similarity index 56% rename from app/src/main/res/mipmap-anydpi/ic_launcher.xml rename to app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml index 6f3b755..7353dbd 100644 --- a/app/src/main/res/mipmap-anydpi/ic_launcher.xml +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -1,6 +1,5 @@ - - - + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi/ic_launcher_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml similarity index 56% rename from app/src/main/res/mipmap-anydpi/ic_launcher_round.xml rename to app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml index 6f3b755..7353dbd 100644 --- a/app/src/main/res/mipmap-anydpi/ic_launcher_round.xml +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -1,6 +1,5 @@ - - - + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.webp b/app/src/main/res/mipmap-hdpi/ic_launcher.webp index c209e78ecd372343283f4157dcfd918ec5165bb3..6c29f9620f709442de7e10a9dc8f0a4964fe753e 100644 GIT binary patch literal 1734 zcmWIYbaUIs#=sEn>J$(bVBxcgje$Ym{eYl=XnWJP+!-zQZ~iKFbZ{FBW3~QavGghvW_E>gZ>R;0H6X)D=ZvSzcnmX@O#+%OE{?Np?vbW1F$=_3*?b(_s6I`u1$5_n-Si*JY`+=P`SLQ@G2JK?J{(Sk5flmhm__tFNO- zXr_MtMfF(>779*H7bO{fFm!fEJeXRZbkmZv+@VD!n?KQajV+t4w44X$i`K-<u@QBTT?}0y3+lHMVEsluJ5;N-72tn zh8x%WQ=U5Y?TicmM=oyRa7%Ob66C2Zs_D4ey~Oj`-#d~Ariq9oZ8eGie=>|K*Wu+n zvpt{cf?bO3X5}C36%ny>EKNviT)pU2Wn}jfHU*=!U7nTZ(oaKI&DpAK!1-WhEpx-% ztrJhaeIY+}+p3bping^Xhn|>qT3$O*SGQ=7Tlj%rSIZ78{Pp9Uhww4y^k1eYXBirfZ2s z!eJH181&SG3b+1cd=qo8Z${%KyU%YKJw!#W-}*nlX|~y#xMz>~wcmzoE!=VGR&d>h zFKZ(0R>bUQ`LoBXq0iLA=U`3M0$r7l`)0WEGw|$qud9)}Ipsyw@d%mcOYI^*|2#k8 z)PtBksn=gs9#Pt)wEe_A?nNvY*7)9j$f9_*HFDo6cGufAXIBKue|OK+<=ik?BVX#Y zu0ZjVWSP{uB@Z4rDb4yPwDU{K%PZgQuN}8;-o$j4kxfVSltC?P!kO~>BG-;T3lZaX zc>MfxRN(yTi-xc6_3eq{E;c&)TKvtE+6t!q%QWR`u4pmbI&i2$)+Ouu3IF5MzW??= zc&Ol5__3VFeMe39?wLO)K=xSDQIQsdOFYt-d+nC46b`V=7Rrm~)J%FVax-$@D)YvT z0Xqc`?^Cv_Id}g1*_Z46drgB*7@W~Au~YlwUH5D0me@CY{%Jkv@{qpkDwK(@07vPEqT2!bQuipPYRxqVZKr@e1&cH-=JF=|3B6B9_^Ie zbNZF#o&@oqT4xMW>R7hLx4LY+!=raX<%&p_GIK+@U2REpec(Z_8>{~+JYO2l;PBS4 zhCx5_5X*sm7mvUC(9}J{bkjd!h8YV=)_A&jzWG>aw(_fY`HSZLGIFJkg<%U`l_r=z ztJ1remHo&4<7)dmn+|PmJ$lqC=h-8N+A_5+ zv!uFD547mxM51xwNI`>X5%>CTq!`B!ZB;(G` zc+g-R7hJ7w?lb=`--c^)lb6jZO8T4de9zsLaa;4sif-#!xLo-tcCKK#f9{;{lAB^# z_ixp1nj0f2n7XrS-N)Zq|6``||B|c}`{cOK{uNhw?nV!#MYgBd*UnRS{j#ns@c-xb zKIQi-EPFROP3M30?D(Fb6zeV1%{H#Q`*fGd*(aBTvtQp=-?rK3$Lnj%C+m(LUA$a; zdUof!sLFGV`xLXzp8qgsa^{zwy2~e1zsr?8IJ|Xsf5WZXEeB)$?6j=>g!kqg>oK|M z%M}-|bKq7>|3#}~+cf1rn;BkX%ZX{+nAuYps<+N=o#WN3MviSI9CHe8m-*YX^VA1z z-rJF|R9H#7B}g&-RVue!&`bGmv){%pteC1gCxN5?L|E+JhkR%6t$ZgxJC12V9_Ios z4Uqs=5e5*!wStLj@4xuJH)g0ubiNUgc_^SLC|LNi`gM!%hq)3HFKZuCSaYd=z2DLc Je9kkySpn>>Q;h%s literal 1404 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%0D%Eo$*=nm_Iu+cp7Fo9EyM*zH8S<-( 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 Kd~s>VF$Mtb_SbU& literal 1772 zcmWIYbaQ*c#=sEn>J$(bU=hK^z`!8Dz`&pnMvguK9x+S|42%o1Z*R-I{VKRR_O_X_ z^vvAbVQHV4bMD_b_PMm~oSu2zw)-*3-E@E^|?El(}TXJtN zGyM?1dh-P_hvly7^Pcbj^Y6F*=kxwLuUHPe+GM%l*dBKK%`fK5pIObfZ z2U@NXWrA_R2Cf+Sf=lfF*^|Zcp*zy130q&}_cR#(H z{~u3cRZS6Z$xdX<2w9zQiX%AeS`(Yjvp|WZ1)Mq}9~$iV&L5XLwczpjDHbjEA4Nx?jQY9E50B(=5AwH{IM^g z)eG|MmVNJSc=C8gTuAfQ=gGSstqIPSbdpgl=q_Tjty^+L@y|;8HBPRm7IQirE~Qf8v3vi0~2iPiN<(SvFq^U6*%# z?^G2{*GVZ)_vMuqbETGgPL_+d|Iz6B|HHv+a=t?CMcUz83!fWW=j}OB|L?5%{O9p^ zZWu1}e!R+0**Q0M?Xlcl-=xfHer$+~y=}7Y=^D3Vr=At9%lbOYbai;CWxA*rTUdaF zLJ|uD!vt}Lxr|x{3@iF-{w*N3)rWHzi~e}|LyY)>~F&V|2`$Z_lwQ1w@URY zKVomi|GM{+UH+l|Hs&jJ|My+}yz^i4<>PZeDyUx1xb;~UI40Ekc=EzRTi2rzh;?hed#*(i;e?0N%CC}4Tma95H)sm;qe&@*} zD!$3}+5(1u|Edjp--bH%*G4?OS>B#lEOCxiZQ5TBlklv!dyE5$YggNz^mz4t(_wyo z#*aMxFB7iJH#}A!KH(L^;(4>4Zrb|%@K^Omf0pYs@BRNPbjOc*<(lT3ZvLNtZt>#_ zub2OK4WIpbYVU=Fd;d_d@dXc8-pPonn6G~m%;FhlXNTA%$6a5TIyKQ)@`nWf(tT?l zFZeg-|D*N)6t?egI(ciKrI@miq+>?eYq7wCY_^ltndD6`GG31le%>X%CZuii7R^6O zvnNWv_`?6dX7T%qub%@%P2OF39QRBvYlRkzJIl(s{}%1M{q~L2vaj84e9bFY9;o@T z=WXDQck??9p0`i?P`qc>?AkPz>n4YGrVA}DTe|qk*?HTmUsbz^vZ-ZOY@aT#UhlQ_ z)1^<^mo~NJ^F39pacW+**GyA{>$k%cwrAmU{v0Tn=)a>vc!}`qLtm#e1aJGDn37?- z=IJ5RLW5N-9ZhlDf|sqZ-S|G;a?yrllfzzXMU9_5JJqo@`Ga^JhoF~;_1z{}#+Vyn zr|x-edok^Y`~SoKH}W5;*G+X&h!T*CD_iqv<>bxs@0R(mx7_x;!X`UDcJDotYN14*kn_7jwr}zihOj{bNGVOcxxf%|EtzTbQJuki$dZvwg z)ozC9>*v1LZdYB+oBj37)5Y6Z>_yvzxZBhIGTo~d3tFj{QJu%;yiv1dvh#i)rRp=*JjrimCi=5XTmE|Hjnx}7p7$-#5c+FYu^^z!B0Vn-KqJ`V;40Lb8F AkN^Mx diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.webp b/app/src/main/res/mipmap-xhdpi/ic_launcher.webp index 948a3070fe34c611c42c0d3ad3013a0dce358be0..75ae9d9e9c577c8202e430f7fb4eed5e5796b9a9 100644 GIT binary patch literal 2424 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 K=8=uQ9xDK87nu?O literal 1900 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 literal 2884 zcmWIYbaS)eW?%?+bqWXzu!!JdU|;I|bhytJ(0e=>_K;y>P~fqK zi9s&yjoCs5?jjQmnHPx)LfNufz8J&KC7jknY3_i+_}x_F3XMjr9^|8-|+F6=$U$~KJPL)Y+hfTuy1Yf&9qJb zf4|@V|KIQT;oXd>3o>O7y}N62{#uLf=HqX>%0*_XF7o%?c0#UL=(Wf!)g`+<+cQ51 zO+Qm?`Y_vJ^^Tvsnv*qt-H6Ls%rt*s4wMv7``<|jq9*R@&OH=&b)0Q zznz#3tS{cEe5Ne<`SQ_o$6C%hD0}T+v$p!rwZ-diFYNkR@cZ@R+roEqQ}?;Z9$2&J z)VFo}8e6aa-MBwJal`u6dpDg(S|GYJHss=!tCugQADB09-LfvF*^A{I^2C>{dKG

( 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 diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp index 9287f5083623b375139afb391af71cc533a7dd37..d91f753eb0da87e6423cad4163c12835693621e1 100644 GIT binary patch literal 7074 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

0vl^(ubK57i3$j`RXVdItc2Zu zTjP%3T{qqDyHu$1wf>en`}f$lI?l)hfy+`aCTxu8`Mp4Wt8~lzsk7fIKUzdbU&D@u>@#|8JoKt2mbv8|~*&2E%ct_*EIJ>)7o&PKE5_$1H zYTdgu^~m!0A4{%YZ`c&qZ)$yr|AXm!sqXjcKR?_Pn|Ao^jNS9)1$Q|wns@3F%fsvg zwSO(SHf}Wd&gY@5dZETG=E3!B4m$1-}j)^|n6tq;mOd3k8c0DH_GHdj+bC#}?wC!#j7mQS#vf_fXiT$x+$0-Ud(~5MTubmb>WqqsT;k{xpsIQhc5wmzv^leMXZ>rUpkvod!E z%4X!{CT@DfUb}1l9;OF%&cZj$=~`?izExW$`!W#MmrU&bU9x zY4?Y|ihvD`aVe?!Jd*bn>a_Ljw%A+cxQM63#5tgD>7pvIfk zXZB`A(+B?|xK;mhgAxy6j8m5a|tYYQtz-&)`wciH>w!z4Jl6EbdLNgW&t4n&Z^`r` zg&vWF3I>a?I;mM9pQdx?h+g`4^#9q@#m5&cUv`wUW67(N(f8cqnde#^*{|z4`#8&% z$(*MTuC#KwaPVof`>D`&U$yg@H74@YWB+XNzOk9HzHI)?S*96(9jadGnl+RhV?HYU zTPymOU!2^Y9Y;SYsn1QEpStG70rM^O4*D71J+(bX{#n9KLDg&XW+cq#d%E33PUWv_ zkfOTshO5hBt#1C8*W^yL{vnXQVRqiLErQMrj6U1<_5@j|Em*A4E4-te^ZzpYDI0B` zXg;x>w9{g(u&mK%{^Fz8n{xBlOZuI;!E!86S+BwIO2Xl&Fh%#ZoBUQU_O0g4%ANk> z0Jmq=?VG;}VuQcWs7ieBJAdXY(fhi`7ADvReRQ>AUivA=PwM}&`iLJJJJZ{_&k3Y2 zUvhnu->Tx7bEg!!9%6moQp;o7lU20XJ=QDEK<4}Dx`6F-nzAlROmUdnwpX%JBgyHE&EJd_^1F8lZE|Tb`4Z9o=_5<>!KzQ} zGZoDj*B>l-_{cMi-TF`Qmi1X-=QLK8d3<{luV|^Id8CphQgh85osBxngzXY9@84_h z%f`4XHqy%Sk8jJOIRCXp`#HYZ9tjb8r7sFp_47S~Y8LMZ0|ACD*T9*?vNtsq>c#FZ;4AF83!N-}7Zh7R+l= zw!4tMaFcX!P3Els8SK9LLhRyJK z+&t%0aQM50`k&8S%~Uwp?rm21|LFNWlV+G(ACydR-+6qUWz*kv3iZ{C%If{&>euW) z@@W5$w|~FeitEW*v$L+4y5z_58%Bq(G3{FX-GAnci|2Se?q;?>GnLW&F(+=#|9Z#w z-#_o;-&VrrqOwwO%B-^WHLF&}EjZj>w|%nOHqFIdHlY~LM|@kt^cB?v?aRN!JSJaHjLeW zb$GNz$NM?U8z(oNo3`r8e%lS3CEre$zVUyZ&{wym*PqV*QMTjIf~G4kJUQ0C+9_cC zLSfq{(=7&@u0G04(^)DtZ};(To{cq(j|-+htN*jEpuxFk0?Ru8XP3^z-&SNkURt^2 zTSfZcN5x^>ML|ky1rH}oViJ7+@cetDleV!hBksSwEn~4q@Xz`GmCrjHOK)GEd0p-B z(Y6SS8poDMuE(=E|4rGmcvp9MsGHU9V8)Ek>HE*irk%F9rK7RU-2N}yiz$uUO57Qx zXRAv!tdNVQd!7^~xNg;>=ojmFGC8tun)m$oP3PKhc*onS@K5?rr^}yu zUmUrRUESJJ=>F0}m;TMP>i;SjwwR~)_nQ*mc_z*-WwSXs6&fs_bqPz9s|2|0xg0$2 t@u$Pda=rYAtrOikX7%&GRsG&;Z1Lh{&yL;Ao6ROYUN$pxVgmyL003>zdZqvX diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp index 9126ae37cbc3587421d6889eadd1d91fbf1994d4..592575f8bd25f4e26afb061eee4cb4803608732e 100644 GIT binary patch literal 9650 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 literal 7778 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 diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 8d94de1..8ff55a4 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -39,4 +39,6 @@ Rechercher Race Sexe + Description : + Histoire : \ No newline at end of file diff --git a/app/src/main/res/values/ic_launcher_background.xml b/app/src/main/res/values/ic_launcher_background.xml new file mode 100644 index 0000000..0530591 --- /dev/null +++ b/app/src/main/res/values/ic_launcher_background.xml @@ -0,0 +1,4 @@ + + + #1C1B1F + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 745a89a..0390725 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -39,4 +39,6 @@ Search Race Gender + Description: + History: \ No newline at end of file