From 8ddbdc43f99af76ccdaaf38dcec1f7418d7ac5fe Mon Sep 17 00:00:00 2001 From: Odweta Date: Mon, 16 Dec 2024 09:53:19 +0100 Subject: [PATCH] improved lecture notes with a type and showing the name and number of the lecture --- .../src/main/java/com/odweta/solon/Global.kt | 44 ++++- .../main/java/com/odweta/solon/Timetable.kt | 175 +++++++++++++++--- .../src/main/java/com/odweta/solon/Util.kt | 38 +++- 3 files changed, 223 insertions(+), 34 deletions(-) diff --git a/mobile/app/src/main/java/com/odweta/solon/Global.kt b/mobile/app/src/main/java/com/odweta/solon/Global.kt index d4aa448..59718e7 100644 --- a/mobile/app/src/main/java/com/odweta/solon/Global.kt +++ b/mobile/app/src/main/java/com/odweta/solon/Global.kt @@ -7,6 +7,7 @@ import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.runtime.MutableState +import androidx.compose.runtime.mutableIntStateOf import androidx.compose.runtime.mutableStateOf import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color @@ -138,7 +139,48 @@ var resetNav: Boolean = false var isAPISetUp: Boolean = false -var lectureNotes: HashMap> = hashMapOf() +enum class LectureNoteType { + Normal, // obycejna poznamka + Writing, // pisemny test + Speaking, // ustni zkouseni + Other // cokoliv jineho +} + +fun String.toLectureNoteType(): LectureNoteType { + return when(this) { + "Normal" -> LectureNoteType.Normal + "Writing" -> LectureNoteType.Writing + "Speaking" -> LectureNoteType.Speaking + "Other" -> LectureNoteType.Other + else -> LectureNoteType.Normal + } +} + +class LectureNote( + id: Int, + note: MutableState, + type: MutableState, + number: MutableState, + lectureName: MutableState +) { + var id: Int = 0 + var note: MutableState = + mutableStateOf("") + var type: MutableState = + mutableStateOf(LectureNoteType.Normal) + var number: MutableState = mutableIntStateOf(0) + var lectureName: MutableState = mutableStateOf("") + + init { + this.id = id + this.note = note + this.type = type + this.number = number + this.lectureName = lectureName + } +} + +var lectureNotes: HashMap> = hashMapOf() var selectedLecture: Int = 0 var selectedDay: Int = 0 diff --git a/mobile/app/src/main/java/com/odweta/solon/Timetable.kt b/mobile/app/src/main/java/com/odweta/solon/Timetable.kt index eaed3d8..7dcfd02 100644 --- a/mobile/app/src/main/java/com/odweta/solon/Timetable.kt +++ b/mobile/app/src/main/java/com/odweta/solon/Timetable.kt @@ -23,22 +23,35 @@ import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.text.selection.TextSelectionColors import androidx.compose.foundation.verticalScroll +import androidx.compose.material3.Button +import androidx.compose.material3.ButtonColors +import androidx.compose.material3.DropdownMenu +import androidx.compose.material3.DropdownMenuItem import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Text import androidx.compose.material3.TextField import androidx.compose.material3.TextFieldDefaults import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableIntStateOf import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.focus.focusModifier import androidx.compose.ui.graphics.Color +import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.painterResource import androidx.compose.ui.text.font.FontStyle import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.compose.ui.window.Dialog import androidx.compose.ui.window.DialogProperties +import androidx.compose.ui.window.PopupProperties import androidx.compose.ui.zIndex import com.odweta.solon.ui.theme.PastelGreen import com.odweta.solon.ui.theme.PastelGreenTransparent @@ -46,6 +59,8 @@ import com.odweta.solon.ui.theme.PastelRed import com.odweta.solon.ui.theme.PastelRedTransparent import com.odweta.solon.ui.theme.PastelYellow import com.odweta.solon.ui.theme.PastelYellowTransparent +import kotlinx.coroutines.delay +import kotlinx.coroutines.launch import java.time.LocalDate import java.time.LocalTime import java.time.format.DateTimeFormatter @@ -86,29 +101,131 @@ fun DetailDialog() { shape = RoundedCornerShape(roundedCornerDimen) ) ) { - if (lectureNotes[selectedLecture] == null) { - lectureNotes[selectedLecture] = mutableStateOf("") - } - - TextField( - value = lectureNotes[selectedLecture]!!.value, - onValueChange = { newText: String -> - lectureNotes[selectedLecture]!!.value = newText - Util.saveLectureIds() - }, - placeholder = { Text("Sem můžete napsat poznámky k\u00A0této hodině.") }, - colors = TextFieldDefaults.textFieldColors( - focusedTextColor = Color.White, - containerColor = Color.Black, - selectionColors = TextSelectionColors( - handleColor = PastelYellow, - backgroundColor = PastelYellowTransparent - ), - cursorColor = PastelYellow, - focusedIndicatorColor = PastelYellow, - unfocusedIndicatorColor = PastelYellowTransparent + Column( + horizontalAlignment = Alignment.CenterHorizontally + ) { + Text( + text = "" + + lectureNotes[selectedLecture]?.value?.number?.value.toString() + + " – " + + lectureNotes[selectedLecture]?.value?.lectureName?.value.toString(), + color = Color.White, + textAlign = TextAlign.Left ) - ) + + /////////////////////////////////////////////////////////// + + var isExpanded by remember { mutableStateOf(false) } + + Button( + modifier = Modifier.background( + color = Color.Black, + shape = RoundedCornerShape(roundedCornerDimen) + ), + onClick = { isExpanded = true }, + colors = ButtonColors( + containerColor = Color.Black, + contentColor = Color.White, + disabledContainerColor = Color.Black, + disabledContentColor = Color.White + ) + ) { + val type = when (lectureNotes[selectedLecture]?.value?.type?.value) { + LectureNoteType.Normal -> "Normální" + LectureNoteType.Writing -> "Písemný test" + LectureNoteType.Speaking -> "Ústní zkoušení" + LectureNoteType.Other -> "Jiné" + else -> "Jiné" + } + Text("Typ poznámky: $type") + } + + DropdownMenu( + modifier = Modifier.background(color = Color.Black), + onDismissRequest = { isExpanded = false }, + expanded = isExpanded, + properties = PopupProperties( + excludeFromSystemGesture = false, + dismissOnClickOutside = true, + dismissOnBackPress = true, + focusable = true + ), + ) { + DropdownMenuItem( + enabled = true, + onClick = { + isExpanded = false + lectureNotes[selectedLecture]?.value?.type?.value = + LectureNoteType.Normal + }, + text = { Text("Normální poznámka", color = Color.White) } + ) + + DropdownMenuItem( + enabled = true, + onClick = { + isExpanded = false + lectureNotes[selectedLecture]?.value?.type?.value = + LectureNoteType.Writing + }, + text = { Text("Písemný test", color = Color.White) } + ) + + DropdownMenuItem( + enabled = true, + onClick = { + isExpanded = false + lectureNotes[selectedLecture]?.value?.type?.value = + LectureNoteType.Speaking + }, + text = { Text("Ústní zkoušení", color = Color.White) } + ) + + DropdownMenuItem( + enabled = true, + onClick = { + isExpanded = false + lectureNotes[selectedLecture]?.value?.type?.value = + LectureNoteType.Other + }, + text = { Text("Jiné", color = Color.White) } + ) + } + + //////////////////////////////////////////////// + + if (lectureNotes[selectedLecture] == null) { + lectureNotes[selectedLecture] = mutableStateOf( + LectureNote( + id = 0, + note = mutableStateOf(""), + type = mutableStateOf(LectureNoteType.Normal), + number = mutableIntStateOf(0), + lectureName = mutableStateOf("N/A") + ) + ) + } + + TextField( + value = lectureNotes[selectedLecture]?.value?.note?.value ?: "", + onValueChange = { newText: String -> + lectureNotes[selectedLecture]?.value?.note?.value = newText + Util.saveLectureIds() + }, + placeholder = { Text("Sem můžete napsat poznámky k\u00A0této hodině.") }, //   + colors = TextFieldDefaults.textFieldColors( + focusedTextColor = Color.White, + containerColor = Color.Black, + selectionColors = TextSelectionColors( + handleColor = PastelYellow, + backgroundColor = PastelYellowTransparent + ), + cursorColor = PastelYellow, + focusedIndicatorColor = PastelYellow, + unfocusedIndicatorColor = PastelYellowTransparent + ) + ) + } } } ) @@ -209,6 +326,7 @@ fun subjectModifier(d: Day, s: Subject, lectureNumber: Int): Modifier { } } +@SuppressLint("UnrememberedMutableState") @Composable private fun DayScreen(day: Day) { val scrollState = rememberScrollState() @@ -241,6 +359,17 @@ private fun DayScreen(day: Day) { ) { for ((subjectIndex, subject) in day.subjects.withIndex()) { val lectureId = Util.getLectureId(day.date, subjectIndex) + if (lectureNotes[lectureId] == null) { + lectureNotes[lectureId] = mutableStateOf(LectureNote( + id = lectureId, + note = mutableStateOf(""), + type = mutableStateOf(LectureNoteType.Normal), + number = mutableIntStateOf(0), + lectureName = mutableStateOf("N/A") + )) + } + lectureNotes[lectureId]?.value?.number?.value = subject.number.toInt() + lectureNotes[lectureId]?.value?.lectureName?.value = subject.name val amoledModifier = if (settings.useAmoledMode.checked.value) { Modifier .width(50.dp) @@ -415,7 +544,7 @@ private fun DayScreen(day: Day) { .clickable { selectedLecture = lectureId showDetailDialog.value = true - }) + }) } } } diff --git a/mobile/app/src/main/java/com/odweta/solon/Util.kt b/mobile/app/src/main/java/com/odweta/solon/Util.kt index 5a9ae0f..097d2f8 100644 --- a/mobile/app/src/main/java/com/odweta/solon/Util.kt +++ b/mobile/app/src/main/java/com/odweta/solon/Util.kt @@ -9,6 +9,7 @@ import android.os.Build import android.util.DisplayMetrics import android.view.WindowManager import androidx.compose.runtime.MutableState +import androidx.compose.runtime.mutableIntStateOf import androidx.compose.runtime.mutableStateOf import androidx.core.content.pm.PackageInfoCompat import java.io.File @@ -268,29 +269,46 @@ class Util { }) } - fun csvToHashMap(filePath: String): HashMap> { - val hashMap = HashMap>() + fun csvToHashMap(filePath: String): HashMap> { + val hashMap = HashMap>() val lines = fileToString(filePath).lines() for (line in lines) { if (line.isBlank()) continue val parts = line.split(",") - if (parts.size == 2) { - val key = parts[0].trim().toInt() - val value = parts[1].trim() - hashMap[key] = mutableStateOf("") - hashMap[key]!!.value = value + if (parts.size == 5) { + val id = parts[0].trim().toInt() + val note = parts[1].trim() + val type = parts[2].trim().toLectureNoteType() + val number = parts[3].trim().toInt() + val lectureName = parts[4].trim() + + val lectureNote = LectureNote( + id, + mutableStateOf(note), + mutableStateOf(type), + mutableIntStateOf(number), + mutableStateOf(lectureName) + ) + + hashMap[id] = mutableStateOf(lectureNote) } } return hashMap } - fun hashMapToCsv(hashMap: HashMap>): String { + fun hashMapToCsv(hashMap: HashMap>): String { var result = "" - for ((key, value) in hashMap) { - result += "$key,${value.value}\n" + for ((key, lectureNote) in hashMap) { + result += + "$key," + + "${lectureNote.value.note.value}," + + "${lectureNote.value.type.value}," + + "${lectureNote.value.number.value}," + + lectureNote.value.lectureName.value + + "\n" } return result }