diff --git a/src/jvmMain/kotlin/com/sdercolin/vlabeler/ui/common/NavigatorList.kt b/src/jvmMain/kotlin/com/sdercolin/vlabeler/ui/common/NavigatorList.kt index 0d1c9737..2aaa349d 100644 --- a/src/jvmMain/kotlin/com/sdercolin/vlabeler/ui/common/NavigatorList.kt +++ b/src/jvmMain/kotlin/com/sdercolin/vlabeler/ui/common/NavigatorList.kt @@ -63,6 +63,11 @@ interface NavigatorListState { newResults.indexOfFirst { it.index == currentIndex }.takeIf { it >= 0 } } } + + fun submitCurrent() { + val index = selectedIndex ?: return + searchResult[index].index.let(::submit) + } } fun NavigatorListState.onPreviewKeyEvent(event: KeyEvent): Boolean { @@ -77,10 +82,6 @@ fun NavigatorListState.onPreviewKeyEvent(event: KeyEvent): Boolean selectedIndex = index.minus(1).coerceAtLeast(0) true } - event.isReleased(Key.Enter) -> { - searchResult[index].index.let(::submit) - true - } else -> false } } diff --git a/src/jvmMain/kotlin/com/sdercolin/vlabeler/ui/common/SearchBar.kt b/src/jvmMain/kotlin/com/sdercolin/vlabeler/ui/common/SearchBar.kt index 161f1597..d42013b8 100644 --- a/src/jvmMain/kotlin/com/sdercolin/vlabeler/ui/common/SearchBar.kt +++ b/src/jvmMain/kotlin/com/sdercolin/vlabeler/ui/common/SearchBar.kt @@ -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 @@ -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 @@ -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 = {}, ) { @@ -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() } diff --git a/src/jvmMain/kotlin/com/sdercolin/vlabeler/ui/dialog/EditEntryNameDialog.kt b/src/jvmMain/kotlin/com/sdercolin/vlabeler/ui/dialog/EditEntryNameDialog.kt index 15f4b487..880bcac4 100644 --- a/src/jvmMain/kotlin/com/sdercolin/vlabeler/ui/dialog/EditEntryNameDialog.kt +++ b/src/jvmMain/kotlin/com/sdercolin/vlabeler/ui/dialog/EditEntryNameDialog.kt @@ -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 @@ -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 @@ -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) { diff --git a/src/jvmMain/kotlin/com/sdercolin/vlabeler/ui/dialog/EditExtraDialog.kt b/src/jvmMain/kotlin/com/sdercolin/vlabeler/ui/dialog/EditExtraDialog.kt index 2f019cd2..0a8d84cc 100644 --- a/src/jvmMain/kotlin/com/sdercolin/vlabeler/ui/dialog/EditExtraDialog.kt +++ b/src/jvmMain/kotlin/com/sdercolin/vlabeler/ui/dialog/EditExtraDialog.kt @@ -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 @@ -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, diff --git a/src/jvmMain/kotlin/com/sdercolin/vlabeler/ui/dialog/MoveEntryDialog.kt b/src/jvmMain/kotlin/com/sdercolin/vlabeler/ui/dialog/MoveEntryDialog.kt index 8dc53db2..ed1f9a5d 100644 --- a/src/jvmMain/kotlin/com/sdercolin/vlabeler/ui/dialog/MoveEntryDialog.kt +++ b/src/jvmMain/kotlin/com/sdercolin/vlabeler/ui/dialog/MoveEntryDialog.kt @@ -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 @@ -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 @@ -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, diff --git a/src/jvmMain/kotlin/com/sdercolin/vlabeler/ui/dialog/SetEntryPropertyDialog.kt b/src/jvmMain/kotlin/com/sdercolin/vlabeler/ui/dialog/SetEntryPropertyDialog.kt index de86bd36..0c72f9f3 100644 --- a/src/jvmMain/kotlin/com/sdercolin/vlabeler/ui/dialog/SetEntryPropertyDialog.kt +++ b/src/jvmMain/kotlin/com/sdercolin/vlabeler/ui/dialog/SetEntryPropertyDialog.kt @@ -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 @@ -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 @@ -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) { diff --git a/src/jvmMain/kotlin/com/sdercolin/vlabeler/ui/dialog/SetResolutionDialog.kt b/src/jvmMain/kotlin/com/sdercolin/vlabeler/ui/dialog/SetResolutionDialog.kt index 15438188..6ab7aee4 100644 --- a/src/jvmMain/kotlin/com/sdercolin/vlabeler/ui/dialog/SetResolutionDialog.kt +++ b/src/jvmMain/kotlin/com/sdercolin/vlabeler/ui/dialog/SetResolutionDialog.kt @@ -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 @@ -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.* @@ -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 = { @@ -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) { diff --git a/src/jvmMain/kotlin/com/sdercolin/vlabeler/ui/editor/EntryList.kt b/src/jvmMain/kotlin/com/sdercolin/vlabeler/ui/editor/EntryList.kt index 7df3699d..faf9786d 100644 --- a/src/jvmMain/kotlin/com/sdercolin/vlabeler/ui/editor/EntryList.kt +++ b/src/jvmMain/kotlin/com/sdercolin/vlabeler/ui/editor/EntryList.kt @@ -151,6 +151,7 @@ fun EntryList( onFocusedChanged(it) }, onPreviewKeyEvent = state::onPreviewKeyEvent, + onSubmit = state::submitCurrent, trailingContent = { if (pinned) { Row(verticalAlignment = Alignment.CenterVertically) { diff --git a/src/jvmMain/kotlin/com/sdercolin/vlabeler/ui/editor/ModuleList.kt b/src/jvmMain/kotlin/com/sdercolin/vlabeler/ui/editor/ModuleList.kt index 9e479458..6c9f117c 100644 --- a/src/jvmMain/kotlin/com/sdercolin/vlabeler/ui/editor/ModuleList.kt +++ b/src/jvmMain/kotlin/com/sdercolin/vlabeler/ui/editor/ModuleList.kt @@ -84,6 +84,7 @@ fun ModuleList( state.hasFocus = it }, onPreviewKeyEvent = state::onPreviewKeyEvent, + onSubmit = state::submitCurrent, ) NavigatorListBody( diff --git a/src/jvmMain/kotlin/com/sdercolin/vlabeler/ui/editor/labeler/marker/NameLabels.kt b/src/jvmMain/kotlin/com/sdercolin/vlabeler/ui/editor/labeler/marker/NameLabels.kt index 42031dab..fe7bb287 100644 --- a/src/jvmMain/kotlin/com/sdercolin/vlabeler/ui/editor/labeler/marker/NameLabels.kt +++ b/src/jvmMain/kotlin/com/sdercolin/vlabeler/ui/editor/labeler/marker/NameLabels.kt @@ -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 @@ -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 @@ -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 @@ -264,6 +264,10 @@ private fun EditableNameLabel( it() } }, + keyboardOptions = KeyboardOptions(imeAction = ImeAction.Done), + keyboardActions = KeyboardActions( + onDone = { commit() }, + ), ) }, ) { measurables, constraints ->