feat(settings): 支持自定义已完成待办的显示模式
This commit is contained in:
parent
086e0ce447
commit
01aaa792a6
10 changed files with 104 additions and 5 deletions
|
|
@ -14,4 +14,7 @@ object Constants {
|
||||||
|
|
||||||
const val PREF_CONTRAST_LEVEL = "contrast_level"
|
const val PREF_CONTRAST_LEVEL = "contrast_level"
|
||||||
const val PREF_CONTRAST_LEVEL_DEFAULT = 0f // Normal
|
const val PREF_CONTRAST_LEVEL_DEFAULT = 0f // Normal
|
||||||
|
|
||||||
|
const val PREF_SHOW_COMPLETED = "show_completed"
|
||||||
|
const val PREF_SHOW_COMPLETED_DEFAULT = true
|
||||||
}
|
}
|
||||||
|
|
@ -19,4 +19,8 @@ object GlobalValues {
|
||||||
Constants.PREF_CONTRAST_LEVEL,
|
Constants.PREF_CONTRAST_LEVEL,
|
||||||
Constants.PREF_CONTRAST_LEVEL_DEFAULT
|
Constants.PREF_CONTRAST_LEVEL_DEFAULT
|
||||||
)
|
)
|
||||||
|
var showCompleted: Boolean by SPDelegates(
|
||||||
|
Constants.PREF_SHOW_COMPLETED,
|
||||||
|
Constants.PREF_SHOW_COMPLETED_DEFAULT
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
@ -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.SettingsAbout
|
||||||
import cn.super12138.todo.ui.pages.settings.SettingsAboutLicence
|
import cn.super12138.todo.ui.pages.settings.SettingsAboutLicence
|
||||||
import cn.super12138.todo.ui.pages.settings.SettingsAppearance
|
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.pages.settings.SettingsMain
|
||||||
import cn.super12138.todo.ui.theme.materialSharedAxisXIn
|
import cn.super12138.todo.ui.theme.materialSharedAxisXIn
|
||||||
import cn.super12138.todo.ui.theme.materialSharedAxisXOut
|
import cn.super12138.todo.ui.theme.materialSharedAxisXOut
|
||||||
|
|
@ -82,9 +83,10 @@ fun TodoNavigation(
|
||||||
|
|
||||||
composable(TodoScreen.SettingsMain.name) {
|
composable(TodoScreen.SettingsMain.name) {
|
||||||
SettingsMain(
|
SettingsMain(
|
||||||
onNavigateUp = { navController.navigateUp() },
|
|
||||||
toAppearancePage = { navController.navigate(TodoScreen.SettingsAppearance.name) },
|
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) {
|
composable(TodoScreen.SettingsAbout.name) {
|
||||||
SettingsAbout(
|
SettingsAbout(
|
||||||
onNavigateUp = { navController.navigateUp() },
|
onNavigateUp = { navController.navigateUp() },
|
||||||
|
|
|
||||||
|
|
@ -5,6 +5,7 @@ enum class TodoScreen {
|
||||||
TodoEditor,
|
TodoEditor,
|
||||||
SettingsMain,
|
SettingsMain,
|
||||||
SettingsAppearance,
|
SettingsAppearance,
|
||||||
|
SettingsInterface,
|
||||||
SettingsAbout,
|
SettingsAbout,
|
||||||
SettingsAboutLicence
|
SettingsAboutLicence
|
||||||
}
|
}
|
||||||
|
|
@ -59,7 +59,7 @@ fun MainPage(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
val showCompleted = true // 后续替换成用户设置
|
val showCompleted = viewModel.showCompletedTodos
|
||||||
val filteredTodoList =
|
val filteredTodoList =
|
||||||
if (showCompleted) toDoList.value else toDoList.value.filter { item -> !item.isCompleted }
|
if (showCompleted) toDoList.value else toDoList.value.filter { item -> !item.isCompleted }
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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) },
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -8,6 +8,7 @@ import androidx.compose.foundation.verticalScroll
|
||||||
import androidx.compose.material.icons.Icons
|
import androidx.compose.material.icons.Icons
|
||||||
import androidx.compose.material.icons.outlined.ColorLens
|
import androidx.compose.material.icons.outlined.ColorLens
|
||||||
import androidx.compose.material.icons.outlined.Info
|
import androidx.compose.material.icons.outlined.Info
|
||||||
|
import androidx.compose.material.icons.outlined.ViewComfy
|
||||||
import androidx.compose.material3.ExperimentalMaterial3Api
|
import androidx.compose.material3.ExperimentalMaterial3Api
|
||||||
import androidx.compose.material3.TopAppBarDefaults
|
import androidx.compose.material3.TopAppBarDefaults
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
|
|
@ -20,9 +21,10 @@ import cn.super12138.todo.ui.pages.settings.components.SettingsItem
|
||||||
@OptIn(ExperimentalMaterial3Api::class)
|
@OptIn(ExperimentalMaterial3Api::class)
|
||||||
@Composable
|
@Composable
|
||||||
fun SettingsMain(
|
fun SettingsMain(
|
||||||
onNavigateUp: () -> Unit,
|
|
||||||
toAppearancePage: () -> Unit,
|
toAppearancePage: () -> Unit,
|
||||||
|
toInterfacePage: () -> Unit,
|
||||||
toAboutPage: () -> Unit,
|
toAboutPage: () -> Unit,
|
||||||
|
onNavigateUp: () -> Unit,
|
||||||
modifier: Modifier = Modifier
|
modifier: Modifier = Modifier
|
||||||
) {
|
) {
|
||||||
val scrollBehavior = TopAppBarDefaults.exitUntilCollapsedScrollBehavior()
|
val scrollBehavior = TopAppBarDefaults.exitUntilCollapsedScrollBehavior()
|
||||||
|
|
@ -43,6 +45,12 @@ fun SettingsMain(
|
||||||
description = stringResource(R.string.pref_appearance_desc),
|
description = stringResource(R.string.pref_appearance_desc),
|
||||||
onClick = toAppearancePage
|
onClick = toAppearancePage
|
||||||
)
|
)
|
||||||
|
SettingsItem(
|
||||||
|
leadingIcon = Icons.Outlined.ViewComfy,
|
||||||
|
title = stringResource(R.string.pref_interface),
|
||||||
|
description = stringResource(R.string.pref_interface_desc),
|
||||||
|
onClick = toInterfacePage
|
||||||
|
)
|
||||||
SettingsItem(
|
SettingsItem(
|
||||||
leadingIcon = Icons.Outlined.Info,
|
leadingIcon = Icons.Outlined.Info,
|
||||||
title = stringResource(R.string.pref_about),
|
title = stringResource(R.string.pref_about),
|
||||||
|
|
|
||||||
|
|
@ -20,9 +20,10 @@ import kotlinx.coroutines.launch
|
||||||
class MainViewModel : ViewModel() {
|
class MainViewModel : ViewModel() {
|
||||||
// 待办
|
// 待办
|
||||||
val toDos: Flow<List<TodoEntity>> = Repository.getAllTodos()
|
val toDos: Flow<List<TodoEntity>> = Repository.getAllTodos()
|
||||||
|
val showConfetti = mutableStateOf(false)
|
||||||
var selectedEditTodo by mutableStateOf<TodoEntity?>(null)
|
var selectedEditTodo by mutableStateOf<TodoEntity?>(null)
|
||||||
private set
|
private set
|
||||||
val showConfetti = mutableStateOf(false)
|
var showCompletedTodos by mutableStateOf(GlobalValues.showCompleted)
|
||||||
|
|
||||||
// 深色模式
|
// 深色模式
|
||||||
var appDarkMode by mutableStateOf(DarkMode.fromId(GlobalValues.darkMode))
|
var appDarkMode by mutableStateOf(DarkMode.fromId(GlobalValues.darkMode))
|
||||||
|
|
@ -118,6 +119,9 @@ class MainViewModel : ViewModel() {
|
||||||
showConfetti.value = true
|
showConfetti.value = true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 应用设置
|
||||||
|
*/
|
||||||
fun setDarkMode(darkMode: DarkMode) {
|
fun setDarkMode(darkMode: DarkMode) {
|
||||||
appDarkMode = darkMode
|
appDarkMode = darkMode
|
||||||
}
|
}
|
||||||
|
|
@ -125,4 +129,8 @@ class MainViewModel : ViewModel() {
|
||||||
fun setContrastLevel(contrastLevel: ContrastLevel) {
|
fun setContrastLevel(contrastLevel: ContrastLevel) {
|
||||||
appContrastLevel = contrastLevel
|
appContrastLevel = contrastLevel
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun setShowCompleted(show: Boolean) {
|
||||||
|
showCompletedTodos = show
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -73,4 +73,10 @@
|
||||||
<string name="contrast_default">默认</string>
|
<string name="contrast_default">默认</string>
|
||||||
<string name="contrast_medium">中</string>
|
<string name="contrast_medium">中</string>
|
||||||
<string name="contrast_high">高</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>
|
</resources>
|
||||||
|
|
@ -75,4 +75,9 @@
|
||||||
<string name="contrast_medium">Medium</string>
|
<string name="contrast_medium">Medium</string>
|
||||||
<string name="contrast_high">High</string>
|
<string name="contrast_high">High</string>
|
||||||
<string name="tip_change_contrast_level">Change the contrast level</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>
|
</resources>
|
||||||
Loading…
Reference in a new issue