Ver Fonte

Add autofocus

Lee Morgan há 2 semanas atrás
pai
commit
e8e6a89e9e

+ 11 - 2
app/src/main/java/com/example/torus/ui/CreateWorkoutScreen.kt

@@ -45,12 +45,20 @@ fun CreateWorkoutScreen(
     var showExerciseTypes by rememberSaveable { mutableStateOf(false) }
     var isSaving by remember { mutableStateOf(false) }
     val exercises = remember { mutableStateListOf<DraftExercise>() }
+    var autoFocusExerciseId by remember { mutableStateOf<String?>(null) }
     val scrollState = rememberScrollState()
     val coroutineScope = rememberCoroutineScope()
 
     fun addExercise(type: ExerciseType) {
-        exercises += DraftExercise(id = UuidV7.generateString(), type = type)
+        val exercise = DraftExercise(id = UuidV7.generateString(), type = type)
+        exercises += exercise
         showExerciseTypes = false
+        autoFocusExerciseId = exercise.id
+        coroutineScope.launch {
+            withFrameNanos { }
+            withFrameNanos { }
+            scrollState.animateScrollTo(scrollState.maxValue)
+        }
     }
 
     Column(modifier = modifier.fillMaxSize()) {
@@ -80,7 +88,8 @@ fun CreateWorkoutScreen(
                         name = exercise.name,
                         onNameChange = { name ->
                             updateExercise(exercises, exercise.id) { it.copy(name = name) }
-                        }
+                        },
+                        autoFocusName = exercise.id == autoFocusExerciseId
                     )
                 }
             }

+ 11 - 2
app/src/main/java/com/example/torus/ui/EditWorkoutScreen.kt

@@ -45,6 +45,7 @@ fun EditWorkoutScreen(
     var isSaving by remember { mutableStateOf(false) }
     var loaded by remember { mutableStateOf(false) }
     val exercises = remember { mutableStateListOf<DraftExercise>() }
+    var autoFocusExerciseId by remember { mutableStateOf<String?>(null) }
     val scrollState = rememberScrollState()
     val coroutineScope = rememberCoroutineScope()
 
@@ -57,8 +58,15 @@ fun EditWorkoutScreen(
     }
 
     fun addExercise(type: ExerciseType) {
-        exercises += DraftExercise(id = UuidV7.generateString(), type = type)
+        val exercise = DraftExercise(id = UuidV7.generateString(), type = type)
+        exercises += exercise
         showExerciseTypes = false
+        autoFocusExerciseId = exercise.id
+        coroutineScope.launch {
+            withFrameNanos { }
+            withFrameNanos { }
+            scrollState.animateScrollTo(scrollState.maxValue)
+        }
     }
 
     if (!loaded) {
@@ -105,7 +113,8 @@ fun EditWorkoutScreen(
                         },
                         onRemove = {
                             exercises.removeAll { it.id == exercise.id }
-                        }
+                        },
+                        autoFocusName = exercise.id == autoFocusExerciseId
                     )
                 }
             }

+ 16 - 2
app/src/main/java/com/example/torus/ui/WorkoutEditorComponents.kt

@@ -19,8 +19,13 @@ import androidx.compose.material3.Text
 import androidx.compose.material3.TextButton
 import androidx.compose.material3.TextFieldColors
 import androidx.compose.runtime.Composable
+import androidx.compose.runtime.LaunchedEffect
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.withFrameNanos
 import androidx.compose.ui.Alignment
 import androidx.compose.ui.Modifier
+import androidx.compose.ui.focus.FocusRequester
+import androidx.compose.ui.focus.focusRequester
 import androidx.compose.ui.res.stringResource
 import androidx.compose.ui.unit.dp
 import com.example.torus.R
@@ -56,8 +61,16 @@ fun NamedExerciseEditor(
     modifier: Modifier = Modifier,
     onMoveUp: (() -> Unit)? = null,
     onMoveDown: (() -> Unit)? = null,
-    onRemove: (() -> Unit)? = null
+    onRemove: (() -> Unit)? = null,
+    autoFocusName: Boolean = false
 ) {
+    val nameFocusRequester = remember { FocusRequester() }
+    LaunchedEffect(autoFocusName) {
+        if (autoFocusName) {
+            withFrameNanos { }
+            nameFocusRequester.requestFocus()
+        }
+    }
     val shape = RoundedCornerShape(14.dp)
     Column(
         modifier = modifier
@@ -85,7 +98,8 @@ fun NamedExerciseEditor(
         TorusTextField(
             value = name,
             onValueChange = onNameChange,
-            label = stringResource(R.string.exercise_name)
+            label = stringResource(R.string.exercise_name),
+            modifier = Modifier.focusRequester(nameFocusRequester)
         )
         if (onMoveUp != null || onMoveDown != null || onRemove != null) {
             Row(