Skip to content

Commit

Permalink
Fix issues for textfields when pressing Enter with IME on
Browse files Browse the repository at this point in the history
  • Loading branch information
sdercolin committed Apr 3, 2024
1 parent d3b3f44 commit 93c43e9
Show file tree
Hide file tree
Showing 10 changed files with 54 additions and 72 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,11 @@ interface NavigatorListState<T : Any> {
newResults.indexOfFirst { it.index == currentIndex }.takeIf { it >= 0 }
}
}

fun submitCurrent() {
val index = selectedIndex ?: return
searchResult[index].index.let(::submit)
}
}

fun <T : Any> NavigatorListState<T>.onPreviewKeyEvent(event: KeyEvent): Boolean {
Expand All @@ -77,10 +82,6 @@ fun <T : Any> NavigatorListState<T>.onPreviewKeyEvent(event: KeyEvent): Boolean
selectedIndex = index.minus(1).coerceAtLeast(0)
true
}
event.isReleased(Key.Enter) -> {
searchResult[index].index.let(::submit)
true
}
else -> false
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.text.BasicTextField
import androidx.compose.foundation.text.KeyboardActions
import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.material.Icon
import androidx.compose.material.MaterialTheme
import androidx.compose.material.icons.Icons
Expand All @@ -20,6 +22,7 @@ import androidx.compose.ui.focus.onFocusChanged
import androidx.compose.ui.graphics.SolidColor
import androidx.compose.ui.input.key.KeyEvent
import androidx.compose.ui.input.key.onPreviewKeyEvent
import androidx.compose.ui.text.input.ImeAction
import androidx.compose.ui.unit.dp
import com.sdercolin.vlabeler.util.runIfHave

