in livemap/src/commonMain/kotlin/org/jetbrains/letsPlot/livemap/mapengine/camera/CameraInputSystem.kt [32:100]
override fun updateImpl(context: LiveMapContext, dt: Double) {
val cameraEntity = getSingletonEntity(CameraComponent::class)
val mouseInput = cameraEntity.get<MouseInputComponent>()
val viewport = context.mapRenderContext.viewport
mouseInput.dragState?.let { drag ->
if (drag.started) {
myLastFrameDragLocation = drag.origin
} else {
val dragFrameDistance = drag.location.sub(myLastFrameDragLocation!!)
myLastFrameDragLocation = drag.location
myCamera.panDistance = drag.location.sub(drag.origin).toClientPoint()
myCamera.panFrameDistance = dragFrameDistance.toClientPoint()
if (dragFrameDistance != Vector.ZERO) {
val position = viewport.getMapCoord(viewport.center - dragFrameDistance.toClientPoint())
context.camera.requestPosition(position)
}
if (drag.stopped) {
myLastFrameDragLocation = null
}
}
} ?: run {
myCamera.panDistance = null
myCamera.panFrameDistance = null
}
myCamera.isZoomLevelChanged = false
myCamera.isZoomFractionChanged = false
myCamera.isMoved = when {
// requestedPosition also used by dragging. isMoved will always be false without a dragState check
mouseInput.dragState == null && myCamera.requestedPosition != null -> true
mouseInput.dragState?.stopped == true -> true
else -> false
}
myCamera.canReset = context.initialZoom?.toDouble() != myCamera.zoom || context.initialPosition != myCamera.position
if (myCamera.animationValue == null && myCamera.requestedAnimation == true) {
val zoomDelta = myCamera.requestedZoom?.let { it - myCamera.zoom } ?: 0.0
val center = myCamera.requestedPosition ?: viewport.position
val scaleOrigin = viewport.center
if (zoomDelta != 0.0) {
if (!cameraEntity.contains<CameraScale.CameraScaleEffectComponent>()) {
CameraScale.setAnimation(cameraEntity, scaleOrigin, center, zoomDelta)
}
}
} else if (myCamera.requestedReset == true) {
updateCamera(
requestedZoom = context.initialZoom!!.toDouble(),
requestedPosition = context.initialPosition
)
}
else {
updateCamera(
requestedZoom = myCamera.animationValue?: myCamera.requestedZoom,
requestedPosition = myCamera.requestedPosition
)
}
myCamera.requestedZoom = null
myCamera.animationValue = null
myCamera.requestedPosition = null
myCamera.requestedAnimation = null
myCamera.requestedReset = null
}