Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
48 changes: 47 additions & 1 deletion composeApp/src/commonMain/kotlin/cn/edu/ubaa/App.kt
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package cn.edu.ubaa

import androidx.compose.foundation.background
import androidx.compose.foundation.isSystemInDarkTheme
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.heightIn
Expand All @@ -11,7 +12,9 @@ import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.material3.TextButton
import androidx.compose.runtime.*
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalUriHandler
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
Expand All @@ -23,11 +26,14 @@ import cn.edu.ubaa.api.auth.AppAnnouncement
import cn.edu.ubaa.api.auth.AppVersionCheckResponse
import cn.edu.ubaa.api.auth.UpdateService
import cn.edu.ubaa.api.storage.AnnouncementReadStore
import cn.edu.ubaa.api.storage.StoredThemePreferences
import cn.edu.ubaa.api.storage.ThemePreferenceStore
import cn.edu.ubaa.ui.common.components.ReleaseNotesText
import cn.edu.ubaa.ui.navigation.MainAppScreen
import cn.edu.ubaa.ui.screens.auth.AuthViewModel
import cn.edu.ubaa.ui.screens.auth.ConnectionModeSelectionScreen
import cn.edu.ubaa.ui.screens.auth.LoginScreen
import cn.edu.ubaa.ui.screens.menu.ThemeMode
import cn.edu.ubaa.ui.screens.splash.SplashScreen
import cn.edu.ubaa.ui.theme.PreloadFonts
import cn.edu.ubaa.ui.theme.UBAATheme
Expand All @@ -48,7 +54,39 @@ fun App() {
// 预加载应用所需的中文字体
PreloadFonts()

UBAATheme {
val systemDarkTheme = isSystemInDarkTheme()
val storedThemePreferences = remember { ThemePreferenceStore.get() }
var themeMode by rememberSaveable {
mutableStateOf(ThemeMode.fromStorageKey(storedThemePreferences.themeMode))
}
var themeColorValue by rememberSaveable { mutableStateOf(storedThemePreferences.seedColorValue) }
var useDynamicColor by rememberSaveable { mutableStateOf(storedThemePreferences.useDynamicColor) }
var oledEnhance by rememberSaveable { mutableStateOf(storedThemePreferences.oledEnhance) }
val themeColor = Color(themeColorValue)
val darkTheme =
Comment on lines +57 to +66
when (themeMode) {
ThemeMode.SYSTEM -> systemDarkTheme
ThemeMode.LIGHT -> false
ThemeMode.DARK -> true
}

LaunchedEffect(themeMode, themeColorValue, useDynamicColor, oledEnhance) {
ThemePreferenceStore.save(
StoredThemePreferences(
themeMode = themeMode.storageKey,
seedColorValue = themeColorValue,
useDynamicColor = useDynamicColor,
oledEnhance = oledEnhance,
)
)
}

UBAATheme(
darkTheme = darkTheme,
seedColor = themeColor,
dynamicColor = useDynamicColor,
oledEnhance = oledEnhance,
) {
Comment on lines +84 to +89
val authViewModel: AuthViewModel = viewModel { AuthViewModel() }
val uiState by authViewModel.uiState.collectAsState()
val loginForm by authViewModel.loginForm.collectAsState()
Expand Down Expand Up @@ -199,6 +237,14 @@ fun App() {
authViewModel.switchConnectionMode(mode)
appScope.launch { checkStartupPrompts() }
},
themeMode = themeMode,
onThemeModeSelected = { themeMode = it },
themeColorValue = themeColorValue,
onColorSelected = { themeColorValue = it },
useDynamicColor = useDynamicColor,
onToggleDynamicColor = { useDynamicColor = it },
oledEnhance = oledEnhance,
onToggleOledEnhance = { oledEnhance = it },
onLogoutClick = { authViewModel.logout() },
modifier = Modifier.fillMaxSize(),
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.automirrored.filled.ExitToApp
import androidx.compose.material.icons.filled.AccountCircle
import androidx.compose.material.icons.filled.Brush
import androidx.compose.material.icons.filled.Info
import androidx.compose.material.icons.filled.Person
import androidx.compose.material.icons.filled.Settings
Expand All @@ -44,6 +45,7 @@ fun Sidebar(
onLogoutClick: () -> Unit,
onMyClick: () -> Unit,
onSettingsClick: () -> Unit,
onAppearanceClick: () -> Unit,
onAboutClick: () -> Unit,
modifier: Modifier = Modifier,
) {
Expand Down Expand Up @@ -117,6 +119,10 @@ fun Sidebar(

Spacer(modifier = Modifier.height(8.dp))

SidebarMenuItem(icon = Icons.Default.Brush, title = "外观设置", onClick = onAppearanceClick)

Spacer(modifier = Modifier.height(8.dp))

SidebarMenuItem(icon = Icons.Default.Info, title = "关于", onClick = onAboutClick)

Spacer(modifier = Modifier.weight(1f))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,18 @@ import cn.edu.ubaa.ui.screens.libbook.LibBookBookingsScreen
import cn.edu.ubaa.ui.screens.libbook.LibBookHomeScreen
import cn.edu.ubaa.ui.screens.libbook.LibBookReserveScreen
import cn.edu.ubaa.ui.screens.libbook.LibBookViewModel
import cn.edu.ubaa.ui.screens.menu.*
import cn.edu.ubaa.ui.screens.menu.AboutScreen
import cn.edu.ubaa.ui.screens.menu.AdvancedFeaturesScreen
import cn.edu.ubaa.ui.screens.menu.HomeScreen
import cn.edu.ubaa.ui.screens.menu.HomeTodoAction
import cn.edu.ubaa.ui.screens.menu.HomeTodoItem
import cn.edu.ubaa.ui.screens.menu.HomeTodoSource
import cn.edu.ubaa.ui.screens.menu.MyScreen
import cn.edu.ubaa.ui.screens.menu.RegularFeaturesScreen
import cn.edu.ubaa.ui.screens.menu.SettingsScreen
import cn.edu.ubaa.ui.screens.menu.ThemeMode
import cn.edu.ubaa.ui.screens.menu.ThemeSettingsScreen
import cn.edu.ubaa.ui.screens.menu.buildHomeTodoItems
import cn.edu.ubaa.ui.screens.schedule.CourseDetailScreen
import cn.edu.ubaa.ui.screens.schedule.ScheduleScreen
import cn.edu.ubaa.ui.screens.schedule.ScheduleViewModel
Expand All @@ -81,6 +92,7 @@ enum class AppScreen {
ADVANCED,
MY,
SETTINGS,
THEME_SETTINGS,
ABOUT,
SCHEDULE,
EXAM,
Expand Down Expand Up @@ -126,6 +138,14 @@ fun MainAppScreen(
availableConnectionModes: List<ConnectionMode>,
onEnsureUserInfo: () -> Unit,
onConnectionModeSelected: (ConnectionMode) -> Unit,
themeMode: ThemeMode,
onThemeModeSelected: (ThemeMode) -> Unit,
themeColorValue: Long,
onColorSelected: (Long) -> Unit,
useDynamicColor: Boolean,
onToggleDynamicColor: (Boolean) -> Unit,
oledEnhance: Boolean,
onToggleOledEnhance: (Boolean) -> Unit,
onLogoutClick: () -> Unit,
modifier: Modifier = Modifier,
) {
Expand Down Expand Up @@ -553,6 +573,7 @@ fun MainAppScreen(
AppScreen.ADVANCED -> "高级功能"
AppScreen.MY -> "我的"
AppScreen.SETTINGS -> "设置"
AppScreen.THEME_SETTINGS -> "外观设置"
AppScreen.ABOUT -> "关于"
AppScreen.SCHEDULE -> "课程表"
AppScreen.EXAM -> "考试查询"
Expand Down Expand Up @@ -703,6 +724,17 @@ fun MainAppScreen(
availableModes = availableConnectionModes,
onModeSelected = onConnectionModeSelected,
)
AppScreen.THEME_SETTINGS ->
ThemeSettingsScreen(
themeMode = themeMode,
selectedColorValue = themeColorValue,
onColorSelected = onColorSelected,
useDynamicColor = useDynamicColor,
onToggleDynamicColor = onToggleDynamicColor,
oledEnhance = oledEnhance,
onThemeModeSelected = onThemeModeSelected,
onToggleOledEnhance = onToggleOledEnhance,
)
AppScreen.ABOUT -> AboutScreen()
AppScreen.SCHEDULE ->
ScheduleScreen(
Expand Down Expand Up @@ -928,6 +960,7 @@ fun MainAppScreen(
AppScreen.COURSE_DETAIL,
AppScreen.MY,
AppScreen.SETTINGS,
AppScreen.THEME_SETTINGS,
AppScreen.ABOUT,
AppScreen.BYKC_HOME,
AppScreen.BYKC_COURSES,
Expand Down Expand Up @@ -993,6 +1026,10 @@ fun MainAppScreen(
showSidebar = false
navigateTo(AppScreen.SETTINGS)
},
onAppearanceClick = {
showSidebar = false
navigateTo(AppScreen.THEME_SETTINGS)
},
onAboutClick = {
showSidebar = false
navigateTo(AppScreen.ABOUT)
Expand Down
Loading
Loading