improved lecture notes with a type and showing the name and number of the lecture

This commit is contained in:
Odweta
2024-12-16 09:53:19 +01:00
parent 3bb5ce5ca7
commit 8ddbdc43f9
3 changed files with 223 additions and 34 deletions
@@ -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<Int, MutableState<String>> = 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<String>,
type: MutableState<LectureNoteType>,
number: MutableState<Int>,
lectureName: MutableState<String>
) {
var id: Int = 0
var note: MutableState<String> =
mutableStateOf("")
var type: MutableState<LectureNoteType> =
mutableStateOf(LectureNoteType.Normal)
var number: MutableState<Int> = mutableIntStateOf(0)
var lectureName: MutableState<String> = mutableStateOf("")
init {
this.id = id
this.note = note
this.type = type
this.number = number
this.lectureName = lectureName
}
}
var lectureNotes: HashMap<Int, MutableState<LectureNote>> = hashMapOf()
var selectedLecture: Int = 0
var selectedDay: Int = 0
@@ -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ě.") }, // &nbsp;
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
})
})
}
}
}
@@ -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<Int, MutableState<String>> {
val hashMap = HashMap<Int, MutableState<String>>()
fun csvToHashMap(filePath: String): HashMap<Int, MutableState<LectureNote>> {
val hashMap = HashMap<Int, MutableState<LectureNote>>()
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<Int, MutableState<String>>): String {
fun hashMapToCsv(hashMap: HashMap<Int, MutableState<LectureNote>>): 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
}