Expand All @@ -30,6 +33,7 @@ fun SearchBar(
focusRequester: FocusRequester? = null,
onFocusedChanged: ((Boolean) -> Unit)? = null,
onPreviewKeyEvent: ((KeyEvent) -> Boolean)? = null,
onSubmit: (() -> Unit)? = null,
modifier: Modifier = Modifier,
trailingContent: @Composable () -> Unit = {},
) {
Expand All @@ -50,6 +54,8 @@ fun SearchBar(
textStyle = MaterialTheme.typography.body2.copy(color = MaterialTheme.colors.onBackground),
cursorBrush = SolidColor(MaterialTheme.colors.onBackground),
singleLine = true,
keyboardOptions = KeyboardOptions(imeAction = ImeAction.Done),
keyboardActions = KeyboardActions(onDone = { onSubmit?.invoke() }),
)
trailingContent()
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.layout.widthIn
import androidx.compose.foundation.text.KeyboardActions
import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.material.MaterialTheme
import androidx.compose.material.OutlinedTextField
import androidx.compose.material.Text
Expand All @@ -21,13 +23,11 @@ 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.input.key.Key
import androidx.compose.ui.input.key.onKeyEvent
import androidx.compose.ui.text.TextRange
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.input.ImeAction
import androidx.compose.ui.text.input.TextFieldValue
import androidx.compose.ui.unit.dp
import com.sdercolin.vlabeler.env.isReleased
import com.sdercolin.vlabeler.ui.common.ConfirmButton
import com.sdercolin.vlabeler.ui.string.*
import com.sdercolin.vlabeler.util.removeControlCharacters
Expand Down Expand Up @@ -91,20 +91,15 @@ fun InputEntryNameDialog(
)
Spacer(Modifier.height(20.dp))
OutlinedTextField(
modifier = Modifier.width(150.dp)
.focusRequester(focusRequester)
.onKeyEvent {
if (it.isReleased(Key.Enter)) {
trySubmit()
true
} else {
false
}
},
modifier = Modifier.width(150.dp).focusRequester(focusRequester),
value = input,
singleLine = true,
isError = args.invalidOptions.contains(input.text) || input.text.isBlank(),
onValueChange = { input = it.copy(text = it.text.removeControlCharacters()) },
keyboardOptions = KeyboardOptions(imeAction = ImeAction.Done),
keyboardActions = KeyboardActions(
onDone = { trySubmit() },
),
)
Spacer(Modifier.height(25.dp))
Row(modifier = Modifier.align(Alignment.End), horizontalArrangement = Arrangement.End) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,11 +19,8 @@ import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.input.key.Key
import androidx.compose.ui.input.key.onKeyEvent
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp
import com.sdercolin.vlabeler.env.isReleased
import com.sdercolin.vlabeler.model.LabelerConf
import com.sdercolin.vlabeler.ui.common.CancelButton
import com.sdercolin.vlabeler.ui.common.ConfirmButton
Expand Down Expand Up @@ -144,15 +141,7 @@ private fun Content(
)
Spacer(Modifier.width(25.dp))
TextField(
modifier = Modifier.weight(1f)
.onKeyEvent {
if (it.isReleased(Key.Enter)) {
state.trySubmit()
true
} else {
false
}
},
modifier = Modifier.weight(1f),
value = state.getNotNull(index),
onValueChange = { state.update(index, it.ifBlank { null }) },
singleLine = true,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@ import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.layout.widthIn
import androidx.compose.foundation.text.KeyboardActions
import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.material.Icon
import androidx.compose.material.IconButton
import androidx.compose.material.MaterialTheme
Expand All @@ -30,13 +32,11 @@ 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.input.key.Key
import androidx.compose.ui.input.key.onKeyEvent
import androidx.compose.ui.text.TextRange
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.input.ImeAction
import androidx.compose.ui.text.input.TextFieldValue
import androidx.compose.ui.unit.dp
import com.sdercolin.vlabeler.env.isReleased
import com.sdercolin.vlabeler.model.AppConf
import com.sdercolin.vlabeler.model.Entry
import com.sdercolin.vlabeler.ui.common.ConfirmButton
Expand Down Expand Up @@ -109,19 +109,14 @@ fun MoveEntryDialog(
horizontalArrangement = Arrangement.spacedBy(10.dp),
) {
OutlinedTextField(
modifier = Modifier.width(150.dp)
.focusRequester(focusRequester)
.onKeyEvent { event ->
if (event.isReleased(Key.Enter)) {
submitIfValid()
true
} else {
false
}
},
modifier = Modifier.width(150.dp).focusRequester(focusRequester),
value = input,
singleLine = true,
onValueChange = { updateInput(it) },
keyboardOptions = KeyboardOptions(imeAction = ImeAction.Done),
keyboardActions = KeyboardActions(
onDone = { submitIfValid() },
),
)
IconButton(
enabled = validIndex > 0,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.text.KeyboardActions
import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.material.MaterialTheme
import androidx.compose.material.OutlinedTextField
import androidx.compose.material.Text
Expand All @@ -21,13 +23,11 @@ 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.input.key.Key
import androidx.compose.ui.input.key.onKeyEvent
import androidx.compose.ui.text.TextRange
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.input.ImeAction
import androidx.compose.ui.text.input.TextFieldValue
import androidx.compose.ui.unit.dp
import com.sdercolin.vlabeler.env.isReleased
import com.sdercolin.vlabeler.ui.common.ConfirmButton
import com.sdercolin.vlabeler.ui.string.LocalizedJsonString
import com.sdercolin.vlabeler.ui.string.Strings
Expand Down Expand Up @@ -80,22 +80,17 @@ fun SetEntryPropertyDialog(
)
Spacer(Modifier.height(20.dp))
OutlinedTextField(
modifier = Modifier.width(150.dp)
.focusRequester(focusRequester)
.onKeyEvent { event ->
if (event.isReleased(Key.Enter)) {
submitIfValid()
true
} else {
false
}
},
modifier = Modifier.width(150.dp).focusRequester(focusRequester),
value = input,
singleLine = true,
onValueChange = {
input = it
value = it.text.toFloatOrNull()
},
keyboardOptions = KeyboardOptions(imeAction = ImeAction.Done),
keyboardActions = KeyboardActions(
onDone = { submitIfValid() },
),
)
Spacer(Modifier.height(25.dp))
Row(modifier = Modifier.align(Alignment.End), horizontalArrangement = Arrangement.End) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.text.KeyboardActions
import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.material.MaterialTheme
import androidx.compose.material.OutlinedTextField
import androidx.compose.material.Text
Expand All @@ -21,13 +23,11 @@ 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.input.key.Key
import androidx.compose.ui.input.key.onKeyEvent
import androidx.compose.ui.text.TextRange
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.input.ImeAction
import androidx.compose.ui.text.input.TextFieldValue
import androidx.compose.ui.unit.dp
import com.sdercolin.vlabeler.env.isReleased
import com.sdercolin.vlabeler.ui.common.ConfirmButton
import com.sdercolin.vlabeler.ui.string.*

Expand Down Expand Up @@ -66,16 +66,7 @@ fun SetResolutionDialog(
)
Spacer(Modifier.height(20.dp))
OutlinedTextField(
modifier = Modifier.width(150.dp)
.focusRequester(focusRequester)
.onKeyEvent { event ->
if (event.isReleased(Key.Enter)) {
submitIfValid()
true
} else {
false
}
},
modifier = Modifier.width(150.dp).focusRequester(focusRequester),
value = input,
singleLine = true,
onValueChange = {
Expand All @@ -87,6 +78,10 @@ fun SetResolutionDialog(
null
}
},
keyboardOptions = KeyboardOptions(imeAction = ImeAction.Done),
keyboardActions = KeyboardActions(
onDone = { submitIfValid() },
),
)
Spacer(Modifier.height(25.dp))
Row(modifier = Modifier.align(Alignment.End), horizontalArrangement = Arrangement.End) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -151,6 +151,7 @@ fun EntryList(
onFocusedChanged(it)
},
onPreviewKeyEvent = state::onPreviewKeyEvent,
onSubmit = state::submitCurrent,
trailingContent = {
if (pinned) {
Row(verticalAlignment = Alignment.CenterVertically) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,7 @@ fun ModuleList(
state.hasFocus = it
},
onPreviewKeyEvent = state::onPreviewKeyEvent,
onSubmit = state::submitCurrent,
)

NavigatorListBody(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@ import androidx.compose.foundation.layout.width
import androidx.compose.foundation.layout.widthIn
import androidx.compose.foundation.layout.wrapContentSize
import androidx.compose.foundation.text.BasicTextField
import androidx.compose.foundation.text.KeyboardActions
import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.material.MaterialTheme
import androidx.compose.material.Text
import androidx.compose.runtime.Composable
Expand All @@ -38,6 +40,7 @@ import androidx.compose.ui.layout.Layout
import androidx.compose.ui.layout.Placeable
import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.text.TextRange
import androidx.compose.ui.text.input.ImeAction
import androidx.compose.ui.text.input.TextFieldValue
import androidx.compose.ui.unit.Constraints
import androidx.compose.ui.unit.TextUnit
Expand Down Expand Up @@ -225,16 +228,13 @@ private fun EditableNameLabel(
val focusRequester = remember { FocusRequester() }
LaunchedEffect(Unit) {
focusRequester.requestFocus()
focusRequester.captureFocus()
}
BasicTextField(
modifier = Modifier.width(IntrinsicSize.Min)
.focusRequester(focusRequester)
.onKeyEvent { event ->
when {
event.isReleased(Key.Enter) -> {
commit()
true
}
event.isReleased(Key.Escape) -> {
cancel()
true
Expand Down Expand Up @@ -264,6 +264,10 @@ private fun EditableNameLabel(
it()
}
},
keyboardOptions = KeyboardOptions(imeAction = ImeAction.Done),
keyboardActions = KeyboardActions(
onDone = { commit() },
),
)
},
) { measurables, constraints ->
Expand Down

0 comments on commit 93c43e9

Please sign in to comment.