-
Notifications
You must be signed in to change notification settings - Fork 177
Expand file tree
/
Copy pathInputHandler.kt
More file actions
93 lines (90 loc) · 4.25 KB
/
InputHandler.kt
File metadata and controls
93 lines (90 loc) · 4.25 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
package com.google.maps.android.compose
import androidx.annotation.RestrictTo
import androidx.compose.runtime.Composable
import androidx.compose.runtime.ReusableComposeNode
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.setValue
import com.google.android.gms.maps.model.Circle
import com.google.android.gms.maps.model.GroundOverlay
import com.google.android.gms.maps.model.Marker
import com.google.android.gms.maps.model.Polygon
import com.google.android.gms.maps.GoogleMap.OnMarkerClickListener
import com.google.android.gms.maps.model.Polyline
/**
* A generic handler for map input.
* Non-null lambdas will be invoked if no other node was able to handle that input.
* For example, if [OnMarkerClickListener.onMarkerClick] was invoked and no matching [MarkerNode]
* was found, this [onMarkerClick] will be invoked.
*/
@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
@Composable
public fun InputHandler(
onCircleClick: ((Circle) -> Unit)? = null,
onGroundOverlayClick: ((GroundOverlay) -> Unit)? = null,
onPolygonClick: ((Polygon) -> Unit)? = null,
onPolylineClick: ((Polyline) -> Unit)? = null,
onMarkerClick: ((Marker) -> Boolean)? = null,
onInfoWindowClick: ((Marker) -> Unit)? = null,
onInfoWindowClose: ((Marker) -> Unit)? = null,
onInfoWindowLongClick: ((Marker) -> Unit)? = null,
onMarkerDrag: ((Marker) -> Unit)? = null,
onMarkerDragEnd: ((Marker) -> Unit)? = null,
onMarkerDragStart: ((Marker) -> Unit)? = null,
) {
ReusableComposeNode<InputHandlerNode, MapApplier>(
factory = {
InputHandlerNode(
onCircleClick,
onGroundOverlayClick,
onPolygonClick,
onPolylineClick,
onMarkerClick,
onInfoWindowClick,
onInfoWindowClose,
onInfoWindowLongClick,
onMarkerDrag,
onMarkerDragEnd,
onMarkerDragStart,
)
},
update = {
update(onCircleClick) { this.onCircleClick = it }
update(onGroundOverlayClick) { this.onGroundOverlayClick = it }
update(onPolygonClick) { this.onPolygonClick = it }
update(onPolylineClick) { this.onPolylineClick = it }
update(onMarkerClick) { this.onMarkerClick = it }
update(onInfoWindowClick) { this.onInfoWindowClick = it }
update(onInfoWindowClose) { this.onInfoWindowClose = it }
update(onInfoWindowLongClick) { this.onInfoWindowLongClick = it }
update(onMarkerDrag) { this.onMarkerDrag = it }
update(onMarkerDragEnd) { this.onMarkerDragEnd = it }
update(onMarkerDragStart) { this.onMarkerDragStart = it }
}
)
}
internal class InputHandlerNode(
onCircleClick: ((Circle) -> Unit)? = null,
onGroundOverlayClick: ((GroundOverlay) -> Unit)? = null,
onPolygonClick: ((Polygon) -> Unit)? = null,
onPolylineClick: ((Polyline) -> Unit)? = null,
onMarkerClick: ((Marker) -> Boolean)? = null,
onInfoWindowClick: ((Marker) -> Unit)? = null,
onInfoWindowClose: ((Marker) -> Unit)? = null,
onInfoWindowLongClick: ((Marker) -> Unit)? = null,
onMarkerDrag: ((Marker) -> Unit)? = null,
onMarkerDragEnd: ((Marker) -> Unit)? = null,
onMarkerDragStart: ((Marker) -> Unit)? = null,
) : MapNode {
var onCircleClick: ((Circle) -> Unit)? by mutableStateOf(onCircleClick)
var onGroundOverlayClick: ((GroundOverlay) -> Unit)? by mutableStateOf(onGroundOverlayClick)
var onPolygonClick: ((Polygon) -> Unit)? by mutableStateOf(onPolygonClick)
var onPolylineClick: ((Polyline) -> Unit)? by mutableStateOf(onPolylineClick)
var onMarkerClick: ((Marker) -> Boolean)? by mutableStateOf(onMarkerClick)
var onInfoWindowClick: ((Marker) -> Unit)? by mutableStateOf(onInfoWindowClick)
var onInfoWindowClose: ((Marker) -> Unit)? by mutableStateOf(onInfoWindowClose)
var onInfoWindowLongClick: ((Marker) -> Unit)? by mutableStateOf(onInfoWindowLongClick)
var onMarkerDrag: ((Marker) -> Unit)? by mutableStateOf(onMarkerDrag)
var onMarkerDragEnd: ((Marker) -> Unit)? by mutableStateOf(onMarkerDragEnd)
var onMarkerDragStart: ((Marker) -> Unit)? by mutableStateOf(onMarkerDragStart)
}