feat: 支持动态显示已完成待办

只是完成功能,后续会根据用户自定设置来动态显示
This commit is contained in:
Super12138 2025-01-15 17:13:01 +08:00
parent 0f27eab03b
commit 96fe734ccd
3 changed files with 12 additions and 19 deletions

View file

@ -1,9 +1,7 @@
package cn.super12138.todo.ui.pages.main package cn.super12138.todo.ui.pages.main
import androidx.activity.compose.BackHandler import androidx.activity.compose.BackHandler
import androidx.compose.animation.AnimatedContent
import androidx.compose.animation.AnimatedVisibility import androidx.compose.animation.AnimatedVisibility
import androidx.compose.animation.animateColorAsState
import androidx.compose.animation.expandIn import androidx.compose.animation.expandIn
import androidx.compose.animation.fadeIn import androidx.compose.animation.fadeIn
import androidx.compose.animation.fadeOut import androidx.compose.animation.fadeOut
@ -13,19 +11,8 @@ import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.lazy.rememberLazyListState import androidx.compose.foundation.lazy.rememberLazyListState
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.outlined.Close
import androidx.compose.material.icons.outlined.Delete
import androidx.compose.material.icons.outlined.SelectAll
import androidx.compose.material.icons.outlined.Settings
import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Scaffold import androidx.compose.material3.Scaffold
import androidx.compose.material3.Text
import androidx.compose.material3.TopAppBar
import androidx.compose.material3.TopAppBarDefaults
import androidx.compose.material3.adaptive.currentWindowAdaptiveInfo import androidx.compose.material3.adaptive.currentWindowAdaptiveInfo
import androidx.compose.material3.rememberModalBottomSheetState import androidx.compose.material3.rememberModalBottomSheetState
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
@ -38,9 +25,7 @@ import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.runtime.setValue import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
import androidx.window.core.layout.WindowWidthSizeClass import androidx.window.core.layout.WindowWidthSizeClass
import cn.super12138.todo.R
import cn.super12138.todo.logic.database.TodoEntity import cn.super12138.todo.logic.database.TodoEntity
import cn.super12138.todo.ui.pages.main.components.TodoFAB import cn.super12138.todo.ui.pages.main.components.TodoFAB
import cn.super12138.todo.ui.pages.main.components.TodoTopAppBar import cn.super12138.todo.ui.pages.main.components.TodoTopAppBar
@ -72,6 +57,10 @@ fun MainPage(viewModel: MainViewModel, modifier: Modifier = Modifier) {
} }
} }
val showCompleted = true // 后续替换成用户设置
val filteredTodoList =
if (showCompleted) toDoList.value else toDoList.value.filter { item -> !item.isCompleted }
BackHandler(enabled = !isSelectedIdsEmpty) { BackHandler(enabled = !isSelectedIdsEmpty) {
// 当按下返回键(或进行返回操作)时清空选择 // 当按下返回键(或进行返回操作)时清空选择
viewModel.clearAllTodoSelection() viewModel.clearAllTodoSelection()
@ -114,7 +103,7 @@ fun MainPage(viewModel: MainViewModel, modifier: Modifier = Modifier) {
ManagerFragment( ManagerFragment(
state = listState, state = listState,
list = toDoList.value.filter { item -> !item.isCompleted }, list = filteredTodoList,
onItemClick = { item -> onItemClick = { item ->
if (isSelectedIdsEmpty) { if (isSelectedIdsEmpty) {
openBottomSheet = true openBottomSheet = true
@ -154,10 +143,9 @@ fun MainPage(viewModel: MainViewModel, modifier: Modifier = Modifier) {
.weight(2f) .weight(2f)
.fillMaxSize() .fillMaxSize()
) )
ManagerFragment( ManagerFragment(
state = listState, state = listState,
list = toDoList.value.filter { item -> !item.isCompleted }, list = filteredTodoList,
onItemClick = { item -> onItemClick = { item ->
if (isSelectedIdsEmpty) { if (isSelectedIdsEmpty) {
openBottomSheet = true openBottomSheet = true

View file

@ -68,6 +68,7 @@ fun ManagerFragment(
TodoCard( TodoCard(
content = item.content, content = item.content,
subject = Subjects.fromId(item.subject).getDisplayName(context), subject = Subjects.fromId(item.subject).getDisplayName(context),
completed = item.isCompleted,
onCardClick = { onItemClick(item) }, onCardClick = { onItemClick(item) },
onCardLongClick = { onItemLongClick(item) }, onCardLongClick = { onItemLongClick(item) },
onChecked = { onItemChecked(item) }, onChecked = { onItemChecked(item) },

View file

@ -26,6 +26,7 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip import androidx.compose.ui.draw.clip
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextDecoration
import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import cn.super12138.todo.R import cn.super12138.todo.R
@ -35,6 +36,7 @@ import cn.super12138.todo.R
fun TodoCard( fun TodoCard(
content: String, content: String,
subject: String, subject: String,
completed: Boolean,
onCardClick: () -> Unit = {}, onCardClick: () -> Unit = {},
onCardLongClick: () -> Unit = {}, onCardLongClick: () -> Unit = {},
onChecked: () -> Unit = {}, onChecked: () -> Unit = {},
@ -82,16 +84,18 @@ fun TodoCard(
style = MaterialTheme.typography.titleLarge, style = MaterialTheme.typography.titleLarge,
maxLines = 1, maxLines = 1,
overflow = TextOverflow.Ellipsis, overflow = TextOverflow.Ellipsis,
textDecoration = if (completed) TextDecoration.LineThrough else TextDecoration.None,
modifier = Modifier.basicMarquee() // TODO: 后续评估性能影响 modifier = Modifier.basicMarquee() // TODO: 后续评估性能影响
) )
Text( Text(
text = subject, text = subject,
style = MaterialTheme.typography.labelMedium, style = MaterialTheme.typography.labelMedium,
textDecoration = if (completed) TextDecoration.LineThrough else TextDecoration.None,
maxLines = 1 maxLines = 1
) )
} }
AnimatedVisibility(!selected) { AnimatedVisibility(!selected && !completed) {
IconButton(onClick = onChecked) { IconButton(onClick = onChecked) {
Icon( Icon(
imageVector = Icons.Outlined.Check, imageVector = Icons.Outlined.Check,