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
.animateContentSize(),
shape = ComponentDefaults.CardShape,
color = MaterialTheme.colorScheme.surfaceContainer
color = MaterialTheme.colorScheme.surfaceContainer,
) {
Column {
// --- Header Row ---

View File

@@ -385,14 +385,14 @@ fun VocabularyCard(
Card(
modifier = modifier
.fillMaxWidth()
.clip(RoundedCornerShape(16.dp))
.clip(RoundedCornerShape(8.dp))
.combinedClickable(
onClick = onItemClick,
onLongClick = onItemLongClick
),
shape = RoundedCornerShape(16.dp),
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
) {

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.AppTopAppBar
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.TargetLanguageDropdown
import eu.gaudian.translator.view.library.VocabularyCard
import eu.gaudian.translator.viewmodel.LanguageViewModel
import eu.gaudian.translator.viewmodel.VocabularyViewModel
import kotlinx.coroutines.launch
@@ -85,6 +85,8 @@ fun NewWordScreen(
val languageViewModel: LanguageViewModel = hiltViewModel(viewModelStoreOwner = activity)
val isGenerating by vocabularyViewModel.isGenerating.collectAsState()
val generatedItems by vocabularyViewModel.generatedVocabularyItems.collectAsState()
val allLanguages by languageViewModel.allLanguages.collectAsState()
val recentItems by vocabularyViewModel.vocabularyItems.collectAsState()
val coroutineScope = rememberCoroutineScope()
var category by remember { mutableStateOf("") }
var amount by remember { mutableFloatStateOf(8f) }
@@ -111,6 +113,10 @@ fun NewWordScreen(
var selectedLangSecond by remember { mutableStateOf<Language?>(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>> {
if (text.isBlank()) return emptyList()
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
Spacer(modifier = Modifier.height(100.dp))
}
@@ -313,7 +353,7 @@ fun NewWordScreen(
Row(horizontalArrangement = Arrangement.spacedBy(8.dp), verticalAlignment = Alignment.CenterVertically) {
Column(modifier = Modifier.weight(1f)) {
Text(stringResource(R.string.label_first_language))
SingleLanguageDropDown(
eu.gaudian.translator.view.composable.SingleLanguageDropDown(
languageViewModel = languageViewModel,
selectedLanguage = selectedLangFirst,
onLanguageSelected = { selectedLangFirst = it }
@@ -321,7 +361,7 @@ fun NewWordScreen(
}
Column(modifier = Modifier.weight(1f)) {
Text(stringResource(R.string.label_second_language))
SingleLanguageDropDown(
eu.gaudian.translator.view.composable.SingleLanguageDropDown(
languageViewModel = languageViewModel,
selectedLanguage = selectedLangSecond,
onLanguageSelected = { selectedLangSecond = it }