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