
net.peanuuutz.fork.ui.foundation.text.InteractableText.kt Maven / Gradle / Ivy
package net.peanuuutz.fork.ui.foundation.text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberUpdatedState
import net.peanuuutz.fork.ui.ui.draw.text.Paragraph
import net.peanuuutz.fork.ui.ui.draw.text.TextStyle
import net.peanuuutz.fork.ui.ui.modifier.Modifier
import net.peanuuutz.fork.ui.ui.modifier.input.pointerInput
@Composable
fun InteractableText(
paragraph: Paragraph,
onHover: (charIndex: Int) -> Unit,
onClick: (charIndex: Int) -> Unit,
modifier: Modifier = Modifier,
ignoreHoverOnGap: Boolean = true,
ignoreClickOnGap: Boolean = true,
textStyle: TextStyle = LocalTextStyle.current,
overflow: TextOverflow = TextOverflow.Clip,
softWrap: Boolean = true,
maxLines: Int = Int.MAX_VALUE,
onTextLayout: ((TextLayoutResult) -> Unit)? = null,
selector: TextSelector? = null
) {
val layoutResultState = remember { mutableStateOf(null) }
val ignoreHoverOnGapState = rememberUpdatedState(ignoreHoverOnGap)
val onHoverState = rememberUpdatedState(onHover)
val ignoreClickOnGapState = rememberUpdatedState(ignoreClickOnGap)
val onClickState = rememberUpdatedState(onClick)
BasicText(
paragraph = paragraph,
modifier = modifier
.pointerInput {
detectClickOnText(
layoutResultProvider = layoutResultState::value,
ignoreClickOnGapProvider = ignoreClickOnGapState::value,
onClickProvider = onClickState::value
)
}
.pointerInput {
detectHoverOnText(
layoutResultProvider = layoutResultState::value,
ignoreHoverOnGapProvider = ignoreHoverOnGapState::value,
onHoverProvider = onHoverState::value
)
},
textStyle = textStyle,
overflow = overflow,
softWrap = softWrap,
maxLines = maxLines,
onTextLayout = { result ->
layoutResultState.value = result
onTextLayout?.invoke(result)
},
selector = selector
)
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy