Skip to content

Commit

Permalink
feat(editor): 在编辑模式下用户修改待办后阻止返回
Browse files Browse the repository at this point in the history
  • Loading branch information
Super12138 committed Feb 6, 2025
1 parent de27d5d commit 40961c7
Show file tree
Hide file tree
Showing 4 changed files with 123 additions and 3 deletions.
73 changes: 73 additions & 0 deletions app/src/main/kotlin/cn/super12138/todo/ui/components/Dialog.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
package cn.super12138.todo.ui.components

import androidx.compose.material3.AlertDialog
import androidx.compose.material3.FilledTonalButton
import androidx.compose.material3.Icon
import androidx.compose.material3.Text
import androidx.compose.material3.TextButton
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.vector.ImageVector

@Composable
fun BasicDialog(
visible: Boolean,
icon: ImageVector,
title: String,
text: @Composable (() -> Unit)? = null,
confirmButton: String,
dismissButton: String,
onConfirm: () -> Unit,
onDismiss: () -> Unit,
modifier: Modifier = Modifier
) {
BasicDialog(
visible = visible,
icon = {
Icon(
imageVector = icon,
contentDescription = null // 会跟下面的文本重复,所以设置为 null
)
},
title = {
Text(title)
},
text = text,
confirmButton = {
FilledTonalButton(onClick = onConfirm) {
Text(confirmButton)
}
},
dismissButton = {
TextButton(onClick = onDismiss) {
Text(dismissButton)
}
},
onDismissRequest = onDismiss,
modifier = modifier
)
}

@Composable
fun BasicDialog(
visible: Boolean,
icon: @Composable (() -> Unit)? = null,
title: @Composable () -> Unit,
text: @Composable (() -> Unit)? = null,
confirmButton: (@Composable () -> Unit),
dismissButton: (@Composable () -> Unit)? = null,
onDismissRequest: () -> Unit,
modifier: Modifier = Modifier
) {
if (visible) {
AlertDialog(
icon = icon,
title = title,
text = text,
confirmButton = confirmButton,
dismissButton = dismissButton,
onDismissRequest = onDismissRequest,
modifier = modifier
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.outlined.Delete
import androidx.compose.material.icons.outlined.ErrorOutline
import androidx.compose.material.icons.outlined.Save
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Icon
Expand Down Expand Up @@ -52,6 +53,7 @@ import cn.super12138.todo.logic.model.Priority
import cn.super12138.todo.logic.model.Subjects
import cn.super12138.todo.ui.TodoDefaults
import cn.super12138.todo.ui.components.AnimatedExtendedFloatingActionButton
import cn.super12138.todo.ui.components.BasicDialog
import cn.super12138.todo.ui.components.FilterChipGroup
import cn.super12138.todo.ui.components.LargeTopAppBarScaffold

Expand All @@ -66,8 +68,35 @@ fun TodoEditorPage(
animatedVisibilityScope: AnimatedVisibilityScope,
modifier: Modifier = Modifier
) {
BackHandler { // TODO: 实现用户更改后的阻止返回
onNavigateUp()
var showConfirmDialog by rememberSaveable { mutableStateOf(false) }

fun checkModifiedBeforeBack() {
if (toDo !== null) {
val newTodo = TodoEntity(
content = toDo.content,
subject = toDo.subject,
isCompleted = toDo.isCompleted,
priority = toDo.priority,
id = toDo.id
)
/*val newTodo = TodoEntity( // TODO: 只要用户有修改就阻止返回(当前是在编辑状态下检测)
content = toDo?.content ?: "",
subject = toDo?.subject ?: 0,
isCompleted = toDo?.isCompleted ?: false,
priority = toDo?.priority ?: 0f,
id = toDo?.id ?: 0
)*/
if (newTodo !== toDo) {
showConfirmDialog = true
} else {
onNavigateUp()
}
} else {
onNavigateUp()
}
}
BackHandler {
checkModifiedBeforeBack()
}
val context = LocalContext.current
val scrollBehavior = TopAppBarDefaults.exitUntilCollapsedScrollBehavior()
Expand Down Expand Up @@ -131,7 +160,9 @@ fun TodoEditorPage(
}
}
},
onBack = onNavigateUp,
onBack = {
checkModifiedBeforeBack()
},
modifier = modifier
) { innerPadding ->
Column(
Expand Down Expand Up @@ -225,4 +256,18 @@ fun TodoEditorPage(
Spacer(Modifier.size(40.dp))
}
}

BasicDialog(
visible = showConfirmDialog,
icon = Icons.Outlined.ErrorOutline,
title = stringResource(R.string.title_warning),
text = { Text(stringResource(R.string.tip_discard_changes)) },
confirmButton = stringResource(R.string.action_confirm),
dismissButton = stringResource(R.string.action_cancel),
onConfirm = {
showConfirmDialog = false
onNavigateUp()
},
onDismiss = { showConfirmDialog = false }
)
}
1 change: 1 addition & 0 deletions app/src/main/res/values-zh-rCN/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -81,4 +81,5 @@
<string name="pref_category_todo_list">待办列表</string>
<string name="pref_view_on_github">在 GitHub 上查看</string>
<string name="pref_view_on_github_desc">查看源代码、提交错误报告和改进建议</string>
<string name="tip_discard_changes">退出编辑后将无法找回你修改过的数据。确定退出编辑吗?</string>
</resources>
1 change: 1 addition & 0 deletions app/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -82,4 +82,5 @@
<string name="pref_category_todo_list">To-Do List</string>
<string name="pref_view_on_github">View On GitHub</string>
<string name="pref_view_on_github_desc">View source code, submit bug reports, and improvement suggestions</string>
<string name="tip_discard_changes">After exiting edit mode, you will not be able to retrieve the data you have modified. Are you sure you want to exit editing?</string>
</resources>

0 comments on commit 40961c7

Please sign in to comment.