Files
uitron/navi-uitron/src/main/java/com/navi/uitron/render/TextRenderer.kt

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