Use keyboard handler on MaterialDialog inputs

This commit is contained in:
Syer10
2022-05-17 17:13:08 -04:00
parent 17dfdcfb73
commit 587164a319
4 changed files with 25 additions and 14 deletions

View File

@@ -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) })
)
}
}

View File

@@ -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) })
)
}
}

View File

@@ -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()
)
}
}

View File

@@ -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
}
}