From 954cc26bfdf16cca0ebf7224e53051a930b01bc2 Mon Sep 17 00:00:00 2001 From: "a.kalmakhanov" Date: Thu, 28 Jul 2022 16:47:14 +0600 Subject: [PATCH] Ability to customise onDrag functionality --- .../src/jvmMain/kotlin/AngleConversion.kt | 4 ++++ demo/maps/src/jvmMain/kotlin/Main.kt | 19 ++++++++++++++----- .../center/sciprog/maps/compose/MapView.kt | 5 +++++ .../center/sciprog/maps/compose/MapViewJvm.kt | 8 ++++++++ 4 files changed, 31 insertions(+), 5 deletions(-) create mode 100644 demo/maps/src/jvmMain/kotlin/AngleConversion.kt diff --git a/demo/maps/src/jvmMain/kotlin/AngleConversion.kt b/demo/maps/src/jvmMain/kotlin/AngleConversion.kt new file mode 100644 index 0000000..a7ec5e5 --- /dev/null +++ b/demo/maps/src/jvmMain/kotlin/AngleConversion.kt @@ -0,0 +1,4 @@ +import kotlin.math.PI + +fun Double.toDegrees() = this * 180 / PI + diff --git a/demo/maps/src/jvmMain/kotlin/Main.kt b/demo/maps/src/jvmMain/kotlin/Main.kt index 574dc0e..8247dc9 100644 --- a/demo/maps/src/jvmMain/kotlin/Main.kt +++ b/demo/maps/src/jvmMain/kotlin/Main.kt @@ -48,17 +48,26 @@ fun App() { var centerCoordinates by remember { mutableStateOf(null) } + val pointOne = 55.568548 to 37.568604 + var pointTwo by remember { mutableStateOf(55.929444 to 37.518434) } + val pointThree = 60.929444 to 37.518434 MapView( mapTileProvider = mapTileProvider, initialViewPoint = viewPoint, config = MapViewConfig( inferViewBoxFromFeatures = true, - onViewChange = { centerCoordinates = focus } + onViewChange = { centerCoordinates = focus }, + onDrag = { start, end -> + if (start.focus.latitude.toDegrees() in (pointTwo.first - 0.05)..(pointTwo.first + 0.05) && + start.focus.longitude.toDegrees() in (pointTwo.second - 0.05)..(pointTwo.second + 0.05) + ) { + pointTwo = pointTwo.first + (end.focus.latitude - start.focus.latitude).toDegrees() to + pointTwo.second + (end.focus.longitude - start.focus.longitude).toDegrees() + false// returning false, because when we are dragging circle we don't want to drag map + } else true + } ) ) { - val pointOne = 55.568548 to 37.568604 - val pointTwo = 55.929444 to 37.518434 - val pointThree = 60.929444 to 37.518434 image(pointOne, Icons.Filled.Home) @@ -74,7 +83,7 @@ fun App() { arc(pointOne, Distance(10.0), 0f, PI) - line(pointOne, pointTwo) + line(pointOne, pointTwo, id = "line") text(pointOne, "Home", font = { size = 32f }) centerCoordinates?.let { diff --git a/maps-kt-compose/src/commonMain/kotlin/center/sciprog/maps/compose/MapView.kt b/maps-kt-compose/src/commonMain/kotlin/center/sciprog/maps/compose/MapView.kt index 80e5287..0dc4fd4 100644 --- a/maps-kt-compose/src/commonMain/kotlin/center/sciprog/maps/compose/MapView.kt +++ b/maps-kt-compose/src/commonMain/kotlin/center/sciprog/maps/compose/MapView.kt @@ -11,10 +11,15 @@ import kotlin.math.min //TODO consider replacing by modifier +/** + * @param onDrag - returns true if you want to drag a map and false, if you want to make map stationary. + * start - is a point where drag begins, end is a point where drag ends + */ public data class MapViewConfig( val zoomSpeed: Double = 1.0 / 3.0, val inferViewBoxFromFeatures: Boolean = false, val onClick: MapViewPoint.() -> Unit = {}, + val onDrag: (start: MapViewPoint, end: MapViewPoint) -> Boolean = { _, _ -> true }, val onViewChange: MapViewPoint.() -> Unit = {}, val onSelect: (GmcBox) -> Unit = {}, val zoomOnSelect: Boolean = true, diff --git a/maps-kt-compose/src/jvmMain/kotlin/center/sciprog/maps/compose/MapViewJvm.kt b/maps-kt-compose/src/jvmMain/kotlin/center/sciprog/maps/compose/MapViewJvm.kt index d12d568..3bd55ad 100644 --- a/maps-kt-compose/src/jvmMain/kotlin/center/sciprog/maps/compose/MapViewJvm.kt +++ b/maps-kt-compose/src/jvmMain/kotlin/center/sciprog/maps/compose/MapViewJvm.kt @@ -146,6 +146,14 @@ public actual fun MapView( config.onClick(MapViewPoint(dpPos.toGeodetic(), viewPoint.zoom)) drag(change.id) { dragChange -> val dragAmount = dragChange.position - dragChange.previousPosition + val dpStart = + DpOffset(dragChange.previousPosition.x.toDp(), dragChange.previousPosition.y.toDp()) + val dpEnd = DpOffset(dragChange.position.x.toDp(), dragChange.position.y.toDp()) + if (!config.onDrag( + MapViewPoint(dpStart.toGeodetic(), viewPoint.zoom), + MapViewPoint(dpEnd.toGeodetic(), viewPoint.zoom) + ) + ) return@drag val newViewPoint = viewPoint.move( -dragAmount.x.toDp().value / tileScale, +dragAmount.y.toDp().value / tileScale