From ca08c21ca5f5794cb943343e4df756973ff24085 Mon Sep 17 00:00:00 2001 From: Super12138 <70494801+Super12138@users.noreply.github.com> Date: Thu, 16 Jan 2025 22:09:46 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=B0=86=E5=BE=85=E5=8A=9E=20BottomShe?= =?UTF-8?q?et=20=E6=8F=90=E5=8F=96=E4=B8=BA=E5=8D=95=E7=8B=AC=E9=A1=B5?= =?UTF-8?q?=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../todo/ui/navigation/TodoNavigation.kt | 23 +++++++++ .../todo/ui/navigation/TodoScreen.kt | 1 + .../TodoEditorPage.kt} | 47 ++++++++----------- .../super12138/todo/ui/pages/main/MainPage.kt | 41 ++-------------- app/src/main/res/values-zh-rCN/strings.xml | 1 + app/src/main/res/values/strings.xml | 1 + 6 files changed, 48 insertions(+), 66 deletions(-) rename app/src/main/kotlin/cn/super12138/todo/ui/pages/{main/TodoBottomSheet.kt => editor/TodoEditorPage.kt} (83%) diff --git a/app/src/main/kotlin/cn/super12138/todo/ui/navigation/TodoNavigation.kt b/app/src/main/kotlin/cn/super12138/todo/ui/navigation/TodoNavigation.kt index ad330f9..afff978 100644 --- a/app/src/main/kotlin/cn/super12138/todo/ui/navigation/TodoNavigation.kt +++ b/app/src/main/kotlin/cn/super12138/todo/ui/navigation/TodoNavigation.kt @@ -6,6 +6,7 @@ import androidx.navigation.NavHostController import androidx.navigation.compose.NavHost import androidx.navigation.compose.composable import androidx.navigation.compose.rememberNavController +import cn.super12138.todo.ui.pages.editor.TodoEditorPage import cn.super12138.todo.ui.pages.main.MainPage import cn.super12138.todo.ui.pages.settings.SettingsAbout import cn.super12138.todo.ui.pages.settings.SettingsAboutLicence @@ -51,10 +52,32 @@ fun TodoNavigation( composable(TodoScreen.Main.name) { MainPage( viewModel = viewModel, + toTodoEditPage = { navController.navigate(TodoScreen.TodoEditor.name) }, toSettingsPage = { navController.navigate(TodoScreen.SettingsMain.name) } ) } + composable(TodoScreen.TodoEditor.name) { + TodoEditorPage( + toDo = viewModel.selectedEditTodo, + onSave = { + viewModel.addTodo(it) + navController.navigateUp() + }, + onDelete = { + if (viewModel.selectedEditTodo !== null) { + viewModel.deleteTodo(viewModel.selectedEditTodo!!) + viewModel.setEditTodoItem(null) + } + navController.navigateUp() + }, + onNavigateUp = { + viewModel.setEditTodoItem(null) + navController.navigateUp() + } + ) + } + composable(TodoScreen.SettingsMain.name) { SettingsMain( onNavigateUp = { navController.navigateUp() }, diff --git a/app/src/main/kotlin/cn/super12138/todo/ui/navigation/TodoScreen.kt b/app/src/main/kotlin/cn/super12138/todo/ui/navigation/TodoScreen.kt index 784a831..071f32f 100644 --- a/app/src/main/kotlin/cn/super12138/todo/ui/navigation/TodoScreen.kt +++ b/app/src/main/kotlin/cn/super12138/todo/ui/navigation/TodoScreen.kt @@ -2,6 +2,7 @@ package cn.super12138.todo.ui.navigation enum class TodoScreen { Main, + TodoEditor, SettingsMain, SettingsAbout, SettingsAboutLicence diff --git a/app/src/main/kotlin/cn/super12138/todo/ui/pages/main/TodoBottomSheet.kt b/app/src/main/kotlin/cn/super12138/todo/ui/pages/editor/TodoEditorPage.kt similarity index 83% rename from app/src/main/kotlin/cn/super12138/todo/ui/pages/main/TodoBottomSheet.kt rename to app/src/main/kotlin/cn/super12138/todo/ui/pages/editor/TodoEditorPage.kt index dd5db82..6adb795 100644 --- a/app/src/main/kotlin/cn/super12138/todo/ui/pages/main/TodoBottomSheet.kt +++ b/app/src/main/kotlin/cn/super12138/todo/ui/pages/editor/TodoEditorPage.kt @@ -1,10 +1,11 @@ -package cn.super12138.todo.ui.pages.main +package cn.super12138.todo.ui.pages.editor import androidx.compose.animation.AnimatedVisibility import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size @@ -14,11 +15,9 @@ import androidx.compose.material3.ButtonColors import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.FilledTonalButton import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.ModalBottomSheet -import androidx.compose.material3.OutlinedButton -import androidx.compose.material3.SheetState import androidx.compose.material3.Text import androidx.compose.material3.TextField +import androidx.compose.material3.TopAppBarDefaults import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableIntStateOf @@ -26,7 +25,6 @@ import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.setValue -import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource @@ -36,38 +34,32 @@ import cn.super12138.todo.logic.database.TodoEntity import cn.super12138.todo.logic.model.Subjects import cn.super12138.todo.ui.TodoDefaults import cn.super12138.todo.ui.components.FilterChipGroup +import cn.super12138.todo.ui.components.LargeTopAppBarScaffold @OptIn(ExperimentalMaterial3Api::class) @Composable -fun TodoBottomSheet( - sheetState: SheetState, - onDismissRequest: () -> Unit, +fun TodoEditorPage( toDo: TodoEntity? = null, onSave: (TodoEntity) -> Unit, - onClose: () -> Unit, onDelete: () -> Unit, + onNavigateUp: () -> Unit, modifier: Modifier = Modifier ) { val context = LocalContext.current - - ModalBottomSheet( - sheetState = sheetState, - onDismissRequest = onDismissRequest, + val scrollBehavior = TopAppBarDefaults.exitUntilCollapsedScrollBehavior() + LargeTopAppBarScaffold( + title = stringResource(if (toDo != null) R.string.title_edit_task else R.string.action_add_task), + scrollBehavior = scrollBehavior, + onBack = onNavigateUp, modifier = modifier - ) { + ) { innerPadding -> Column( - horizontalAlignment = Alignment.CenterHorizontally, modifier = Modifier + .padding(innerPadding) .padding(horizontal = TodoDefaults.screenPadding) + .fillMaxSize() .verticalScroll(rememberScrollState()) ) { - Text( - text = stringResource(if (toDo != null) R.string.title_edit_task else R.string.action_add_task), - style = MaterialTheme.typography.headlineMedium - ) - - Spacer(Modifier.size(20.dp)) - var text by rememberSaveable { mutableStateOf(toDo?.content ?: "") } var isError by rememberSaveable { mutableStateOf(false) } TextField( @@ -91,6 +83,10 @@ fun TodoBottomSheet( } } var selectedItemIndex by rememberSaveable { mutableIntStateOf(toDo?.subject ?: 0) } + Text( + text = stringResource(R.string.label_subject), + style = MaterialTheme.typography.titleMedium + ) FilterChipGroup( items = subjects, defaultSelectedItemIndex = toDo?.subject ?: 0, @@ -102,15 +98,12 @@ fun TodoBottomSheet( Spacer(Modifier.size(20.dp)) + // 操作按钮 Row(horizontalArrangement = Arrangement.spacedBy(10.dp)) { - OutlinedButton(onClick = onClose) { - Text(stringResource(R.string.action_cancel)) - } if (toDo !== null) { FilledTonalButton( onClick = { onDelete() - onClose() }, colors = ButtonColors( containerColor = MaterialTheme.colorScheme.errorContainer, @@ -139,13 +132,11 @@ fun TodoBottomSheet( id = toDo?.id ?: 0 ) ) - onClose() } ) { Text(stringResource(R.string.action_save)) } } - Spacer(Modifier.size(30.dp)) } } } \ No newline at end of file diff --git a/app/src/main/kotlin/cn/super12138/todo/ui/pages/main/MainPage.kt b/app/src/main/kotlin/cn/super12138/todo/ui/pages/main/MainPage.kt index ffa30f9..ef234a3 100644 --- a/app/src/main/kotlin/cn/super12138/todo/ui/pages/main/MainPage.kt +++ b/app/src/main/kotlin/cn/super12138/todo/ui/pages/main/MainPage.kt @@ -15,17 +15,14 @@ import androidx.compose.foundation.layout.ime import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.safeContent import androidx.compose.foundation.lazy.rememberLazyListState -import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Scaffold import androidx.compose.material3.adaptive.currentWindowAdaptiveInfo -import androidx.compose.material3.rememberModalBottomSheetState import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember -import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier @@ -35,12 +32,11 @@ import cn.super12138.todo.ui.pages.main.components.TodoDeleteConfirmDialog import cn.super12138.todo.ui.pages.main.components.TodoFAB import cn.super12138.todo.ui.pages.main.components.TodoTopAppBar import cn.super12138.todo.ui.viewmodels.MainViewModel -import kotlinx.coroutines.launch -@OptIn(ExperimentalMaterial3Api::class) @Composable fun MainPage( viewModel: MainViewModel, + toTodoEditPage: () -> Unit, toSettingsPage: () -> Unit, modifier: Modifier = Modifier ) { @@ -52,12 +48,8 @@ fun MainPage( } } - val selectedEditTodoItem = viewModel.selectedEditTodo val selectedTodoIds = viewModel.selectedTodoIds.collectAsState() - var showBottomSheet by rememberSaveable { mutableStateOf(false) } var showDeleteConfirmDialog by rememberSaveable { mutableStateOf(false) } - val bottomSheetState = rememberModalBottomSheetState(skipPartiallyExpanded = true) - val scope = rememberCoroutineScope() val windowSizeClass = currentWindowAdaptiveInfo().windowSizeClass @@ -95,7 +87,7 @@ fun MainPage( ) { TodoFAB( expanded = isExpanded, - onClick = { showBottomSheet = true } + onClick = toTodoEditPage ) } }, @@ -117,8 +109,8 @@ fun MainPage( list = filteredTodoList, onItemClick = { item -> if (isSelectedIdsEmpty) { - showBottomSheet = true viewModel.setEditTodoItem(item) + toTodoEditPage() } else { viewModel.toggleTodoSelection(item) } @@ -159,7 +151,6 @@ fun MainPage( list = filteredTodoList, onItemClick = { item -> if (isSelectedIdsEmpty) { - showBottomSheet = true viewModel.setEditTodoItem(item) } else { viewModel.toggleTodoSelection(item) @@ -189,32 +180,6 @@ fun MainPage( } } } - if (showBottomSheet) { - TodoBottomSheet( - sheetState = bottomSheetState, - onDismissRequest = { - showBottomSheet = false - viewModel.setEditTodoItem(null) - }, - toDo = selectedEditTodoItem, - onSave = { toDo -> - viewModel.addTodo(toDo) - }, - onClose = { - viewModel.setEditTodoItem(null) - scope - .launch { bottomSheetState.hide() } - .invokeOnCompletion { - if (!bottomSheetState.isVisible) { - showBottomSheet = false - } - } - }, - onDelete = { - if (selectedEditTodoItem !== null) viewModel.deleteTodo(selectedEditTodoItem) - } - ) - } if (showDeleteConfirmDialog) { TodoDeleteConfirmDialog( onConfirm = { diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 9e01901..a47fdc9 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -39,4 +39,5 @@ 开发者 开放源代码许可 查看应用使用的开源库及其许可 + 学科 \ 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 c6dbcc1..b909faf 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -40,4 +40,5 @@ Developer Open Source Licences Check the open source libraries used by the application and their licences. + Subject \ No newline at end of file