168 lines
6.3 KiB
Kotlin
168 lines
6.3 KiB
Kotlin
/*
|
|
*
|
|
* * Copyright © 2023 by Navi Technologies Limited
|
|
* * All rights reserved. Strictly confidential
|
|
*
|
|
*/
|
|
|
|
package com.navi.uitron.render
|
|
|
|
import androidx.compose.material.Text
|
|
import androidx.compose.runtime.Composable
|
|
import androidx.compose.runtime.collectAsState
|
|
import androidx.compose.ui.Modifier
|
|
import androidx.compose.ui.draw.alpha
|
|
import androidx.compose.ui.geometry.Offset
|
|
import androidx.compose.ui.graphics.Color
|
|
import androidx.compose.ui.graphics.Shadow
|
|
import androidx.compose.ui.layout.layoutId
|
|
import androidx.compose.ui.text.TextStyle
|
|
import androidx.compose.ui.text.font.FontStyle
|
|
import androidx.compose.ui.unit.TextUnit
|
|
import androidx.compose.ui.unit.em
|
|
import androidx.compose.ui.unit.sp
|
|
import clip
|
|
import com.navi.uitron.UiTronSdkManager
|
|
import com.navi.uitron.model.action.MvelAction
|
|
import com.navi.uitron.model.data.TextData
|
|
import com.navi.uitron.model.data.UiTronData
|
|
import com.navi.uitron.model.ui.TextProperty
|
|
import com.navi.uitron.utils.KEY_MVEL_ACTION
|
|
import com.navi.uitron.utils.KEY_PROPERTY
|
|
import com.navi.uitron.utils.KEY_UI_TRON_DATA
|
|
import com.navi.uitron.viewmodel.UiTronViewModel
|
|
import customClickable
|
|
import customCombinedClick
|
|
import customOffset
|
|
import dpToPx
|
|
import getBrush
|
|
import getText
|
|
import getTextAlignment
|
|
import getTextDecoration
|
|
import getTextOverflow
|
|
import getTransformedText
|
|
import hexToComposeColor
|
|
import orFalse
|
|
import orTrue
|
|
import orZero
|
|
import setBackground
|
|
import setBlur
|
|
import setHeight
|
|
import setHeightRange
|
|
import setPadding
|
|
import setTag
|
|
import setWidth
|
|
import setWidthRange
|
|
|
|
class TextRenderer : Renderer<TextProperty> {
|
|
private val defaultFontSize = 14.sp
|
|
|
|
@Composable
|
|
override fun Render(
|
|
property: TextProperty,
|
|
uiTronData: UiTronData?,
|
|
uiTronViewModel: UiTronViewModel,
|
|
modifier: Modifier?
|
|
) {
|
|
super.Render(property, uiTronData, uiTronViewModel, modifier)
|
|
var uiTronTextData = uiTronData as? TextData
|
|
if (property.isStateFul.orFalse()) {
|
|
uiTronViewModel.addKeyToSavedStateHandle(property.layoutId.orEmpty())
|
|
|
|
val viewState = uiTronViewModel.handle.getStateFlow<String?>(
|
|
property.getPropertyId(),
|
|
null
|
|
).collectAsState()
|
|
property.copyNonNullFrom(property.statesMap?.get(viewState.value))
|
|
|
|
val dataState = uiTronViewModel.handle.getStateFlow<TextData?>(
|
|
property.getDataId(),
|
|
null
|
|
).collectAsState()
|
|
uiTronTextData = uiTronTextData?.copyNonNull(dataState.value) ?: dataState.value
|
|
|
|
val extrasState = uiTronViewModel.handle.getStateFlow<Map<String, Any?>?>(
|
|
property.getExtrasId(),
|
|
null
|
|
).collectAsState()
|
|
|
|
handleMvelExtra(property.layoutId, extrasState.value, mapOf(
|
|
Pair(KEY_PROPERTY, property),
|
|
Pair(KEY_UI_TRON_DATA, uiTronTextData),
|
|
Pair(KEY_MVEL_ACTION, extrasState.value?.get(MvelAction.KEY_MVEL) as? MvelAction)
|
|
))
|
|
}
|
|
|
|
if (property.visible.orTrue()) {
|
|
Text(
|
|
text = (getTransformedText(property.valueTransformation, uiTronTextData?.text.orEmpty())?:uiTronTextData?.text)?.getText(uiTronTextData?.textFormatter).orEmpty(),
|
|
fontFamily = UiTronSdkManager.getDependencyProvider()
|
|
.getFontFamily(property.fontFamily),
|
|
fontWeight = UiTronSdkManager.getDependencyProvider()
|
|
.getFontWeight(property.fontWeight),
|
|
fontSize = property.fontSize?.sp ?: defaultFontSize,
|
|
color = property.textColor?.hexToComposeColor ?: Color.Black,
|
|
textDecoration = getTextDecoration(property.textDecoration),
|
|
letterSpacing = property.letterSpacing?.sp ?: 0.sp,
|
|
textAlign = getTextAlignment(property.textAlign),
|
|
lineHeight = property.lineHeight?.em ?: TextUnit.Unspecified,
|
|
overflow = getTextOverflow(property.overflow),
|
|
softWrap = property.softWrap.orTrue(),
|
|
maxLines = property.maxLines ?: Int.MAX_VALUE,
|
|
style = TextStyle(
|
|
brush = property.textBrushData?.let { getBrush(it) },
|
|
fontStyle = getFontStyle(property.fontStyle),
|
|
shadow = Shadow(
|
|
color = property.textShadow?.color?.hexToComposeColor ?: Color.Black,
|
|
offset = Offset(
|
|
dpToPx(property.textShadow?.offset?.x.orZero()),
|
|
dpToPx(property.textShadow?.offset?.y.orZero())
|
|
),
|
|
blurRadius = dpToPx(property.textShadow?.blurRadius.orZero())
|
|
)
|
|
),
|
|
modifier = (modifier ?: Modifier)
|
|
.customOffset(property.offset)
|
|
.setWidth(property.width)
|
|
.setHeight(property.height)
|
|
.setWidthRange(property.widthRange)
|
|
.setHeightRange(property.heightRange)
|
|
.setPadding(property.margin)
|
|
.setBackground(
|
|
property.backgroundColor,
|
|
property.shape,
|
|
property.backGroundBrushData
|
|
)
|
|
.clip(property.clipShape)
|
|
.setPadding(property.padding)
|
|
.setTag(property)
|
|
.layoutId(property.layoutId.orEmpty())
|
|
.customClickable(
|
|
{
|
|
uiTronViewModel.handleActions(uiTronData?.onClick)
|
|
},
|
|
actions = uiTronData?.onClick?.actions,
|
|
property = property
|
|
)
|
|
.customCombinedClick(property, uiTronData) {
|
|
uiTronViewModel.handleActions(it)
|
|
}
|
|
.alpha(property.alpha ?: 1.0f)
|
|
.setBlur(property.blurData)
|
|
)
|
|
}
|
|
}
|
|
}
|
|
|
|
enum class TextFontStyle {
|
|
NORMAL, ITALIC
|
|
}
|
|
|
|
fun getFontStyle(fontStyle: String?): FontStyle {
|
|
return when (fontStyle) {
|
|
TextFontStyle.NORMAL.name -> FontStyle.Normal
|
|
TextFontStyle.ITALIC.name -> FontStyle.Italic
|
|
else -> FontStyle.Normal
|
|
}
|
|
}
|