delete NewVocListScreen.kt, update NewWordScreen to display recently added items, and refactor VocabularyCard styling in LibraryComponents.kt.
This commit is contained in:
@@ -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 ---
|
||||||
|
|||||||
@@ -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
|
||||||
) {
|
) {
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -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 }
|
||||||
|
|||||||
Reference in New Issue
Block a user