delete NewVocListScreen.kt, update NewWordScreen to display recently added items, and refactor VocabularyCard styling in LibraryComponents.kt.

This commit is contained in:
jonasgaudian
2026-02-16 22:39:56 +01:00
parent a7c83bb846
commit 3e3d6d9cd1
4 changed files with 47 additions and 1072 deletions

View File

@@ -127,7 +127,7 @@ fun AppCard(
// Animate height changes when expanding/collapsing // Animate height changes when expanding/collapsing
.animateContentSize(), .animateContentSize(),
shape = ComponentDefaults.CardShape, shape = ComponentDefaults.CardShape,
color = MaterialTheme.colorScheme.surfaceContainer color = MaterialTheme.colorScheme.surfaceContainer,
) { ) {
Column { Column {
// --- Header Row --- // --- Header Row ---

View File

@@ -385,14 +385,14 @@ fun VocabularyCard(
Card( Card(
modifier = modifier modifier = modifier
.fillMaxWidth() .fillMaxWidth()
.clip(RoundedCornerShape(16.dp)) .clip(RoundedCornerShape(8.dp))
.combinedClickable( .combinedClickable(
onClick = onItemClick, onClick = onItemClick,
onLongClick = onItemLongClick onLongClick = onItemLongClick
), ),
shape = RoundedCornerShape(16.dp),
colors = CardDefaults.cardColors( colors = CardDefaults.cardColors(
containerColor = if (isSelected) MaterialTheme.colorScheme.primaryContainer else MaterialTheme.colorScheme.surfaceVariant containerColor = if (isSelected) MaterialTheme.colorScheme.primaryContainer else MaterialTheme.colorScheme.surfaceContainer,
contentColor = if (isSelected) MaterialTheme.colorScheme.onPrimaryContainer else MaterialTheme.colorScheme.surfaceContainer
), ),
border = if (isSelected) BorderStroke(2.dp, MaterialTheme.colorScheme.primary) else null border = if (isSelected) BorderStroke(2.dp, MaterialTheme.colorScheme.primary) else null
) { ) {

View File

@@ -68,9 +68,9 @@ import eu.gaudian.translator.view.composable.AppOutlinedButton
import eu.gaudian.translator.view.composable.AppSlider import eu.gaudian.translator.view.composable.AppSlider
import eu.gaudian.translator.view.composable.AppTopAppBar import eu.gaudian.translator.view.composable.AppTopAppBar
import eu.gaudian.translator.view.composable.InspiringSearchField import eu.gaudian.translator.view.composable.InspiringSearchField
import eu.gaudian.translator.view.composable.SingleLanguageDropDown
import eu.gaudian.translator.view.composable.SourceLanguageDropdown import eu.gaudian.translator.view.composable.SourceLanguageDropdown
import eu.gaudian.translator.view.composable.TargetLanguageDropdown import eu.gaudian.translator.view.composable.TargetLanguageDropdown
import eu.gaudian.translator.view.library.VocabularyCard
import eu.gaudian.translator.viewmodel.LanguageViewModel import eu.gaudian.translator.viewmodel.LanguageViewModel
import eu.gaudian.translator.viewmodel.VocabularyViewModel import eu.gaudian.translator.viewmodel.VocabularyViewModel
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
@@ -85,6 +85,8 @@ fun NewWordScreen(
val languageViewModel: LanguageViewModel = hiltViewModel(viewModelStoreOwner = activity) val languageViewModel: LanguageViewModel = hiltViewModel(viewModelStoreOwner = activity)
val isGenerating by vocabularyViewModel.isGenerating.collectAsState() val isGenerating by vocabularyViewModel.isGenerating.collectAsState()
val generatedItems by vocabularyViewModel.generatedVocabularyItems.collectAsState() val generatedItems by vocabularyViewModel.generatedVocabularyItems.collectAsState()
val allLanguages by languageViewModel.allLanguages.collectAsState()
val recentItems by vocabularyViewModel.vocabularyItems.collectAsState()
val coroutineScope = rememberCoroutineScope() val coroutineScope = rememberCoroutineScope()
var category by remember { mutableStateOf("") } var category by remember { mutableStateOf("") }
var amount by remember { mutableFloatStateOf(8f) } var amount by remember { mutableFloatStateOf(8f) }
@@ -111,6 +113,10 @@ fun NewWordScreen(
var selectedLangSecond by remember { mutableStateOf<Language?>(null) } var selectedLangSecond by remember { mutableStateOf<Language?>(null) }
var parseError by remember { mutableStateOf<String?>(null) } var parseError by remember { mutableStateOf<String?>(null) }
val recentlyAdded = remember(recentItems) {
recentItems.sortedByDescending { it.id }.take(4)
}
fun parseCsv(text: String): List<List<String>> { fun parseCsv(text: String): List<List<String>> {
if (text.isBlank()) return emptyList() if (text.isBlank()) return emptyList()
val candidates = listOf(',', ';', '\t') val candidates = listOf(',', ';', '\t')
@@ -265,6 +271,40 @@ fun NewWordScreen(
} }
) )
if (recentlyAdded.isNotEmpty()) {
Spacer(modifier = Modifier.height(32.dp))
Column {
Row(
modifier = Modifier.fillMaxWidth(),
horizontalArrangement = Arrangement.SpaceBetween,
verticalAlignment = Alignment.CenterVertically
) {
Text(
text = "Recently Added",
style = MaterialTheme.typography.titleMedium,
fontWeight = FontWeight.Bold
)
TextButton(onClick = { navController.navigate("library") }) {
Text("View All")
}
}
Spacer(modifier = Modifier.height(12.dp))
Column(verticalArrangement = Arrangement.spacedBy(12.dp)) {
recentlyAdded.forEach { item ->
VocabularyCard(
item = item,
allLanguages = allLanguages,
isSelected = false,
onItemClick = { navController.navigate("vocabulary_detail/${item.id}") },
onItemLongClick = {},
onDeleteClick = {}
)
}
}
}
}
// Extra padding at the bottom for scroll clearance // Extra padding at the bottom for scroll clearance
Spacer(modifier = Modifier.height(100.dp)) Spacer(modifier = Modifier.height(100.dp))
} }
@@ -313,7 +353,7 @@ fun NewWordScreen(
Row(horizontalArrangement = Arrangement.spacedBy(8.dp), verticalAlignment = Alignment.CenterVertically) { Row(horizontalArrangement = Arrangement.spacedBy(8.dp), verticalAlignment = Alignment.CenterVertically) {
Column(modifier = Modifier.weight(1f)) { Column(modifier = Modifier.weight(1f)) {
Text(stringResource(R.string.label_first_language)) Text(stringResource(R.string.label_first_language))
SingleLanguageDropDown( eu.gaudian.translator.view.composable.SingleLanguageDropDown(
languageViewModel = languageViewModel, languageViewModel = languageViewModel,
selectedLanguage = selectedLangFirst, selectedLanguage = selectedLangFirst,
onLanguageSelected = { selectedLangFirst = it } onLanguageSelected = { selectedLangFirst = it }
@@ -321,7 +361,7 @@ fun NewWordScreen(
} }
Column(modifier = Modifier.weight(1f)) { Column(modifier = Modifier.weight(1f)) {
Text(stringResource(R.string.label_second_language)) Text(stringResource(R.string.label_second_language))
SingleLanguageDropDown( eu.gaudian.translator.view.composable.SingleLanguageDropDown(
languageViewModel = languageViewModel, languageViewModel = languageViewModel,
selectedLanguage = selectedLangSecond, selectedLanguage = selectedLangSecond,
onLanguageSelected = { selectedLangSecond = it } onLanguageSelected = { selectedLangSecond = it }