diff --git a/app/src/main/kotlin/cn/super12138/todo/ui/components/Dialog.kt b/app/src/main/kotlin/cn/super12138/todo/ui/components/Dialog.kt new file mode 100644 index 0000000..ca972f8 --- /dev/null +++ b/app/src/main/kotlin/cn/super12138/todo/ui/components/Dialog.kt @@ -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 + ) + } +} \ No newline at end of file diff --git a/app/src/main/kotlin/cn/super12138/todo/ui/pages/editor/TodoEditorPage.kt b/app/src/main/kotlin/cn/super12138/todo/ui/pages/editor/TodoEditorPage.kt index ce6a413..b3ddae3 100644 --- a/app/src/main/kotlin/cn/super12138/todo/ui/pages/editor/TodoEditorPage.kt +++ b/app/src/main/kotlin/cn/super12138/todo/ui/pages/editor/TodoEditorPage.kt @@ -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 @@ -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 @@ -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() @@ -131,7 +160,9 @@ fun TodoEditorPage( } } }, - onBack = onNavigateUp, + onBack = { + checkModifiedBeforeBack() + }, modifier = modifier ) { innerPadding -> Column( @@ -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 } + ) } \ No newline at end of file diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index e27e58e..d42ec87 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -81,4 +81,5 @@ 待办列表 在 GitHub 上查看 查看源代码、提交错误报告和改进建议 + 退出编辑后将无法找回你修改过的数据。确定退出编辑吗? \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 3b8f158..afdf172 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -82,4 +82,5 @@ To-Do List View On GitHub View source code, submit bug reports, and improvement suggestions + After exiting edit mode, you will not be able to retrieve the data you have modified. Are you sure you want to exit editing? \ No newline at end of file