refactor: 优化颜色模式和主题色版的性能与样式

This commit is contained in:
Super12138 2025-11-09 19:13:42 +08:00
parent 84c49542c0
commit a7311bfddf
4 changed files with 47 additions and 52 deletions

View file

@ -63,12 +63,12 @@ fun SettingsAppearance(
)
DarkModePicker(
currentDarkMode = DarkMode.fromId(darkMode),
currentDarkMode = { DarkMode.fromId(darkMode) },
onDarkModeChange = { scope.launch { DataStoreManager.setDarkMode(it.id) } }
)
PalettePicker(
currentPalette = PaletteStyle.fromId(paletteStyle),
currentPalette = { PaletteStyle.fromId(paletteStyle) },
onPaletteChange = { scope.launch { DataStoreManager.setPaletteStyle(it.id) } },
isDynamicColor = dynamicColor,
isDarkMode = DarkMode.fromId(darkMode),

View file

@ -2,7 +2,11 @@ package cn.super12138.todo.ui.pages.settings.components.appearance.darkmode
import androidx.compose.foundation.isSystemInDarkTheme
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.lazy.items
import androidx.compose.runtime.Composable
import androidx.compose.runtime.derivedStateOf
import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalContext
@ -14,12 +18,15 @@ import cn.super12138.todo.ui.theme.DarkMode
@Composable
fun DarkModePicker(
currentDarkMode: DarkMode,
currentDarkMode: () -> DarkMode,
onDarkModeChange: (darkMode: DarkMode) -> Unit,
modifier: Modifier = Modifier
) {
val context = LocalContext.current
val isInDarkTheme = isSystemInDarkTheme()
val darkModeList = remember { DarkMode.entries.toList() }
LazyRowSettingsItem(
title = stringResource(R.string.pref_dark_mode),
description = stringResource(R.string.pref_dark_mode_desc),
@ -27,37 +34,22 @@ fun DarkModePicker(
fadedEdgeWidth = 8.dp,
modifier = modifier
) {
item {
DarkModeItem(
icon = DarkMode.FollowSystem.icon,
name = DarkMode.FollowSystem.getDisplayName(context),
contentColor = if (isInDarkTheme) Color.White else Color.Black,
containerColor = if (isInDarkTheme) Color.Black else Color.White,
selected = currentDarkMode == DarkMode.FollowSystem,
onSelect = { onDarkModeChange(DarkMode.FollowSystem) }
)
}
items(items = darkModeList, key = { it.id }) {
val (contentColor, containerColor) = when (it) {
DarkMode.FollowSystem -> if (isInDarkTheme) Color.White to Color.Black else Color.Black to Color.White
DarkMode.Light -> Color.Black to Color.White
DarkMode.Dark -> Color.White to Color.Black
}
item {
DarkModeItem(
icon = DarkMode.Light.icon,
name = DarkMode.Light.getDisplayName(context),
contentColor = Color.Black,
containerColor = Color.White,
selected = currentDarkMode == DarkMode.Light,
onSelect = { onDarkModeChange(DarkMode.Light) }
)
}
val isSelected by remember { derivedStateOf { currentDarkMode() == it } }
item {
DarkModeItem(
icon = DarkMode.Dark.icon,
name = DarkMode.Dark.getDisplayName(context),
contentColor = Color.White,
containerColor = Color.Black,
selected = currentDarkMode == DarkMode.Dark,
onSelect = { onDarkModeChange(DarkMode.Dark) }
)
icon = it.icon,
name = it.getDisplayName(context),
contentColor = contentColor,
containerColor = containerColor,
selected = isSelected,
onSelect = { onDarkModeChange(it) })
}
}
}

View file

@ -108,7 +108,10 @@ fun PaletteItem(
Text(
text = paletteStyle.getDisplayName(context),
style = MaterialTheme.typography.bodyMedium
style = MaterialTheme.typography.bodyMedium,
color = if (selected) {
MaterialTheme.colorScheme.primary
} else MaterialTheme.colorScheme.onSurface
)
}
}

View file

@ -2,7 +2,10 @@ package cn.super12138.todo.ui.pages.settings.components.appearance.palette
import androidx.compose.foundation.isSystemInDarkTheme
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.lazy.items
import androidx.compose.runtime.Composable
import androidx.compose.runtime.derivedStateOf
import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
@ -15,17 +18,14 @@ import cn.super12138.todo.ui.theme.PaletteStyle
@Composable
fun PalettePicker(
currentPalette: PaletteStyle,
currentPalette: () -> PaletteStyle,
onPaletteChange: (paletteStyle: PaletteStyle) -> Unit,
isDynamicColor: Boolean,
isDarkMode: DarkMode,
contrastLevel: ContrastLevel,
modifier: Modifier = Modifier
) {
val paletteOptions = remember {
PaletteStyle.entries.toList()
}
val paletteOptions = remember { PaletteStyle.entries.toList() }
LazyRowSettingsItem(
title = stringResource(R.string.pref_palette_style),
@ -34,21 +34,21 @@ fun PalettePicker(
fadedEdgeWidth = 8.dp,
modifier = modifier
) {
paletteOptions.forEach { paletteStyle ->
item {
PaletteItem(
isDynamicColor = isDynamicColor,
isDark = when (isDarkMode) {
DarkMode.FollowSystem -> isSystemInDarkTheme()
DarkMode.Light -> false
DarkMode.Dark -> true
},
paletteStyle = paletteStyle,
selected = currentPalette == paletteStyle,
contrastLevel = contrastLevel,
onSelect = { onPaletteChange(paletteStyle) }
)
}
items(items = paletteOptions, key = { it.id }) {
val isSelected by remember { derivedStateOf { currentPalette() == it } }
PaletteItem(
isDynamicColor = isDynamicColor,
isDark = when (isDarkMode) {
DarkMode.FollowSystem -> isSystemInDarkTheme()
DarkMode.Light -> false
DarkMode.Dark -> true
},
paletteStyle = it,
selected = isSelected,
contrastLevel = contrastLevel,
onSelect = { onPaletteChange(it) }
)
}
}
}