diff --git a/mobile/.idea/caches/deviceStreaming.xml b/mobile/.idea/caches/deviceStreaming.xml
index 406736c..2717eab 100644
--- a/mobile/.idea/caches/deviceStreaming.xml
+++ b/mobile/.idea/caches/deviceStreaming.xml
@@ -146,6 +146,17 @@
+
+
+
+
+
+
+
+
+
+
+
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 e6258e0..6304aee 100644
--- a/mobile/app/src/main/java/com/odweta/solon/Timetable.kt
+++ b/mobile/app/src/main/java/com/odweta/solon/Timetable.kt
@@ -19,6 +19,7 @@ import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.pager.HorizontalPager
+import androidx.compose.foundation.pager.PagerState
import androidx.compose.foundation.pager.rememberPagerState
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.shape.RoundedCornerShape
@@ -65,8 +66,11 @@ 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.CoroutineScope
+import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
+import kotlinx.coroutines.withContext
import java.time.LocalDate
import java.time.LocalDateTime
import java.time.LocalTime
@@ -74,14 +78,63 @@ import java.time.format.DateTimeFormatter
var showDetailDialog by mutableStateOf(false)
+@OptIn(ExperimentalFoundationApi::class)
@Composable
fun TimetableScreen() {
- Box(
- modifier = Modifier.fillMaxSize(),
- contentAlignment = Alignment.BottomCenter
+ val pagerState = rememberPagerState(pageCount = { if (global.timetable.isNotEmpty()) global.timetable.size else 6 }) // FIXME
+ Column {
+ QuickDays(pagerState)
+ Box(
+ modifier = Modifier.fillMaxSize(),
+ contentAlignment = Alignment.BottomCenter
+ ) {
+ DayPager(pagerState)
+ if (showDetailDialog) DetailDialog()
+ }
+ }
+}
+
+@OptIn(ExperimentalFoundationApi::class)
+@Composable
+fun QuickDays(pagerState: PagerState) {
+ @Composable
+ fun QuickDay(day: Day, modifier: Modifier, idx: Int) {
+ val scope = rememberCoroutineScope()
+ Column(
+ horizontalAlignment = Alignment.CenterHorizontally,
+ verticalArrangement = Arrangement.Center,
+ modifier = modifier.padding(5.dp).background(
+ shape = RoundedCornerShape(global.dimens.roundedCorner),
+ color = PastelYellowTransparent
+ ).clickable(onClick = {
+ scope.launch {
+ withContext(Dispatchers.Main) {
+ pagerState.animateScrollToPage(idx)
+ }
+ }
+ })
+ ) {
+ Text(
+ text = "${day.name[0]}${day.name[1]}",
+ color = Color.White,
+ textAlign = TextAlign.Center,
+ fontWeight = FontWeight.Bold
+ )
+ Spacer(Modifier.height(5.dp))
+ Text(
+ text = day.date,
+ color = Color.White,
+ textAlign = TextAlign.Center
+ )
+ }
+ }
+
+ Row(
+ Modifier.fillMaxWidth().padding(bottom = 15.dp).padding(horizontal = 5.dp)
) {
- DayPager()
- if (showDetailDialog) DetailDialog()
+ for ((idx, day) in global.timetable.withIndex()) {
+ QuickDay(day, Modifier.weight(1f), idx)
+ }
}
}
@@ -227,8 +280,7 @@ fun DetailDialog() {
@OptIn(ExperimentalFoundationApi::class)
@Composable
-fun DayPager() {
- val pagerState = rememberPagerState(pageCount = { if (global.timetable.isNotEmpty()) global.timetable.size else 6 }) // FIXME
+fun DayPager(pagerState: PagerState) {
HorizontalPager(
state = pagerState,
modifier = Modifier.fillMaxSize()
@@ -274,6 +326,7 @@ private fun getSubjectColor(s: Subject, transparent: Boolean): Color {
}
}
}
+
fun isTimeBetweenT(givenTime: LocalTime, startTime: LocalTime, endTime: LocalTime): Boolean {
// Check if the given time is between startTime and endTime
return givenTime.isAfter(startTime) && givenTime.isBefore(endTime)