improved lecture notes with a type and showing the name and number of the lecture
This commit is contained in:
@@ -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ě.") }, //
|
||||
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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user