desktop: enter + shift+enter keybindings (#2787)

This commit is contained in:
Stanislav Dmitrenko
2023-07-27 15:44:35 +03:00
committed by GitHub
parent 976fc68cc3
commit a3cd7ca89e
4 changed files with 36 additions and 8 deletions

View File

@@ -47,7 +47,8 @@ actual fun PlatformTextField(
textStyle: MutableState<TextStyle>,
showDeleteTextButton: MutableState<Boolean>,
userIsObserver: Boolean,
onMessageChange: (String) -> Unit
onMessageChange: (String) -> Unit,
onDone: () -> Unit,
) {
val cs = composeState.value
val textColor = MaterialTheme.colors.onBackground

View File

@@ -11,5 +11,6 @@ expect fun PlatformTextField(
textStyle: MutableState<TextStyle>,
showDeleteTextButton: MutableState<Boolean>,
userIsObserver: Boolean,
onMessageChange: (String) -> Unit
onMessageChange: (String) -> Unit,
onDone: () -> Unit,
)

View File

@@ -67,7 +67,9 @@ fun SendMsgView(
val showVoiceButton = cs.message.isEmpty() && showVoiceRecordIcon && !composeState.value.editing &&
cs.liveMessage == null && (cs.preview is ComposePreview.NoPreview || recState.value is RecordingState.Started)
val showDeleteTextButton = rememberSaveable { mutableStateOf(false) }
PlatformTextField(composeState, textStyle, showDeleteTextButton, userIsObserver, onMessageChange)
PlatformTextField(composeState, textStyle, showDeleteTextButton, userIsObserver, onMessageChange) {
sendMessage(null)
}
// Disable clicks on text field
if (cs.preview is ComposePreview.VoicePreview || !userCanSend || cs.inProgress) {
Box(

View File

@@ -14,10 +14,13 @@ import androidx.compose.ui.focus.FocusRequester
import androidx.compose.ui.focus.focusRequester
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.SolidColor
import androidx.compose.ui.input.key.*
import androidx.compose.ui.platform.*
import androidx.compose.ui.text.TextRange
import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.text.font.FontStyle
import androidx.compose.ui.text.input.KeyboardCapitalization
import androidx.compose.ui.text.input.TextFieldValue
import androidx.compose.ui.unit.LayoutDirection
import androidx.compose.ui.unit.dp
import chat.simplex.common.views.chat.*
@@ -33,7 +36,8 @@ actual fun PlatformTextField(
textStyle: MutableState<TextStyle>,
showDeleteTextButton: MutableState<Boolean>,
userIsObserver: Boolean,
onMessageChange: (String) -> Unit
onMessageChange: (String) -> Unit,
onDone: () -> Unit,
) {
val cs = composeState.value
val focusRequester = remember { FocusRequester() }
@@ -47,11 +51,14 @@ actual fun PlatformTextField(
keyboard?.show()
}
val isRtl = remember(cs.message) { isRtl(cs.message.subSequence(0, min(50, cs.message.length))) }
var textFieldValueState by remember { mutableStateOf(TextFieldValue(text = cs.message)) }
val textFieldValue = textFieldValueState.copy(text = cs.message)
BasicTextField(
value = cs.message,
value = textFieldValue,
onValueChange = {
if (!composeState.value.inProgress && !(composeState.value.preview is ComposePreview.VoicePreview && it != "")) {
onMessageChange(it)
if (!composeState.value.inProgress && !(composeState.value.preview is ComposePreview.VoicePreview && it.text != "")) {
textFieldValueState = it
onMessageChange(it.text)
}
},
textStyle = textStyle.value,
@@ -60,7 +67,24 @@ actual fun PlatformTextField(
capitalization = KeyboardCapitalization.Sentences,
autoCorrect = true
),
modifier = Modifier.padding(vertical = 4.dp).focusRequester(focusRequester),
modifier = Modifier
.padding(vertical = 4.dp)
.focusRequester(focusRequester)
.onPreviewKeyEvent {
if (it.key == Key.Enter && it.type == KeyEventType.KeyDown) {
if (it.isShiftPressed) {
val newText = textFieldValue.text + "\n"
textFieldValueState = textFieldValue.copy(
text = newText,
selection = TextRange(newText.length, newText.length)
)
onMessageChange(newText)
} else if (cs.message.isNotEmpty()) {
onDone()
}
true
} else false
},
cursorBrush = SolidColor(MaterialTheme.colors.secondary),
decorationBox = { innerTextField ->
Surface(