From 70b83d7900802dc2b71dc2590a6759284787a7a1 Mon Sep 17 00:00:00 2001 From: webfussel Date: Mon, 4 Aug 2025 09:11:59 +0200 Subject: [PATCH] ADD: history --- .../de/webfussel/soulecho/MainActivity.kt | 5 +- .../de/webfussel/soulecho/history/Section.kt | 137 ++++++++++++++++-- 2 files changed, 125 insertions(+), 17 deletions(-) diff --git a/app/src/main/java/de/webfussel/soulecho/MainActivity.kt b/app/src/main/java/de/webfussel/soulecho/MainActivity.kt index 7bd1820..1549140 100644 --- a/app/src/main/java/de/webfussel/soulecho/MainActivity.kt +++ b/app/src/main/java/de/webfussel/soulecho/MainActivity.kt @@ -57,7 +57,10 @@ fun SoulEchoApp(moodViewModel: MoodViewModel) { ) } "history" -> { - HistorySection() + HistorySection( + moodViewModel = moodViewModel, + paddingValues = paddingValues, + ) } } } diff --git a/app/src/main/java/de/webfussel/soulecho/history/Section.kt b/app/src/main/java/de/webfussel/soulecho/history/Section.kt index 31aa377..cfbb400 100644 --- a/app/src/main/java/de/webfussel/soulecho/history/Section.kt +++ b/app/src/main/java/de/webfussel/soulecho/history/Section.kt @@ -1,32 +1,137 @@ + package de.webfussel.soulecho.history +import androidx.compose.foundation.background import androidx.compose.foundation.layout.* -import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.Text +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.material3.* import androidx.compose.runtime.Composable +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.res.painterResource import androidx.compose.ui.unit.dp +import de.webfussel.soulecho.data.entity.MoodEntity +import de.webfussel.soulecho.mood.Moods.getMoodById +import de.webfussel.soulecho.ui.theme.getColorForMood +import de.webfussel.soulecho.viewmodel.MoodViewModel +import java.time.format.DateTimeFormatter @Composable -fun HistorySection() { - Column( +fun HistorySection( + moodViewModel: MoodViewModel, + paddingValues: PaddingValues = PaddingValues(0.dp) +) { + val allMoods by moodViewModel.allMoods.collectAsState(initial = emptyList()) + + LazyColumn( + contentPadding = PaddingValues( + top = paddingValues.calculateTopPadding(), + bottom = paddingValues.calculateBottomPadding(), + ), modifier = Modifier - .fillMaxSize() - .padding(16.dp), - horizontalAlignment = Alignment.CenterHorizontally, - verticalArrangement = Arrangement.Center + .fillMaxSize(), ) { - Text( - text = "Verlauf", - style = MaterialTheme.typography.headlineMedium - ) - - Spacer(modifier = Modifier.height(16.dp)) + if (allMoods.isEmpty()) { + item { + EmptyHistoryCard() + } + } else { + items( + items = allMoods, + key = { moodEntity -> moodEntity.id } + ) { moodEntity -> + MoodHistoryCard( + moodEntity = moodEntity, + onDelete = { moodViewModel.deleteMood(it) } + ) + } + } + } +} +@Composable +fun MoodHistoryCard( + moodEntity: MoodEntity, + onDelete: (MoodEntity) -> Unit +) { + Column ( + modifier = Modifier + .background(Color.White) + .padding(16.dp), + ){ + Row( + modifier = Modifier + .fillMaxWidth(), + verticalAlignment = Alignment.CenterVertically + ) { + val currentMood = getMoodById(moodEntity.mood) + Icon( + painter = painterResource(currentMood.icon), + contentDescription = currentMood.label, + tint = getColorForMood(moodEntity.mood).fg, + modifier = Modifier.size(48.dp) + ) + Column ( + modifier = Modifier.padding(start = 16.dp) + ){ + Text( + text = currentMood.label, + style = MaterialTheme.typography.headlineSmall, + color = MaterialTheme.colorScheme.onSurfaceVariant + ) + Text( + text = moodEntity.info, + style = MaterialTheme.typography.bodyMedium, + color = MaterialTheme.colorScheme.onSurfaceVariant, + ) + } + } Text( - text = "Hier wird der Stimmungsverlauf angezeigt", - style = MaterialTheme.typography.bodyLarge + text = moodEntity.timestamp.format( + DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm") + ), + style = MaterialTheme.typography.bodySmall, + color = Color.Black, + modifier = Modifier.padding(top = 4.dp) ) } + HorizontalDivider( + thickness = 1.dp, + color = Color.LightGray, + ) +} + +@Composable +fun EmptyHistoryCard() { + Card( + modifier = Modifier.fillMaxWidth(), + elevation = CardDefaults.cardElevation(defaultElevation = 2.dp) + ) { + Box( + modifier = Modifier + .fillMaxWidth() + .padding(32.dp), + contentAlignment = Alignment.Center + ) { + Column( + horizontalAlignment = Alignment.CenterHorizontally + ) { + Text( + text = "Keine Stimmungen gefunden", + style = MaterialTheme.typography.headlineSmall, + color = MaterialTheme.colorScheme.onSurfaceVariant + ) + Text( + text = "Beginnen Sie damit, Ihre erste Stimmung zu erfassen!", + style = MaterialTheme.typography.bodyMedium, + color = MaterialTheme.colorScheme.onSurfaceVariant, + modifier = Modifier.padding(top = 8.dp) + ) + } + } + } } \ No newline at end of file