Update colors

Add average to NotenActivity
Fix Bugs in NotenActivity and FachActivity
This commit is contained in:
BuildTools
2024-04-18 13:22:45 +02:00
parent dbfed92a42
commit 888d737965
12 changed files with 261 additions and 80 deletions

View File

@@ -1,5 +1,7 @@
package com.schoolapp.cleverclass
import android.content.Context
import android.content.SharedPreferences.Editor
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
@@ -25,6 +27,7 @@ import androidx.compose.material.icons.filled.KeyboardArrowDown
import androidx.compose.material.icons.filled.KeyboardArrowUp
import androidx.compose.material.icons.outlined.Delete
import androidx.compose.material.icons.outlined.Edit
import androidx.compose.material3.AlertDialog
import androidx.compose.material3.BottomAppBar
import androidx.compose.material3.DropdownMenu
import androidx.compose.material3.DropdownMenuItem
@@ -102,17 +105,14 @@ class FachActivity : ComponentActivity() {
}
}
}
/* TODO: save data when activity is destroyed
override fun onDestroy() {
super.onDestroy()
} */
}
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun GradeContent(activity: ComponentActivity, loadedGrades: List<GradeData>){
val sharedPreferences = activity.getSharedPreferences("gradeAverages", Context.MODE_PRIVATE)
val editor = sharedPreferences.edit()
var grades by remember {
mutableStateOf(loadedGrades)
}
@@ -120,6 +120,10 @@ fun GradeContent(activity: ComponentActivity, loadedGrades: List<GradeData>){
mutableStateOf(0.00f)
}
var showDeleteConfirmation by remember {
mutableStateOf(false)
}
val colors = listOf(
Color(0xFF536DFE),
Color(0xFF448AFF),
@@ -130,7 +134,7 @@ fun GradeContent(activity: ComponentActivity, loadedGrades: List<GradeData>){
)
LaunchedEffect(grades) {
average = calculateAverage(grades)
average = calculateAverage(grades, editor)
}
DisposableEffect(activity) {
@@ -147,7 +151,8 @@ fun GradeContent(activity: ComponentActivity, loadedGrades: List<GradeData>){
colors = TopAppBarDefaults.centerAlignedTopAppBarColors(MaterialTheme.colorScheme.primaryContainer),
title = {
Text(text = name,
style = MaterialTheme.typography.headlineSmall
style = MaterialTheme.typography.headlineSmall,
color = MaterialTheme.colorScheme.onPrimaryContainer
)},
navigationIcon = {
IconButton(onClick = {
@@ -159,17 +164,18 @@ fun GradeContent(activity: ComponentActivity, loadedGrades: List<GradeData>){
Icon(
imageVector = Icons.Filled.ArrowBack,
contentDescription = null,
modifier = Modifier.size(28.dp)
modifier = Modifier.size(28.dp),
tint = MaterialTheme.colorScheme.onPrimaryContainer
)
}
},
// TODO: add confirmation to delete all
actions = {
IconButton(onClick = { grades = emptyList() }) {
IconButton(onClick = { showDeleteConfirmation = true }) {
Icon(
imageVector = Icons.Outlined.Delete,
contentDescription = null,
modifier = Modifier.size(28.dp)
modifier = Modifier.size(28.dp),
tint = MaterialTheme.colorScheme.onPrimaryContainer
)
}
},
@@ -219,6 +225,7 @@ fun GradeContent(activity: ComponentActivity, loadedGrades: List<GradeData>){
{
grades.forEach{ gradeData ->
GradePrefab(
id = gradeData.id,
onClose = { grades = grades.filter { it.id != gradeData.id } },
type = gradeData.type,
grade = gradeData.grade,
@@ -226,21 +233,54 @@ fun GradeContent(activity: ComponentActivity, loadedGrades: List<GradeData>){
color = gradeData.color,
onGradeChange = { grade ->
grades.find { it.id == gradeData.id }?.grade = grade
average = calculateAverage(grades) },
average = calculateAverage(grades, editor) },
onWeightChange = { weight ->
grades.find { it.id == gradeData.id }?.weight = weight
average = calculateAverage(grades) },
average = calculateAverage(grades, editor) },
onTypeChange = { type ->
grades.find { it.id == gradeData.id }?.type = type
average = calculateAverage(grades) })
average = calculateAverage(grades, editor) }
)
}
Spacer(modifier = Modifier.height(216.dp))
}
}
if (showDeleteConfirmation){
AlertDialog(
onDismissRequest = { showDeleteConfirmation = false },
text = { Text(text = "Möchten Sie wirklich alle Noten löschen?", color = MaterialTheme.colorScheme.onPrimaryContainer, style = MaterialTheme.typography.labelMedium) },
confirmButton = {
Row(modifier = Modifier.fillMaxWidth()){
Text(
text = "Bestätigen",
color = MaterialTheme.colorScheme.secondary,
style = MaterialTheme.typography.labelMedium,
modifier = Modifier.clickable {
grades = emptyList()
editor.putFloat(name, 0.0f).apply()
showDeleteConfirmation = false
}
)
Spacer(modifier = Modifier.weight(1f))
Text(
text = "Abbrechen",
color = MaterialTheme.colorScheme.secondary,
style = MaterialTheme.typography.labelMedium,
modifier = Modifier.clickable { showDeleteConfirmation = false }
)
}
},
containerColor = MaterialTheme.colorScheme.primaryContainer
)
}
}
@Composable
fun GradePrefab(
id: Int,
onClose: () -> Unit,
type: String,
grade: Int,
@@ -248,30 +288,30 @@ fun GradePrefab(
color: Color,
onGradeChange: (grade: Int) -> Unit,
onWeightChange: (weight: Float) -> Unit,
onTypeChange: (type: String) -> Unit
onTypeChange: (type: String) -> Unit,
){
var editing by remember {
var editing by remember(id) {
mutableStateOf(false)
}
var typeExpanded by remember {
var typeExpanded by remember(id) {
mutableStateOf(false)
}
var gradeExpanded by remember {
var gradeExpanded by remember(id) {
mutableStateOf(false)
}
var weightExpanded by remember {
var weightExpanded by remember(id) {
mutableStateOf(false)
}
var selectedType by remember {
var selectedType by remember(id) {
mutableStateOf(type)
}
var selectedGrade by remember {
var selectedGrade by remember(id) {
mutableStateOf(grade)
}
var selectedWeight by remember {
var selectedWeight by remember(id) {
mutableStateOf(weight)
}
@@ -483,7 +523,7 @@ data class GradeData(
var type: String
)
fun calculateAverage(grades: List<GradeData>): Float {
fun calculateAverage(grades: List<GradeData>, editor: Editor): Float {
if (grades.isEmpty()) return 0.0f
var totalGrade = 0.0f
@@ -507,15 +547,11 @@ fun calculateAverage(grades: List<GradeData>): Float {
val saAverage = saTotalGrade / saTotalWeights
return if (smallAverage.isNaN()) saAverage
val finalGrade = if (smallAverage.isNaN()) saAverage
else if (saAverage.isNaN()) smallAverage
else (smallAverage + saAverage * SAWeight) / (1 + SAWeight)
}
fun formatFloat(number: Float): String {
var formattedString = number.toString()
formattedString = formattedString.substring(0, if(formattedString.length == 3) 3 else 4)
return formattedString
editor.putFloat(name, finalGrade).apply()
return finalGrade
}