in hot-reload-devtools/src/main/kotlin/org/jetbrains/compose/devtools/widgets/DtTooltip.kt [50:112]
fun DtTooltip(
text: String?,
offset: DpSize = defaultTooltipOffset,
content: @Composable () -> Unit
) {
if (text == null) return content()
val interactionSource = remember { MutableInteractionSource() }
val isHovered by interactionSource.collectIsHoveredAsState()
var isTooltipVisible by remember { mutableStateOf(false) }
val density = LocalDensity.current
val windowState = rememberWindowState(
position = WindowPosition(0.dp, 0.dp),
size = measureTextWidth(text, style = DtTextStyles.tooltip, density = density),
)
LaunchedEffect(isHovered) {
if (isHovered) {
delay(tooltipShowDelay)
isTooltipVisible = true
} else {
delay(tooltipHideDelay)
isTooltipVisible = false
}
}
if (isTooltipVisible) {
Window(
onCloseRequest = {},
state = windowState,
undecorated = true,
transparent = true,
resizable = false,
visible = true,
focusable = false,
alwaysOnTop = true,
) {
Box(
contentAlignment = Alignment.Center,
modifier = Modifier
.border(width = 1.dp, color = DtColors.tooltipBorder, shape = DtShapes.TooltipCornerShape)
.clip(DtShapes.TooltipCornerShape)
.background(DtColors.tooltipBackground)
.padding(DtPadding.medium)
) {
DtText(text, style = DtTextStyles.tooltip)
}
}
}
Box(
modifier = Modifier
.hoverable(interactionSource)
.onGloballyPositioned { coordinates ->
val topLeft = coordinates.positionOnScreen().toWindowPosition(density)
val size = coordinates.size.toDpSize(density)
windowState.position = topLeft + size + offset
}
) {
content()
}
}