55
66package org.jetbrains.letsPlot.raster.view
77
8+ import org.jetbrains.letsPlot.commons.event.MouseEvent
89import org.jetbrains.letsPlot.commons.event.MouseEventPeer
10+ import org.jetbrains.letsPlot.commons.event.MouseEventSpec
911import org.jetbrains.letsPlot.commons.geometry.Vector
12+ import org.jetbrains.letsPlot.commons.intern.observable.event.EventHandler
1013import org.jetbrains.letsPlot.commons.registration.Registration
1114import org.jetbrains.letsPlot.core.canvas.CanvasPeer
1215import org.jetbrains.letsPlot.core.canvas.Context2d
@@ -20,6 +23,7 @@ import org.jetbrains.letsPlot.raster.mapping.svg.SvgCanvasPeer
2023import org.jetbrains.letsPlot.raster.mapping.svg.SvgSvgElementMapper
2124import org.jetbrains.letsPlot.raster.shape.Container
2225import org.jetbrains.letsPlot.raster.shape.Element
26+ import org.jetbrains.letsPlot.raster.shape.reversedDepthFirstTraversal
2327import kotlin.math.ceil
2428
2529class SvgCanvasFigure2 (svg : SvgSvgElement = SvgSvgElement ()) : CanvasFigure2 {
@@ -29,6 +33,8 @@ class SvgCanvasFigure2(svg: SvgSvgElement = SvgSvgElement()) : CanvasFigure2 {
2933 return Vector (contentWidth, contentHeight)
3034 }
3135
36+ override val eventPeer: MouseEventPeer = MouseEventPeer ()
37+
3238 var svgSvgElement: SvgSvgElement = svg
3339 set(value) {
3440 field = value
@@ -41,6 +47,11 @@ class SvgCanvasFigure2(svg: SvgSvgElement = SvgSvgElement()) : CanvasFigure2 {
4147
4248 internal lateinit var rootMapper: SvgSvgElementMapper // = SvgSvgElementMapper(svgSvgElement, canvasPeer)
4349 private val repaintRequestListeners = mutableListOf< () -> Unit > ()
50+ private var onHrefClick: (String ) -> Unit = { }
51+
52+ fun onHrefClick (handler : (String ) -> Unit ) {
53+ onHrefClick = handler
54+ }
4455
4556 override fun mapToCanvas (canvasPeer : CanvasPeer ): Registration {
4657 svgCanvasPeer = SvgCanvasPeer (canvasPeer)
@@ -54,7 +65,20 @@ class SvgCanvasFigure2(svg: SvgSvgElement = SvgSvgElement()) : CanvasFigure2 {
5465 }
5566 }
5667
57- override val eventPeer: MouseEventPeer = MouseEventPeer ()
68+ init {
69+ eventPeer.addEventHandler(MouseEventSpec .MOUSE_CLICKED , object : EventHandler <MouseEvent > {
70+ override fun onEvent (event : MouseEvent ) {
71+ val coord = event.location.toDoubleVector()
72+ val linkElement = reversedDepthFirstTraversal(rootMapper.target)
73+ .filter { it.href != null }
74+ .filterNot(Element ::isMouseTransparent)
75+ .firstOrNull() { coord in it.screenBounds }
76+
77+ val href = linkElement?.href ? : return
78+ onHrefClick(href)
79+ }
80+ })
81+ }
5882
5983 override fun paint (context2d : Context2d ) {
6084 renderElement(rootMapper.target, context2d)
0 commit comments