Update colors
Add average to NotenActivity Fix Bugs in NotenActivity and FachActivity
This commit is contained in:
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user