From 587164a31920e5eadfc67c982be005266684fec0 Mon Sep 17 00:00:00 2001 From: Syer10 Date: Tue, 17 May 2022 17:13:08 -0400 Subject: [PATCH] Use keyboard handler on MaterialDialog inputs --- .../jui/ui/base/prefs/PreferencesUiBuilder.kt | 9 +++++---- .../categories/components/CategoriesDialogs.kt | 9 +++++++-- .../components/SourceSettingsScreenContent.kt | 4 +++- .../jui/uicore/components/KeyboardHandler.kt | 17 ++++++++++------- 4 files changed, 25 insertions(+), 14 deletions(-) diff --git a/presentation/src/commonMain/kotlin/ca/gosyer/jui/ui/base/prefs/PreferencesUiBuilder.kt b/presentation/src/commonMain/kotlin/ca/gosyer/jui/ui/base/prefs/PreferencesUiBuilder.kt index 62157c85..99e7d166 100644 --- a/presentation/src/commonMain/kotlin/ca/gosyer/jui/ui/base/prefs/PreferencesUiBuilder.kt +++ b/presentation/src/commonMain/kotlin/ca/gosyer/jui/ui/base/prefs/PreferencesUiBuilder.kt @@ -57,6 +57,7 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.draw.rotate +import androidx.compose.ui.focus.FocusDirection import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.takeOrElse import androidx.compose.ui.graphics.vector.ImageVector @@ -67,6 +68,7 @@ import androidx.compose.ui.unit.dp import ca.gosyer.jui.i18n.MR import ca.gosyer.jui.ui.base.dialog.getMaterialDialogProperties import ca.gosyer.jui.uicore.components.VerticalScrollbar +import ca.gosyer.jui.uicore.components.keyboardHandler import ca.gosyer.jui.uicore.components.rememberScrollbarAdapter import ca.gosyer.jui.uicore.components.scrollbarPadding import ca.gosyer.jui.uicore.prefs.PreferenceMutableStateFlow @@ -186,9 +188,7 @@ fun EditTextPreference( title = title, subtitle = subtitle, icon = icon, - onClick = { - dialogState.show() - }, + onClick = dialogState::show, enabled = enabled ) val value by preference.collectAsState() @@ -210,7 +210,8 @@ fun EditTextPreference( visualTransformation = visualTransformation, onInput = { preference.value = it }, maxLines = maxLines, - singleLine = singleLine + singleLine = singleLine, + modifier = Modifier.keyboardHandler(singleLine, enterAction = { it.moveFocus(FocusDirection.Next) }) ) } } diff --git a/presentation/src/commonMain/kotlin/ca/gosyer/jui/ui/categories/components/CategoriesDialogs.kt b/presentation/src/commonMain/kotlin/ca/gosyer/jui/ui/categories/components/CategoriesDialogs.kt index 7ab10147..0c8c9ca2 100644 --- a/presentation/src/commonMain/kotlin/ca/gosyer/jui/ui/categories/components/CategoriesDialogs.kt +++ b/presentation/src/commonMain/kotlin/ca/gosyer/jui/ui/categories/components/CategoriesDialogs.kt @@ -7,9 +7,12 @@ package ca.gosyer.jui.ui.categories.components import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.focus.FocusDirection import ca.gosyer.jui.i18n.MR import ca.gosyer.jui.ui.base.dialog.getMaterialDialogProperties import ca.gosyer.jui.ui.categories.CategoriesScreenViewModel +import ca.gosyer.jui.uicore.components.keyboardHandler import ca.gosyer.jui.uicore.resources.stringResource import com.vanpra.composematerialdialogs.MaterialDialog import com.vanpra.composematerialdialogs.MaterialDialogState @@ -39,7 +42,8 @@ fun RenameDialog( textFieldStyle = TextFieldStyle.Outlined, onInput = { onRename(it) }, maxLines = 1, - singleLine = true + singleLine = true, + modifier = Modifier.keyboardHandler(true, enterAction = { it.moveFocus(FocusDirection.Next) }) ) } } @@ -84,7 +88,8 @@ fun CreateDialog( textFieldStyle = TextFieldStyle.Outlined, onInput = { onCreate(it) }, maxLines = 1, - singleLine = true + singleLine = true, + modifier = Modifier.keyboardHandler(true, enterAction = { it.moveFocus(FocusDirection.Next) }) ) } } diff --git a/presentation/src/commonMain/kotlin/ca/gosyer/jui/ui/sources/settings/components/SourceSettingsScreenContent.kt b/presentation/src/commonMain/kotlin/ca/gosyer/jui/ui/sources/settings/components/SourceSettingsScreenContent.kt index ddd0acc3..09f2621a 100644 --- a/presentation/src/commonMain/kotlin/ca/gosyer/jui/ui/sources/settings/components/SourceSettingsScreenContent.kt +++ b/presentation/src/commonMain/kotlin/ca/gosyer/jui/ui/sources/settings/components/SourceSettingsScreenContent.kt @@ -37,6 +37,7 @@ import ca.gosyer.jui.ui.sources.settings.model.SourceSettingsView.MultiSelect import ca.gosyer.jui.ui.sources.settings.model.SourceSettingsView.Switch import ca.gosyer.jui.ui.sources.settings.model.SourceSettingsView.TwoState import ca.gosyer.jui.uicore.components.VerticalScrollbar +import ca.gosyer.jui.uicore.components.keyboardHandler import ca.gosyer.jui.uicore.components.rememberScrollbarAdapter import ca.gosyer.jui.uicore.components.scrollbarPadding import ca.gosyer.jui.uicore.resources.stringResource @@ -201,7 +202,8 @@ private fun EditTextPreference(editText: EditText) { input( label = "", textFieldStyle = TextFieldStyle.Outlined, - onInput = { editText.updateState(it) } + onInput = { editText.updateState(it) }, + modifier = Modifier.keyboardHandler() ) } } diff --git a/ui-core/src/commonMain/kotlin/ca/gosyer/jui/uicore/components/KeyboardHandler.kt b/ui-core/src/commonMain/kotlin/ca/gosyer/jui/uicore/components/KeyboardHandler.kt index f56ed7c8..15be1234 100644 --- a/ui-core/src/commonMain/kotlin/ca/gosyer/jui/uicore/components/KeyboardHandler.kt +++ b/ui-core/src/commonMain/kotlin/ca/gosyer/jui/uicore/components/KeyboardHandler.kt @@ -18,16 +18,19 @@ import androidx.compose.ui.platform.LocalFocusManager @OptIn(ExperimentalComposeUiApi::class) fun Modifier.keyboardHandler( singleLine: Boolean = false, - action: (FocusManager) -> Unit = { it.moveFocus(FocusDirection.Down) } + enterAction: ((FocusManager) -> Unit)? = null, + action: (FocusManager) -> Unit = { it.moveFocus(FocusDirection.Down) }, ) = composed { val focusManager = LocalFocusManager.current Modifier.onPreviewKeyEvent { - if ( - (it.key == Key.Tab || (singleLine && it.key == Key.Enter)) && - it.type == KeyEventType.KeyDown - ) { - action(focusManager) - true + if (it.type == KeyEventType.KeyDown) { + if (singleLine && it.key == Key.Enter) { + enterAction?.invoke(focusManager) ?: action(focusManager) + true + } else if (it.key == Key.Tab) { + action(focusManager) + true + } else false } else false } }