feat(settings): 支持自定义已完成待办的显示模式

This commit is contained in:
Super12138 2025-02-05 17:33:53 +08:00
parent 086e0ce447
commit 01aaa792a6
10 changed files with 104 additions and 5 deletions

View file

@ -14,4 +14,7 @@ object Constants {
const val PREF_CONTRAST_LEVEL = "contrast_level"
const val PREF_CONTRAST_LEVEL_DEFAULT = 0f // Normal
const val PREF_SHOW_COMPLETED = "show_completed"
const val PREF_SHOW_COMPLETED_DEFAULT = true
}

View file

@ -19,4 +19,8 @@ object GlobalValues {
Constants.PREF_CONTRAST_LEVEL,
Constants.PREF_CONTRAST_LEVEL_DEFAULT
)
var showCompleted: Boolean by SPDelegates(
Constants.PREF_SHOW_COMPLETED,
Constants.PREF_SHOW_COMPLETED_DEFAULT
)
}

View file

@ -11,6 +11,7 @@ import cn.super12138.todo.ui.pages.main.MainPage
import cn.super12138.todo.ui.pages.settings.SettingsAbout
import cn.super12138.todo.ui.pages.settings.SettingsAboutLicence
import cn.super12138.todo.ui.pages.settings.SettingsAppearance
import cn.super12138.todo.ui.pages.settings.SettingsInterface
import cn.super12138.todo.ui.pages.settings.SettingsMain
import cn.super12138.todo.ui.theme.materialSharedAxisXIn
import cn.super12138.todo.ui.theme.materialSharedAxisXOut
@ -82,9 +83,10 @@ fun TodoNavigation(
composable(TodoScreen.SettingsMain.name) {
SettingsMain(
onNavigateUp = { navController.navigateUp() },
toAppearancePage = { navController.navigate(TodoScreen.SettingsAppearance.name) },
toAboutPage = { navController.navigate(TodoScreen.SettingsAbout.name) }
toAboutPage = { navController.navigate(TodoScreen.SettingsAbout.name) },
toInterfacePage = { navController.navigate(TodoScreen.SettingsInterface.name) },
onNavigateUp = { navController.navigateUp() },
)
}
@ -95,6 +97,13 @@ fun TodoNavigation(
)
}
composable(TodoScreen.SettingsInterface.name) {
SettingsInterface(
viewModel = viewModel,
onNavigateUp = { navController.navigateUp() }
)
}
composable(TodoScreen.SettingsAbout.name) {
SettingsAbout(
onNavigateUp = { navController.navigateUp() },

View file

@ -5,6 +5,7 @@ enum class TodoScreen {
TodoEditor,
SettingsMain,
SettingsAppearance,
SettingsInterface,
SettingsAbout,
SettingsAboutLicence
}

View file

@ -59,7 +59,7 @@ fun MainPage(
}
}
val showCompleted = true // 后续替换成用户设置
val showCompleted = viewModel.showCompletedTodos
val filteredTodoList =
if (showCompleted) toDoList.value else toDoList.value.filter { item -> !item.isCompleted }

View file

@ -0,0 +1,55 @@
package cn.super12138.todo.ui.pages.settings
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.outlined.Checklist
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.TopAppBarDefaults
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.input.nestedscroll.nestedScroll
import androidx.compose.ui.res.stringResource
import cn.super12138.todo.R
import cn.super12138.todo.constants.Constants
import cn.super12138.todo.ui.components.LargeTopAppBarScaffold
import cn.super12138.todo.ui.pages.settings.components.SettingsCategory
import cn.super12138.todo.ui.pages.settings.components.SwitchSettingsItem
import cn.super12138.todo.ui.viewmodels.MainViewModel
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun SettingsInterface(
viewModel: MainViewModel,
onNavigateUp: () -> Unit,
modifier: Modifier = Modifier
) {
val scrollBehavior = TopAppBarDefaults.exitUntilCollapsedScrollBehavior()
LargeTopAppBarScaffold(
title = stringResource(R.string.pref_interface),
onBack = onNavigateUp,
scrollBehavior = scrollBehavior,
modifier = modifier.nestedScroll(scrollBehavior.nestedScrollConnection),
) { innerPadding ->
Column(
modifier = Modifier
.fillMaxSize()
.padding(innerPadding)
.verticalScroll(rememberScrollState())
) {
SettingsCategory(stringResource(R.string.pref_category_todo_list))
SwitchSettingsItem(
key = Constants.PREF_SHOW_COMPLETED,
default = Constants.PREF_SHOW_COMPLETED_DEFAULT,
leadingIcon = Icons.Outlined.Checklist,
title = stringResource(R.string.pref_show_completed),
description = stringResource(R.string.pref_show_completed_desc),
onCheckedChange = { viewModel.setShowCompleted(it) },
)
}
}
}

View file

@ -8,6 +8,7 @@ import androidx.compose.foundation.verticalScroll
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.outlined.ColorLens
import androidx.compose.material.icons.outlined.Info
import androidx.compose.material.icons.outlined.ViewComfy
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.TopAppBarDefaults
import androidx.compose.runtime.Composable
@ -20,9 +21,10 @@ import cn.super12138.todo.ui.pages.settings.components.SettingsItem
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun SettingsMain(
onNavigateUp: () -> Unit,
toAppearancePage: () -> Unit,
toInterfacePage: () -> Unit,
toAboutPage: () -> Unit,
onNavigateUp: () -> Unit,
modifier: Modifier = Modifier
) {
val scrollBehavior = TopAppBarDefaults.exitUntilCollapsedScrollBehavior()
@ -43,6 +45,12 @@ fun SettingsMain(
description = stringResource(R.string.pref_appearance_desc),
onClick = toAppearancePage
)
SettingsItem(
leadingIcon = Icons.Outlined.ViewComfy,
title = stringResource(R.string.pref_interface),
description = stringResource(R.string.pref_interface_desc),
onClick = toInterfacePage
)
SettingsItem(
leadingIcon = Icons.Outlined.Info,
title = stringResource(R.string.pref_about),

View file

@ -20,9 +20,10 @@ import kotlinx.coroutines.launch
class MainViewModel : ViewModel() {
// 待办
val toDos: Flow<List<TodoEntity>> = Repository.getAllTodos()
val showConfetti = mutableStateOf(false)
var selectedEditTodo by mutableStateOf<TodoEntity?>(null)
private set
val showConfetti = mutableStateOf(false)
var showCompletedTodos by mutableStateOf(GlobalValues.showCompleted)
// 深色模式
var appDarkMode by mutableStateOf(DarkMode.fromId(GlobalValues.darkMode))
@ -118,6 +119,9 @@ class MainViewModel : ViewModel() {
showConfetti.value = true
}
/**
* 应用设置
*/
fun setDarkMode(darkMode: DarkMode) {
appDarkMode = darkMode
}
@ -125,4 +129,8 @@ class MainViewModel : ViewModel() {
fun setContrastLevel(contrastLevel: ContrastLevel) {
appContrastLevel = contrastLevel
}
fun setShowCompleted(show: Boolean) {
showCompletedTodos = show
}
}

View file

@ -73,4 +73,10 @@
<string name="contrast_default">默认</string>
<string name="contrast_medium"></string>
<string name="contrast_high"></string>
<string name="tip_change_contrast_level">更改颜色对比度</string>
<string name="pref_interface">界面</string>
<string name="pref_interface_desc">待办列表、排序方式</string>
<string name="pref_show_completed">显示已完成待办</string>
<string name="pref_show_completed_desc">在待办列表里显示已完成的待办</string>
<string name="pref_category_todo_list">待办列表</string>
</resources>

View file

@ -75,4 +75,9 @@
<string name="contrast_medium">Medium</string>
<string name="contrast_high">High</string>
<string name="tip_change_contrast_level">Change the contrast level</string>
<string name="pref_interface">Interface</string>
<string name="pref_interface_desc">To-Do List, sorting method</string>
<string name="pref_show_completed">Show Completed Tasks</string>
<string name="pref_show_completed_desc">Show completed tasks in to-do list</string>
<string name="pref_category_todo_list">To-Do List</string>
</resources>