in lets-plot-compose/src/desktopMain/kotlin/org/jetbrains/letsPlot/compose/desktop/SvgView.kt [79:141]
fun handlePointerEvent(pointerEvent: PointerEvent): Boolean {
val change = pointerEvent.changes.first()
val position = change.position
// Convert logical pixel coordinates to physical pixel coordinates for SVG interaction
// 1. Scale down by density (logical → physical pixels)
// 2. Subtract position offset (which is also in physical pixels)
val adjustedX = ((position.x / pixelDensity) - offsetX).roundToInt()
val adjustedY = ((position.y / pixelDensity) - offsetY).roundToInt()
val vector = Vector(adjustedX, adjustedY)
// Translate PointerEvent to lets-plot MouseEvent
val mouseEvent = when {
change.pressed -> MouseEvent.leftButton(vector)
else -> MouseEvent.noButton(vector)
}
when (pointerEvent.type) {
PointerEventType.Press -> {
onMouseEvent(MOUSE_PRESSED, mouseEvent)
return true
}
PointerEventType.Release -> {
onMouseEvent(MOUSE_RELEASED, mouseEvent)
return true
}
PointerEventType.Move -> {
if (change.pressed) {
onMouseEvent(MOUSE_DRAGGED, mouseEvent)
} else {
onMouseEvent(MOUSE_MOVED, mouseEvent)
}
return true
}
PointerEventType.Enter -> {
onMouseEvent(MOUSE_ENTERED, mouseEvent)
return true
}
PointerEventType.Exit -> {
onMouseEvent(MOUSE_LEFT, mouseEvent)
return true
}
PointerEventType.Scroll -> {
val scrollDelta = change.scrollDelta
val wheelMouseEvent = MouseWheelEvent(
x = vector.x,
y = vector.y,
button = Button.NONE,
modifiers = KeyModifiers.emptyModifiers(),
scrollAmount = scrollDelta.y.toDouble()
)
onMouseEvent(MOUSE_WHEEL_ROTATED, wheelMouseEvent)
return true
}
}
return false
}