fun DtTooltip()

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