Procházet zdrojové kódy

added date field autofocus

sirekanian před 3 roky
rodič
revize
847b171d3b

+ 2 - 1
app/src/main/java/com/sirekanian/spacetime/MainState.kt

@@ -10,6 +10,7 @@ import com.sirekanian.spacetime.ext.currentDate
 import com.sirekanian.spacetime.ext.minusMonths
 import com.sirekanian.spacetime.ext.minusMonths
 import com.sirekanian.spacetime.ext.withDayOfMonth
 import com.sirekanian.spacetime.ext.withDayOfMonth
 import com.sirekanian.spacetime.model.Draft
 import com.sirekanian.spacetime.model.Draft
+import com.sirekanian.spacetime.model.EditablePage
 import com.sirekanian.spacetime.model.ImagePage
 import com.sirekanian.spacetime.model.ImagePage
 import com.sirekanian.spacetime.model.Thumbnail
 import com.sirekanian.spacetime.model.Thumbnail
 import kotlinx.datetime.LocalDate
 import kotlinx.datetime.LocalDate
@@ -18,7 +19,7 @@ class MainState {
 
 
     @OptIn(ExperimentalPagerApi::class)
     @OptIn(ExperimentalPagerApi::class)
     val pagerState = PagerState()
     val pagerState = PagerState()
-    var editablePage by mutableStateOf<Int?>(null)
+    var editablePage by mutableStateOf<EditablePage?>(null)
     var pages by mutableStateOf(listOf<ImagePage>())
     var pages by mutableStateOf(listOf<ImagePage>())
     var draft by mutableStateOf<Draft?>(null)
     var draft by mutableStateOf<Draft?>(null)
     var thumbnails by mutableStateOf(listOf<Thumbnail>())
     var thumbnails by mutableStateOf(listOf<Thumbnail>())

+ 5 - 0
app/src/main/java/com/sirekanian/spacetime/model/EditablePage.kt

@@ -0,0 +1,5 @@
+package com.sirekanian.spacetime.model
+
+class EditablePage(val page: ImagePage, val autofocus: Autofocus) {
+    enum class Autofocus { NAME, DATE }
+}

+ 18 - 9
app/src/main/java/com/sirekanian/spacetime/ui/ImagePageContent.kt

@@ -36,6 +36,8 @@ import com.sirekanian.spacetime.MainState
 import com.sirekanian.spacetime.R
 import com.sirekanian.spacetime.R
 import com.sirekanian.spacetime.ext.DefaultAnimatedVisibility
 import com.sirekanian.spacetime.ext.DefaultAnimatedVisibility
 import com.sirekanian.spacetime.ext.VectorIconButton
 import com.sirekanian.spacetime.ext.VectorIconButton
+import com.sirekanian.spacetime.model.EditablePage
+import com.sirekanian.spacetime.model.EditablePage.Autofocus
 import com.sirekanian.spacetime.model.ImagePage
 import com.sirekanian.spacetime.model.ImagePage
 
 
 @Composable
 @Composable
@@ -46,7 +48,7 @@ fun ImagePageContent(
     onDelete: () -> Unit,
     onDelete: () -> Unit,
     onDone: (ImagePage) -> Unit,
     onDone: (ImagePage) -> Unit,
 ) {
 ) {
-    val isEditMode = state.editablePage == page.id
+    val isEditMode = state.editablePage?.page?.id == page.id
     BackHandler(isEditMode) {
     BackHandler(isEditMode) {
         state.editablePage = null
         state.editablePage = null
     }
     }
@@ -116,25 +118,25 @@ fun ImagePageContent(
             val ripple = LocalRippleTheme.current
             val ripple = LocalRippleTheme.current
             val rippleAlpha = ripple.rippleAlpha().pressedAlpha
             val rippleAlpha = ripple.rippleAlpha().pressedAlpha
             val rippleColor = ripple.defaultColor().copy(alpha = rippleAlpha)
             val rippleColor = ripple.defaultColor().copy(alpha = rippleAlpha)
-            val focusRequester = remember { FocusRequester() }
+            val nameFocusRequester = remember { FocusRequester() }
+            val dateFocusRequester = remember { FocusRequester() }
             OutlinedTextField(
             OutlinedTextField(
                 value = name.field,
                 value = name.field,
                 onValueChange = { name.field = it },
                 onValueChange = { name.field = it },
                 modifier = Modifier
                 modifier = Modifier
                     .fillMaxWidth()
                     .fillMaxWidth()
-                    .focusRequester(focusRequester),
+                    .focusRequester(nameFocusRequester),
                 textStyle = textStyle,
                 textStyle = textStyle,
                 placeholder = { Text("Title", Modifier.fillMaxWidth(), style = textStyle) },
                 placeholder = { Text("Title", Modifier.fillMaxWidth(), style = textStyle) },
                 maxLines = 2,
                 maxLines = 2,
                 colors = TextFieldDefaults.outlinedTextFieldColors(backgroundColor = rippleColor),
                 colors = TextFieldDefaults.outlinedTextFieldColors(backgroundColor = rippleColor),
             )
             )
-            LaunchedEffect(Unit) {
-                focusRequester.requestFocus()
-            }
             OutlinedTextField(
             OutlinedTextField(
                 value = date.value,
                 value = date.value,
                 onValueChange = { date = DateField(it) },
                 onValueChange = { date = DateField(it) },
-                modifier = Modifier.fillMaxWidth(),
+                modifier = Modifier
+                    .fillMaxWidth()
+                    .focusRequester(dateFocusRequester),
                 textStyle = textStyle,
                 textStyle = textStyle,
                 placeholder = { Text("YYYY-MM-DD", Modifier.fillMaxWidth(), style = textStyle) },
                 placeholder = { Text("YYYY-MM-DD", Modifier.fillMaxWidth(), style = textStyle) },
                 isError = !isDateValid,
                 isError = !isDateValid,
@@ -143,6 +145,13 @@ fun ImagePageContent(
                 singleLine = true,
                 singleLine = true,
                 colors = TextFieldDefaults.outlinedTextFieldColors(backgroundColor = rippleColor),
                 colors = TextFieldDefaults.outlinedTextFieldColors(backgroundColor = rippleColor),
             )
             )
+            LaunchedEffect(Unit) {
+                when (state.editablePage?.autofocus) {
+                    Autofocus.NAME -> nameFocusRequester
+                    Autofocus.DATE -> dateFocusRequester
+                    null -> null
+                }?.requestFocus()
+            }
         } else {
         } else {
             val haptic = LocalHapticFeedback.current
             val haptic = LocalHapticFeedback.current
             Text(
             Text(
@@ -151,7 +160,7 @@ fun ImagePageContent(
                     .fillMaxWidth()
                     .fillMaxWidth()
                     .clip(MaterialTheme.shapes.small)
                     .clip(MaterialTheme.shapes.small)
                     .combinedClickable(onLongClick = {
                     .combinedClickable(onLongClick = {
-                        state.editablePage = page.id
+                        state.editablePage = EditablePage(page, Autofocus.NAME)
                         haptic.performHapticFeedback(HapticFeedbackType.LongPress)
                         haptic.performHapticFeedback(HapticFeedbackType.LongPress)
                     }) {}
                     }) {}
                     .padding(16.dp),
                     .padding(16.dp),
@@ -172,7 +181,7 @@ fun ImagePageContent(
                         .fillMaxWidth()
                         .fillMaxWidth()
                         .clip(MaterialTheme.shapes.small)
                         .clip(MaterialTheme.shapes.small)
                         .combinedClickable(onLongClick = {
                         .combinedClickable(onLongClick = {
-                            state.editablePage = page.id
+                            state.editablePage = EditablePage(page, Autofocus.DATE)
                             haptic.performHapticFeedback(HapticFeedbackType.LongPress)
                             haptic.performHapticFeedback(HapticFeedbackType.LongPress)
                         }) {}
                         }) {}
                         .padding(16.dp),
                         .padding(16.dp),