From 28763176cff1173f0b11471028c69c3383632526 Mon Sep 17 00:00:00 2001 From: Super12138 <70494801+Super12138@users.noreply.github.com> Date: Fri, 27 Jun 2025 09:09:22 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E9=87=8D=E6=9E=84=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle.kts | 2 +- .../todo/ui/navigation/TodoNavigation.kt | 10 +-- .../todo/ui/pages/editor/TodoEditorPage.kt | 61 ++------------- .../editor/components/TodoContentTextField.kt | 30 ++++++++ .../editor/components/TodoPrioritySlider.kt | 75 +++++++++++++++++++ 5 files changed, 113 insertions(+), 65 deletions(-) create mode 100644 app/src/main/kotlin/cn/super12138/todo/ui/pages/editor/components/TodoContentTextField.kt create mode 100644 app/src/main/kotlin/cn/super12138/todo/ui/pages/editor/components/TodoPrioritySlider.kt diff --git a/app/build.gradle.kts b/app/build.gradle.kts index afb117c..562d0da 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -34,7 +34,7 @@ android { applicationId = "cn.super12138.todo" minSdk = 24 targetSdk = 36 - versionCode = 719 + versionCode = 726 versionName = "2.1.2" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" 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 12d5529..3fb9724 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 @@ -102,17 +102,11 @@ fun TodoNavigation( } composable(TodoScreen.SettingsAppearance.name) { - SettingsAppearance( - viewModel = viewModel, - onNavigateUp = { navController.navigateUp() } - ) + SettingsAppearance(onNavigateUp = { navController.navigateUp() }) } composable(TodoScreen.SettingsInterface.name) { - SettingsInterface( - viewModel = viewModel, - onNavigateUp = { navController.navigateUp() } - ) + SettingsInterface(onNavigateUp = { navController.navigateUp() }) } composable(TodoScreen.SettingsData.name) { 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 9b1eb1b..de24e06 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 @@ -1,12 +1,10 @@ package cn.super12138.todo.ui.pages.editor -import android.view.HapticFeedbackConstants import androidx.activity.compose.BackHandler import androidx.compose.animation.AnimatedVisibility import androidx.compose.animation.AnimatedVisibilityScope import androidx.compose.animation.ExperimentalSharedTransitionApi import androidx.compose.animation.SharedTransitionScope -import androidx.compose.foundation.interaction.MutableInteractionSource import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row @@ -16,8 +14,6 @@ import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.imePadding import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size -import androidx.compose.foundation.layout.sizeIn -import androidx.compose.foundation.layout.wrapContentWidth import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll import androidx.compose.material.icons.Icons @@ -25,11 +21,7 @@ import androidx.compose.material.icons.automirrored.outlined.Undo import androidx.compose.material.icons.outlined.Delete import androidx.compose.material.icons.outlined.Save import androidx.compose.material3.ExperimentalMaterial3Api -import androidx.compose.material3.Label import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.PlainTooltip -import androidx.compose.material3.Slider -import androidx.compose.material3.SliderDefaults import androidx.compose.material3.Switch import androidx.compose.material3.Text import androidx.compose.material3.TextField @@ -48,16 +40,10 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalView import androidx.compose.ui.res.stringResource -import androidx.compose.ui.semantics.LiveRegionMode -import androidx.compose.ui.semantics.contentDescription -import androidx.compose.ui.semantics.liveRegion -import androidx.compose.ui.semantics.semantics -import androidx.compose.ui.semantics.stateDescription import androidx.compose.ui.unit.dp import cn.super12138.todo.R import cn.super12138.todo.constants.Constants import cn.super12138.todo.logic.database.TodoEntity -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 @@ -65,6 +51,8 @@ import cn.super12138.todo.ui.components.ChipItem import cn.super12138.todo.ui.components.ConfirmDialog import cn.super12138.todo.ui.components.FilterChipGroup import cn.super12138.todo.ui.components.LargeTopAppBarScaffold +import cn.super12138.todo.ui.pages.editor.components.TodoContentTextField +import cn.super12138.todo.ui.pages.editor.components.TodoPrioritySlider import cn.super12138.todo.utils.VibrationUtils @OptIn(ExperimentalMaterial3Api::class, ExperimentalSharedTransitionApi::class) @@ -175,16 +163,10 @@ fun TodoEditorPage( .verticalScroll(rememberScrollState()) ) { with(sharedTransitionScope) { - TextField( + TodoContentTextField( value = toDoContent, onValueChange = { toDoContent = it }, - label = { Text(stringResource(R.string.placeholder_add_todo)) }, isError = isErrorContent, - supportingText = { - AnimatedVisibility(isErrorContent) { - Text(stringResource(R.string.error_no_content_entered)) - } - }, modifier = Modifier .fillMaxWidth() .sharedBounds( @@ -251,42 +233,9 @@ fun TodoEditorPage( Spacer(Modifier.size(5.dp)) - val priorityName = - Priority.entries.map { it.getDisplayName(context) } // 要不要用 remember 呢 - val interactionSource = remember { MutableInteractionSource() } - Slider( - modifier = Modifier.semantics { - contentDescription = - context.getString(R.string.label_priority) + priorityName[Priority.fromFloat( - priorityState - ).ordinal] - stateDescription = priorityName[Priority.fromFloat(priorityState).ordinal] - liveRegion = LiveRegionMode.Polite - }, + TodoPrioritySlider( value = priorityState, - onValueChange = { - VibrationUtils.performHapticFeedback(view, HapticFeedbackConstants.LONG_PRESS) - priorityState = it - }, - valueRange = -2f..2f, - steps = 3, - interactionSource = interactionSource, - thumb = { - Label( - label = { - PlainTooltip( - modifier = Modifier - .sizeIn(45.dp, 25.dp) - .wrapContentWidth() - ) { - Text(priorityName[Priority.fromFloat(priorityState).ordinal]) - } - }, - interactionSource = interactionSource - ) { - SliderDefaults.Thumb(interactionSource) - } - } + onValueChange = { priorityState = it }, ) Spacer(Modifier.size(10.dp)) diff --git a/app/src/main/kotlin/cn/super12138/todo/ui/pages/editor/components/TodoContentTextField.kt b/app/src/main/kotlin/cn/super12138/todo/ui/pages/editor/components/TodoContentTextField.kt new file mode 100644 index 0000000..5078951 --- /dev/null +++ b/app/src/main/kotlin/cn/super12138/todo/ui/pages/editor/components/TodoContentTextField.kt @@ -0,0 +1,30 @@ +package cn.super12138.todo.ui.pages.editor.components + +import androidx.compose.animation.AnimatedVisibility +import androidx.compose.material3.Text +import androidx.compose.material3.TextField +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource +import cn.super12138.todo.R + +@Composable +fun TodoContentTextField( + value: String, + onValueChange: (String) -> Unit, + isError: Boolean, + modifier: Modifier = Modifier +) { + TextField( + value = value, + onValueChange = onValueChange, + label = { Text(stringResource(R.string.placeholder_add_todo)) }, + isError = isError, + supportingText = { + AnimatedVisibility(isError) { + Text(stringResource(R.string.error_no_content_entered)) + } + }, + modifier = modifier + ) +} \ No newline at end of file diff --git a/app/src/main/kotlin/cn/super12138/todo/ui/pages/editor/components/TodoPrioritySlider.kt b/app/src/main/kotlin/cn/super12138/todo/ui/pages/editor/components/TodoPrioritySlider.kt new file mode 100644 index 0000000..51513a2 --- /dev/null +++ b/app/src/main/kotlin/cn/super12138/todo/ui/pages/editor/components/TodoPrioritySlider.kt @@ -0,0 +1,75 @@ +package cn.super12138.todo.ui.pages.editor.components + +import android.view.HapticFeedbackConstants +import androidx.compose.foundation.interaction.MutableInteractionSource +import androidx.compose.foundation.layout.sizeIn +import androidx.compose.foundation.layout.wrapContentWidth +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.Label +import androidx.compose.material3.PlainTooltip +import androidx.compose.material3.Slider +import androidx.compose.material3.SliderDefaults +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.remember +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.platform.LocalView +import androidx.compose.ui.semantics.LiveRegionMode +import androidx.compose.ui.semantics.contentDescription +import androidx.compose.ui.semantics.liveRegion +import androidx.compose.ui.semantics.semantics +import androidx.compose.ui.semantics.stateDescription +import androidx.compose.ui.unit.dp +import cn.super12138.todo.R +import cn.super12138.todo.logic.model.Priority +import cn.super12138.todo.utils.VibrationUtils + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun TodoPrioritySlider( + value: Float, + onValueChange: (Float) -> Unit, + modifier: Modifier = Modifier +) { + val view = LocalView.current + val context = LocalContext.current + + val priorityName = remember { Priority.entries.map { it.getDisplayName(context) } } + val interactionSource = remember { MutableInteractionSource() } + + Slider( + value = value, + onValueChange = { + VibrationUtils.performHapticFeedback(view, HapticFeedbackConstants.LONG_PRESS) + onValueChange(it) + }, + valueRange = -2f..2f, + steps = 3, + interactionSource = interactionSource, + thumb = { + Label( + label = { + PlainTooltip( + modifier = Modifier + .sizeIn(45.dp, 25.dp) + .wrapContentWidth() + ) { + Text(priorityName[Priority.fromFloat(value).ordinal]) + } + }, + interactionSource = interactionSource + ) { + SliderDefaults.Thumb(interactionSource) + } + }, + modifier = modifier.semantics { + contentDescription = + context.getString(R.string.label_priority) + priorityName[Priority.fromFloat( + value + ).ordinal] + stateDescription = priorityName[Priority.fromFloat(value).ordinal] + liveRegion = LiveRegionMode.Polite + } + ) +} \ No newline at end of file