TP-43672 | Added support for request focus on render in place of show… (#200)

This commit is contained in:
Soumya Ranjan Patra
2023-10-03 20:29:40 +05:30
committed by GitHub
parent f8a5665ffa
commit 5cf3bcbfff
3 changed files with 63 additions and 16 deletions

View File

@@ -24,9 +24,10 @@ data class CustomTextFieldProperty(
var colors: OutlinedTextFieldColors? = null,
var arrangementData: ArrangementData? = null,
var invalidCharRegex: String? = null,
var showKeyboardOnRender : Boolean? = null,
var requestFocusOnRender : Boolean? = null,
var cursorHandleColor: String? = null,
var cursorBackgroundColor: String? = null
var cursorBackgroundColor: String? = null,
var textToolBarStatus: String? = null
) : BaseProperty() {
override fun copyNonNullFrom(property: BaseProperty?) {
@@ -51,9 +52,10 @@ data class CustomTextFieldProperty(
customTextFieldProperty?.colors?.let { colors = it }
customTextFieldProperty?.arrangementData?.let { arrangementData = it }
customTextFieldProperty?.invalidCharRegex?.let { invalidCharRegex = it }
customTextFieldProperty?.showKeyboardOnRender?.let { showKeyboardOnRender = it }
customTextFieldProperty?.requestFocusOnRender?.let { requestFocusOnRender = it }
customTextFieldProperty?.cursorHandleColor?.let { cursorHandleColor = it }
customTextFieldProperty?.cursorBackgroundColor?.let { cursorBackgroundColor = it }
customTextFieldProperty?.textToolBarStatus?.let { textToolBarStatus = it }
}
}

View File

@@ -13,7 +13,10 @@ import androidx.compose.runtime.*
import androidx.compose.ui.ExperimentalComposeUiApi
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.alpha
import androidx.compose.ui.focus.FocusRequester
import androidx.compose.ui.focus.focusRequester
import androidx.compose.ui.focus.onFocusChanged
import androidx.compose.ui.geometry.Rect
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.SolidColor
import androidx.compose.ui.layout.layoutId
@@ -21,6 +24,9 @@ import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalFocusManager
import androidx.compose.ui.platform.LocalSoftwareKeyboardController
import androidx.compose.ui.platform.LocalView
import androidx.compose.ui.platform.LocalTextToolbar
import androidx.compose.ui.platform.TextToolbar
import androidx.compose.ui.platform.TextToolbarStatus
import androidx.compose.ui.text.*
import androidx.compose.ui.text.input.VisualTransformation
import androidx.compose.ui.unit.dp
@@ -32,7 +38,8 @@ import com.navi.uitron.model.data.UiTronData
import com.navi.uitron.model.ui.*
import com.navi.uitron.utils.CUSTOM_TEXT_FIELD_DATA
import com.navi.uitron.utils.CUSTOM_TEXT_FIELD_PROPERTY
import com.navi.uitron.utils.EMPTY
import com.navi.uitron.utils.HIDE
import com.navi.uitron.utils.REMOVE_FOCUS
import com.navi.uitron.utils.ShapeUtil
import com.navi.uitron.utils.UI_TRON_VM
import com.navi.uitron.viewmodel.UiTronViewModel
@@ -113,13 +120,21 @@ class CustomTextFieldRenderer(
mutableStateOf(property.colors?.unfocusedBorderColor)
}
val keyboardController = LocalSoftwareKeyboardController.current
val focusRequester = remember {
FocusRequester()
}
val customTextSelectionColors by remember(property?.cursorBackgroundColor,property?.cursorHandleColor) {
val customTextSelectionColors by remember(
property.cursorBackgroundColor,
property.cursorHandleColor
) {
mutableStateOf(
getCustomTextSelectionColor(property)
)
}
val localTextToolBar = LocalTextToolbar.current
if (property.visible.orTrue()) {
Column(
modifier = Modifier
@@ -180,7 +195,11 @@ class CustomTextFieldRenderer(
.layoutId(property.layoutId.orEmpty())
) {
CompositionLocalProvider(
LocalTextSelectionColors provides customTextSelectionColors
LocalTextSelectionColors provides customTextSelectionColors,
LocalTextToolbar provides getTextToolbar(
property.textToolBarStatus,
localTextToolBar
)
) {
BasicTextField(
modifier = Modifier
@@ -206,7 +225,8 @@ class CustomTextFieldRenderer(
?: ContentAlignmentType.CenterStart.name
)
)
.fillMaxWidth(),
.fillMaxWidth()
.focusRequester(focusRequester = focusRequester),
textStyle = TextStyle(
fontSize = property.inputTextProperty?.textStyle?.fontSize?.sp
?: 14.sp,
@@ -302,9 +322,11 @@ class CustomTextFieldRenderer(
}
}
}
LaunchedEffect(key1 = Unit) {
if (property.showKeyboardOnRender.orFalse()) {
keyboardController?.show()
LaunchedEffect(property.requestFocusOnRender) {
if (property.requestFocusOnRender.orFalse()) {
focusRequester.requestFocus()
property.requestFocusOnRender = false
uiTronViewModel.handle[property.getPropertyId()] = REMOVE_FOCUS
}
}
}
@@ -387,14 +409,35 @@ class CustomTextFieldRenderer(
property.cursorHandleColor?.hexToComposeColor ?: colorPurple.hexToComposeColor
val cursorBackgroundColor = property.cursorBackgroundColor?.hexToComposeColor
?: (
property.cursorHandleColor?.hexToComposeColor?.copy(alpha = alpha)
?: colorPurple.hexToComposeColor.copy(alpha = alpha)
)
?: (property.cursorHandleColor?.hexToComposeColor?.copy(alpha = alpha)
?: colorPurple.hexToComposeColor.copy(alpha = alpha))
return TextSelectionColors(
handleColor = cursorHandleColor,
backgroundColor = cursorBackgroundColor
)
}
}
private fun getTextToolbar(
textToolbarStatus: String?,
localTextToolbar: TextToolbar
): TextToolbar {
if (textToolbarStatus.orEmpty() == HIDE) {
return EmptyTextToolbar
}
return localTextToolbar
}
}
object EmptyTextToolbar : TextToolbar {
override val status: TextToolbarStatus = TextToolbarStatus.Hidden
override fun hide() {}
override fun showMenu(
rect: Rect,
onCopyRequested: (() -> Unit)?,
onPasteRequested: (() -> Unit)?,
onCutRequested: (() -> Unit)?,
onSelectAllRequested: (() -> Unit)?,
) {
}
}

View File

@@ -7,6 +7,7 @@ const val DEFAULT_FORMAT_PATTERN = "ddMMyyyy"
const val PACKAGE_COLON = "package:"
const val STOP = "stop"
const val DISABLE_RESTART_TIMER = "disableRestartTimer"
const val REMOVE_FOCUS = "removeFocus"
const val KEY_MVEL_ACTION = "mvelAction"
const val KEY_UI_TRON_DATA = "uiTronData"
@@ -21,4 +22,5 @@ const val UUID_CONSTANT = "UUID"
const val RESULT = "result"
const val CUSTOM_TEXT_FIELD_DATA ="customTextFieldData"
const val CUSTOM_TEXT_FIELD_PROPERTY ="customTextFieldProperty"
const val UI_TRON_VM ="uiTronVM"
const val UI_TRON_VM ="uiTronVM"
const val HIDE = "HIDE"