feat(editor): 在编辑模式下用户修改待办后阻止返回
This commit is contained in:
parent
de27d5ddb5
commit
40961c70a8
4 changed files with 123 additions and 3 deletions
|
|
@ -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
|
||||
)
|
||||
}
|
||||
}
|
||||
|
|
@ -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 }
|
||||
)
|
||||
}
|
||||
|
|
@ -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>
|
||||
|
|
@ -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>
|
||||
Loading…
Reference in a new issue