refactor: 优化重构部分代码

This commit is contained in:
Super12138 2025-05-02 12:49:46 +08:00
parent fdc01f2750
commit 9eee5ead8a
22 changed files with 130 additions and 121 deletions

View file

@ -34,7 +34,7 @@ android {
applicationId = "cn.super12138.todo"
minSdk = 24
targetSdk = 36
versionCode = 647
versionCode = 656
versionName = "2.1.2"
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"

View file

@ -22,8 +22,6 @@ enum class Priority(val value: Float) {
}
companion object {
fun fromFloat(float: Float): Priority {
return Priority.entries.find { it.value == float } ?: Default
}
fun fromFloat(float: Float) = entries.find { it.value == float } ?: Default
}
}

View file

@ -4,11 +4,22 @@ import android.content.Context
import cn.super12138.todo.R
enum class SortingMethod(val id: Int) {
// 按添加先后顺序
Sequential(1),
// 按学科
Subject(2),
// 按优先级
Priority(3),
// 按完成情况
Completion(4),
// 按字母升序
AlphabeticalAscending(5),
// 按字母降序
AlphabeticalDescending(6);
fun getDisplayName(context: Context): String {
@ -24,8 +35,6 @@ enum class SortingMethod(val id: Int) {
}
companion object {
fun fromId(id: Int): SortingMethod {
return SortingMethod.entries.find { it.id == id } ?: Sequential
}
fun fromId(id: Int) = entries.find { it.id == id } ?: Sequential
}
}

View file

@ -35,8 +35,6 @@ enum class Subjects(val id: Int) {
companion object {
// 根据 ID 获取 Subjects
fun fromId(id: Int): Subjects {
return entries.find { it.id == id } ?: Others
}
fun fromId(id: Int) = entries.find { it.id == id } ?: Others
}
}

View file

@ -12,4 +12,14 @@ object TodoDefaults {
* 待办卡片默认高度
*/
val toDoCardHeight = 80.dp
/**
* 设置项水平边距
*/
val settingsItemHorizontalPadding = 24.dp
/**
* 设置项垂直边距
*/
val settingsItemVerticalPadding = 20.dp
}

View file

@ -13,11 +13,11 @@ import androidx.compose.ui.res.stringResource
import androidx.core.view.WindowCompat
import cn.super12138.todo.R
import cn.super12138.todo.constants.GlobalValues
import cn.super12138.todo.logic.model.DarkMode
import cn.super12138.todo.logic.model.DarkMode.Dark
import cn.super12138.todo.logic.model.DarkMode.FollowSystem
import cn.super12138.todo.logic.model.DarkMode.Light
import cn.super12138.todo.ui.pages.crash.CrashPage
import cn.super12138.todo.ui.theme.DarkMode
import cn.super12138.todo.ui.theme.DarkMode.Dark
import cn.super12138.todo.ui.theme.DarkMode.FollowSystem
import cn.super12138.todo.ui.theme.DarkMode.Light
import cn.super12138.todo.ui.theme.PaletteStyle
import cn.super12138.todo.ui.theme.ToDoTheme

View file

@ -15,11 +15,11 @@ import androidx.compose.ui.Modifier
import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen
import androidx.core.view.WindowCompat
import androidx.lifecycle.viewmodel.compose.viewModel
import cn.super12138.todo.logic.model.DarkMode.Dark
import cn.super12138.todo.logic.model.DarkMode.FollowSystem
import cn.super12138.todo.logic.model.DarkMode.Light
import cn.super12138.todo.ui.components.Konfetti
import cn.super12138.todo.ui.navigation.TodoNavigation
import cn.super12138.todo.ui.theme.DarkMode.Dark
import cn.super12138.todo.ui.theme.DarkMode.FollowSystem
import cn.super12138.todo.ui.theme.DarkMode.Light
import cn.super12138.todo.ui.theme.ToDoTheme
import cn.super12138.todo.ui.viewmodels.MainViewModel

View file

@ -87,7 +87,7 @@ fun TodoEditorPage(
var subjectContent by rememberSaveable { mutableStateOf(toDo?.customSubject ?: "") }
var isErrorSubject by rememberSaveable { mutableStateOf(false) }
var priorityState by rememberSaveable { mutableFloatStateOf(toDo?.priority ?: 0f) }
var completedSwitchState by rememberSaveable { mutableStateOf(toDo?.isCompleted ?: false) }
var completedSwitchState by rememberSaveable { mutableStateOf(toDo?.isCompleted == true) }
val isCustomSubject by remember {
derivedStateOf { selectedSubjectId == Subjects.Custom.id }

View file

@ -49,7 +49,8 @@ fun ManagerFragment(
start = TodoDefaults.screenPadding,
bottom = TodoDefaults.toDoCardHeight / 2,
end = TodoDefaults.screenPadding
)
),
//verticalArrangement = Arrangement.spacedBy(5.dp)
) {
if (list.isEmpty()) {
item {
@ -59,7 +60,6 @@ fun ManagerFragment(
textAlign = TextAlign.Center,
modifier = Modifier.fillMaxWidth()
)
}
} else {
items(

View file

@ -1,18 +1,15 @@
package cn.super12138.todo.ui.pages.settings.components
import androidx.compose.foundation.gestures.FlingBehavior
import androidx.compose.foundation.gestures.ScrollableDefaults
import androidx.compose.foundation.ScrollState
import androidx.compose.foundation.horizontalScroll
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.RowScope
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.wrapContentHeight
import androidx.compose.foundation.lazy.LazyListScope
import androidx.compose.foundation.lazy.LazyListState
import androidx.compose.foundation.lazy.LazyRow
import androidx.compose.foundation.lazy.rememberLazyListState
import androidx.compose.foundation.rememberScrollState
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
@ -21,43 +18,38 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.graphics.Shape
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import cn.super12138.todo.ui.TodoDefaults
@Composable
fun RowSettingsItem(
modifier: Modifier = Modifier,
leadingIcon: (@Composable () -> Unit)? = null,
title: String,
description: String? = null,
trailingContent: (@Composable () -> Unit)? = null,
shape: Shape = MaterialTheme.shapes.large,
modifier: Modifier = Modifier,
state: LazyListState = rememberLazyListState(),
contentPadding: PaddingValues = PaddingValues(0.dp),
reverseLayout: Boolean = false,
horizontalArrangement: Arrangement.Horizontal =
if (!reverseLayout) Arrangement.Start else Arrangement.End,
horizontalArrangement: Arrangement.Horizontal = Arrangement.Start,
verticalAlignment: Alignment.Vertical = Alignment.Top,
flingBehavior: FlingBehavior = ScrollableDefaults.flingBehavior(),
userScrollEnabled: Boolean = true,
content: LazyListScope.() -> Unit
scrollState: ScrollState = rememberScrollState(),
rowModifier: Modifier = Modifier,
content: @Composable RowScope.() -> Unit
) {
MoreContentSettingsItem(
leadingIcon = leadingIcon,
title = title,
description = description,
trailingContent = trailingContent,
shape = shape
shape = shape,
modifier = modifier
) {
LazyRow(
modifier = Modifier.fillMaxWidth(),
state = state,
contentPadding = contentPadding,
reverseLayout = reverseLayout,
Row(
modifier = Modifier
.fillMaxWidth()
.horizontalScroll(scrollState)
.then(rowModifier),
horizontalArrangement = horizontalArrangement,
verticalAlignment = verticalAlignment,
flingBehavior = flingBehavior,
userScrollEnabled = userScrollEnabled,
content = content
)
}
@ -65,12 +57,12 @@ fun RowSettingsItem(
@Composable
fun MoreContentSettingsItem(
modifier: Modifier = Modifier,
leadingIcon: (@Composable () -> Unit)? = null,
title: String,
description: String? = null,
trailingContent: (@Composable () -> Unit)? = null,
shape: Shape = MaterialTheme.shapes.large,
modifier: Modifier = Modifier,
content: @Composable () -> Unit
) {
Column(
@ -78,7 +70,10 @@ fun MoreContentSettingsItem(
.fillMaxWidth()
.wrapContentHeight()
.clip(shape)
.padding(horizontal = 24.dp, vertical = 20.dp)
.padding(
horizontal = TodoDefaults.settingsItemHorizontalPadding,
vertical = TodoDefaults.settingsItemVerticalPadding
)
) {
Row {
leadingIcon?.let {
@ -111,6 +106,7 @@ fun MoreContentSettingsItem(
it()
}
}
content()
}
}

View file

@ -69,7 +69,7 @@ fun RadioItem(
) {
val view = LocalView.current
Row(
Modifier
modifier
.fillMaxWidth()
.height(56.dp)
.clip(MaterialTheme.shapes.large)
@ -103,11 +103,11 @@ data class SettingsRadioOptions(
@Composable
fun SettingsDialog(
modifier: Modifier = Modifier,
visible: Boolean,
title: String,
text: @Composable (() -> Unit)? = null,
onDismissRequest: () -> Unit = {},
modifier: Modifier = Modifier
onDismissRequest: () -> Unit = {}
) {
BasicDialog(
visible = visible,

View file

@ -19,16 +19,17 @@ import androidx.compose.ui.platform.LocalView
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import cn.super12138.todo.ui.TodoDefaults
import cn.super12138.todo.utils.VibrationUtils
@Composable
fun SettingsItem(
modifier: Modifier = Modifier,
leadingIcon: ImageVector? = null,
title: String,
description: String? = null,
enableClick: Boolean = true,
onClick: () -> Unit = {},
modifier: Modifier = Modifier
onClick: () -> Unit = {}
) {
SettingsItem(
leadingIcon = leadingIcon,
@ -43,13 +44,13 @@ fun SettingsItem(
@Composable
fun SettingsItem(
modifier: Modifier = Modifier,
leadingIcon: ImageVector? = null,
title: String,
description: String? = null,
trailingContent: (@Composable () -> Unit)? = null,
enableClick: Boolean = true,
onClick: () -> Unit = {},
modifier: Modifier = Modifier
onClick: () -> Unit = {}
) {
SettingsItem(
leadingIcon = {
@ -73,14 +74,14 @@ fun SettingsItem(
@Composable
fun SettingsItem(
modifier: Modifier = Modifier,
leadingIcon: (@Composable () -> Unit)? = null,
title: String,
description: String? = null,
trailingContent: (@Composable () -> Unit)? = null,
shape: Shape = MaterialTheme.shapes.large,
enableClick: Boolean = true,
onClick: () -> Unit = {},
modifier: Modifier = Modifier
onClick: () -> Unit = {}
) {
val view = LocalView.current
Row(
@ -95,7 +96,10 @@ fun SettingsItem(
onClick()
}
)
.padding(horizontal = 24.dp, vertical = 20.dp),
.padding(
horizontal = TodoDefaults.settingsItemHorizontalPadding,
vertical = TodoDefaults.settingsItemVerticalPadding
),
verticalAlignment = Alignment.CenterVertically
) {
leadingIcon?.let {

View file

@ -16,6 +16,7 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import cn.super12138.todo.R
import cn.super12138.todo.ui.TodoDefaults
@Composable
fun SettingsPlainBox(
@ -26,7 +27,11 @@ fun SettingsPlainBox(
modifier = modifier
.fillMaxWidth()
.wrapContentHeight()
.padding(start = 24.dp, end = 24.dp, bottom = 20.dp),
.padding(
start = TodoDefaults.settingsItemHorizontalPadding,
end = TodoDefaults.settingsItemHorizontalPadding,
bottom = TodoDefaults.settingsItemVerticalPadding
),
) {
Icon(
imageVector = Icons.Outlined.Info,

View file

@ -14,13 +14,13 @@ import cn.super12138.todo.utils.VibrationUtils
@Composable
fun SwitchSettingsItem(
modifier: Modifier = Modifier,
key: String,
default: Boolean,
leadingIcon: ImageVector? = null,
title: String,
description: String? = null,
onCheckedChange: (Boolean) -> Unit,
modifier: Modifier = Modifier
onCheckedChange: (Boolean) -> Unit
) {
val view = LocalView.current
var switchState by rememberPrefBooleanState(key, default)

View file

@ -23,9 +23,9 @@ import androidx.compose.ui.semantics.semantics
import androidx.compose.ui.unit.dp
import cn.super12138.todo.R
import cn.super12138.todo.constants.Constants
import cn.super12138.todo.logic.model.ContrastLevel
import cn.super12138.todo.ui.pages.settings.components.MoreContentSettingsItem
import cn.super12138.todo.ui.pages.settings.state.rememberPrefFloatState
import cn.super12138.todo.ui.theme.ContrastLevel
import cn.super12138.todo.utils.VibrationUtils
@Composable

View file

@ -12,9 +12,9 @@ import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import cn.super12138.todo.R
import cn.super12138.todo.constants.Constants
import cn.super12138.todo.logic.model.DarkMode
import cn.super12138.todo.ui.pages.settings.components.RowSettingsItem
import cn.super12138.todo.ui.pages.settings.state.rememberPrefIntState
import cn.super12138.todo.ui.theme.DarkMode
@Composable
fun DarkModePicker(
@ -33,48 +33,43 @@ fun DarkModePicker(
RowSettingsItem(
title = stringResource(R.string.pref_dark_mode),
description = stringResource(R.string.pref_dark_mode_desc),
horizontalArrangement = Arrangement.spacedBy(5.dp)
horizontalArrangement = Arrangement.spacedBy(5.dp),
modifier = modifier
) {
item {
DarkModeItem(
icon = DarkMode.FollowSystem.icon,
contentDescription = DarkMode.FollowSystem.getDisplayName(context),
contentColor = if (isInDarkTheme) Color.White else Color.Black,
containerColor = if (isInDarkTheme) Color.Black else Color.White,
selected = DarkMode.fromId(darkModeState) == DarkMode.FollowSystem,
onSelect = {
darkModeState = DarkMode.FollowSystem.id
onDarkModeChange(DarkMode.FollowSystem)
}
)
}
DarkModeItem(
icon = DarkMode.FollowSystem.icon,
contentDescription = DarkMode.FollowSystem.getDisplayName(context),
contentColor = if (isInDarkTheme) Color.White else Color.Black,
containerColor = if (isInDarkTheme) Color.Black else Color.White,
selected = DarkMode.fromId(darkModeState) == DarkMode.FollowSystem,
onSelect = {
darkModeState = DarkMode.FollowSystem.id
onDarkModeChange(DarkMode.FollowSystem)
}
)
item {
DarkModeItem(
icon = DarkMode.Light.icon,
contentDescription = DarkMode.Light.getDisplayName(context),
contentColor = Color.Black,
containerColor = Color.White,
selected = DarkMode.fromId(darkModeState) == DarkMode.Light,
onSelect = {
darkModeState = DarkMode.Light.id
onDarkModeChange(DarkMode.Light)
}
)
}
DarkModeItem(
icon = DarkMode.Light.icon,
contentDescription = DarkMode.Light.getDisplayName(context),
contentColor = Color.Black,
containerColor = Color.White,
selected = DarkMode.fromId(darkModeState) == DarkMode.Light,
onSelect = {
darkModeState = DarkMode.Light.id
onDarkModeChange(DarkMode.Light)
}
)
item {
DarkModeItem(
icon = DarkMode.Dark.icon,
contentDescription = DarkMode.Dark.getDisplayName(context),
contentColor = Color.White,
containerColor = Color.Black,
selected = DarkMode.fromId(darkModeState) == DarkMode.Dark,
onSelect = {
darkModeState = DarkMode.Dark.id
onDarkModeChange(DarkMode.Dark)
}
)
}
DarkModeItem(
icon = DarkMode.Dark.icon,
contentDescription = DarkMode.Dark.getDisplayName(context),
contentColor = Color.White,
containerColor = Color.Black,
selected = DarkMode.fromId(darkModeState) == DarkMode.Dark,
onSelect = {
darkModeState = DarkMode.Dark.id
onDarkModeChange(DarkMode.Dark)
}
)
}
}

View file

@ -29,7 +29,7 @@ import androidx.compose.ui.semantics.Role
import androidx.compose.ui.unit.dp
import androidx.compose.ui.util.fastForEach
import cn.super12138.todo.constants.GlobalValues
import cn.super12138.todo.logic.model.ContrastLevel
import cn.super12138.todo.ui.theme.ContrastLevel
import cn.super12138.todo.ui.theme.PaletteStyle
import cn.super12138.todo.ui.theme.dynamicColorScheme
import cn.super12138.todo.utils.VibrationUtils
@ -45,8 +45,9 @@ fun PaletteItem(
) {
val view = LocalView.current
val context = LocalContext.current
Column(
modifier = Modifier
modifier = modifier
.width(90.dp)
.clip(MaterialTheme.shapes.large)
.clickable(

View file

@ -2,7 +2,6 @@ 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.getValue
import androidx.compose.runtime.remember
@ -12,10 +11,10 @@ import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import cn.super12138.todo.R
import cn.super12138.todo.constants.Constants
import cn.super12138.todo.logic.model.ContrastLevel
import cn.super12138.todo.logic.model.DarkMode
import cn.super12138.todo.ui.pages.settings.components.RowSettingsItem
import cn.super12138.todo.ui.pages.settings.state.rememberPrefIntState
import cn.super12138.todo.ui.theme.ContrastLevel
import cn.super12138.todo.ui.theme.DarkMode
import cn.super12138.todo.ui.theme.PaletteStyle
@Composable
@ -40,7 +39,7 @@ fun PalettePicker(
horizontalArrangement = Arrangement.spacedBy(5.dp),
modifier = modifier
) {
items(items = paletteOptions, key = { it.id }) { paletteStyle ->
paletteOptions.forEach { paletteStyle ->
PaletteItem(
isDark = when (isDarkMode) {
DarkMode.FollowSystem -> isSystemInDarkTheme()

View file

@ -1,4 +1,4 @@
package cn.super12138.todo.logic.model
package cn.super12138.todo.ui.theme
enum class ContrastLevel(val value: Float) {
VeryLow(-1f),
@ -19,8 +19,6 @@ enum class ContrastLevel(val value: Float) {
}*/
companion object {
fun fromFloat(float: Float): ContrastLevel {
return ContrastLevel.entries.find { it.value == float } ?: Default
}
fun fromFloat(float: Float) = entries.find { it.value == float } ?: Default
}
}

View file

@ -1,4 +1,4 @@
package cn.super12138.todo.logic.model
package cn.super12138.todo.ui.theme
import android.content.Context
import androidx.compose.material.icons.Icons
@ -26,8 +26,6 @@ enum class DarkMode(
}
companion object {
fun fromId(id: Int): DarkMode {
return DarkMode.entries.find { it.id == id } ?: FollowSystem
}
fun fromId(id: Int) = entries.find { it.id == id } ?: FollowSystem
}
}

View file

@ -30,8 +30,6 @@ enum class PaletteStyle(val id: Int) {
}
companion object {
fun fromId(id: Int): PaletteStyle {
return PaletteStyle.entries.find { it.id == id } ?: TonalSpot
}
fun fromId(id: Int) = entries.firstOrNull { it.id == id } ?: TonalSpot
}
}

View file

@ -12,9 +12,9 @@ import cn.super12138.todo.constants.Constants
import cn.super12138.todo.constants.GlobalValues
import cn.super12138.todo.logic.Repository
import cn.super12138.todo.logic.database.TodoEntity
import cn.super12138.todo.logic.model.ContrastLevel
import cn.super12138.todo.logic.model.DarkMode
import cn.super12138.todo.logic.model.SortingMethod
import cn.super12138.todo.ui.theme.ContrastLevel
import cn.super12138.todo.ui.theme.DarkMode
import cn.super12138.todo.ui.theme.PaletteStyle
import cn.super12138.todo.utils.FileUtils
import kotlinx.coroutines.Dispatchers