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.foundation.verticalScroll
|
||||||
import androidx.compose.material.icons.Icons
|
import androidx.compose.material.icons.Icons
|
||||||
import androidx.compose.material.icons.outlined.Delete
|
import androidx.compose.material.icons.outlined.Delete
|
||||||
|
import androidx.compose.material.icons.outlined.ErrorOutline
|
||||||
import androidx.compose.material.icons.outlined.Save
|
import androidx.compose.material.icons.outlined.Save
|
||||||
import androidx.compose.material3.ExperimentalMaterial3Api
|
import androidx.compose.material3.ExperimentalMaterial3Api
|
||||||
import androidx.compose.material3.Icon
|
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.logic.model.Subjects
|
||||||
import cn.super12138.todo.ui.TodoDefaults
|
import cn.super12138.todo.ui.TodoDefaults
|
||||||
import cn.super12138.todo.ui.components.AnimatedExtendedFloatingActionButton
|
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.FilterChipGroup
|
||||||
import cn.super12138.todo.ui.components.LargeTopAppBarScaffold
|
import cn.super12138.todo.ui.components.LargeTopAppBarScaffold
|
||||||
|
|
||||||
|
|
@ -66,8 +68,35 @@ fun TodoEditorPage(
|
||||||
animatedVisibilityScope: AnimatedVisibilityScope,
|
animatedVisibilityScope: AnimatedVisibilityScope,
|
||||||
modifier: Modifier = Modifier
|
modifier: Modifier = Modifier
|
||||||
) {
|
) {
|
||||||
BackHandler { // TODO: 实现用户更改后的阻止返回
|
var showConfirmDialog by rememberSaveable { mutableStateOf(false) }
|
||||||
onNavigateUp()
|
|
||||||
|
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 context = LocalContext.current
|
||||||
val scrollBehavior = TopAppBarDefaults.exitUntilCollapsedScrollBehavior()
|
val scrollBehavior = TopAppBarDefaults.exitUntilCollapsedScrollBehavior()
|
||||||
|
|
@ -131,7 +160,9 @@ fun TodoEditorPage(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
onBack = onNavigateUp,
|
onBack = {
|
||||||
|
checkModifiedBeforeBack()
|
||||||
|
},
|
||||||
modifier = modifier
|
modifier = modifier
|
||||||
) { innerPadding ->
|
) { innerPadding ->
|
||||||
Column(
|
Column(
|
||||||
|
|
@ -225,4 +256,18 @@ fun TodoEditorPage(
|
||||||
Spacer(Modifier.size(40.dp))
|
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_category_todo_list">待办列表</string>
|
||||||
<string name="pref_view_on_github">在 GitHub 上查看</string>
|
<string name="pref_view_on_github">在 GitHub 上查看</string>
|
||||||
<string name="pref_view_on_github_desc">查看源代码、提交错误报告和改进建议</string>
|
<string name="pref_view_on_github_desc">查看源代码、提交错误报告和改进建议</string>
|
||||||
|
<string name="tip_discard_changes">退出编辑后将无法找回你修改过的数据。确定退出编辑吗?</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|
@ -82,4 +82,5 @@
|
||||||
<string name="pref_category_todo_list">To-Do List</string>
|
<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">View On GitHub</string>
|
||||||
<string name="pref_view_on_github_desc">View source code, submit bug reports, and improvement suggestions</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>
|
</resources>
|
||||||
Loading…
Reference in a new issue