OnClick returns MapViewPoint

This commit is contained in:
Alexander Nozik 2022-07-15 09:31:51 +03:00
parent 5984de70b4
commit ec2dcdccaa
No known key found for this signature in database
GPG Key ID: F7FCF2DD25C71357
4 changed files with 22 additions and 20 deletions

0
README.md Normal file
View File

View File

@ -20,7 +20,7 @@ expect fun MapView(
mapTileProvider: MapTileProvider, mapTileProvider: MapTileProvider,
computeViewPoint: (canvasSize: DpSize) -> MapViewPoint, computeViewPoint: (canvasSize: DpSize) -> MapViewPoint,
features: Map<FeatureId, MapFeature>, features: Map<FeatureId, MapFeature>,
onClick: (GeodeticMapCoordinates) -> Unit = {}, onClick: MapViewPoint.() -> Unit = {},
//TODO consider replacing by modifier //TODO consider replacing by modifier
config: MapViewConfig = MapViewConfig(), config: MapViewConfig = MapViewConfig(),
modifier: Modifier = Modifier.fillMaxSize(), modifier: Modifier = Modifier.fillMaxSize(),
@ -31,7 +31,7 @@ fun MapView(
mapTileProvider: MapTileProvider, mapTileProvider: MapTileProvider,
initialViewPoint: MapViewPoint, initialViewPoint: MapViewPoint,
features: Map<FeatureId, MapFeature> = emptyMap(), features: Map<FeatureId, MapFeature> = emptyMap(),
onClick: (GeodeticMapCoordinates) -> Unit = {}, onClick: MapViewPoint.() -> Unit = {},
config: MapViewConfig = MapViewConfig(), config: MapViewConfig = MapViewConfig(),
modifier: Modifier = Modifier.fillMaxSize(), modifier: Modifier = Modifier.fillMaxSize(),
buildFeatures: @Composable (FeatureBuilder.() -> Unit) = {}, buildFeatures: @Composable (FeatureBuilder.() -> Unit) = {},
@ -46,7 +46,7 @@ fun MapView(
mapTileProvider: MapTileProvider, mapTileProvider: MapTileProvider,
box: GmcBox, box: GmcBox,
features: Map<FeatureId, MapFeature> = emptyMap(), features: Map<FeatureId, MapFeature> = emptyMap(),
onClick: (GeodeticMapCoordinates) -> Unit = {}, onClick: MapViewPoint.() -> Unit = {},
config: MapViewConfig = MapViewConfig(), config: MapViewConfig = MapViewConfig(),
modifier: Modifier = Modifier.fillMaxSize(), modifier: Modifier = Modifier.fillMaxSize(),
buildFeatures: @Composable (FeatureBuilder.() -> Unit) = {}, buildFeatures: @Composable (FeatureBuilder.() -> Unit) = {},

View File

@ -43,7 +43,7 @@ fun App() {
MapView( MapView(
mapTileProvider, mapTileProvider,
viewPoint, viewPoint,
onClick = { gmc -> coordinates = gmc }, onClick = { coordinates = focus },
config = MapViewConfig(inferViewBoxFromFeatures = true) config = MapViewConfig(inferViewBoxFromFeatures = true)
) { ) {
val pointOne = 55.568548 to 37.568604 val pointOne = 55.568548 to 37.568604

View File

@ -40,27 +40,29 @@ actual fun MapView(
mapTileProvider: MapTileProvider, mapTileProvider: MapTileProvider,
computeViewPoint: (canvasSize: DpSize) -> MapViewPoint, computeViewPoint: (canvasSize: DpSize) -> MapViewPoint,
features: Map<FeatureId, MapFeature>, features: Map<FeatureId, MapFeature>,
onClick: (GeodeticMapCoordinates) -> Unit, onClick: MapViewPoint.() -> Unit,
config: MapViewConfig, config: MapViewConfig,
modifier: Modifier, modifier: Modifier,
) { ) {
var canvasSize by remember { mutableStateOf(DpSize(512.dp, 512.dp)) } var canvasSize by remember { mutableStateOf(DpSize(512.dp, 512.dp)) }
var viewPointOverride by remember { mutableStateOf<MapViewPoint?>( var viewPointOverride: MapViewPoint? by remember {
if(config.inferViewBoxFromFeatures){ mutableStateOf(
features.values.computeBoundingBox(1)?.let { box -> if (config.inferViewBoxFromFeatures) {
val zoom = log2( features.values.computeBoundingBox(1)?.let { box ->
min( val zoom = log2(
canvasSize.width.value / box.width, min(
canvasSize.height.value / box.height canvasSize.width.value / box.width,
) * PI / mapTileProvider.tileSize canvasSize.height.value / box.height
) ) * PI / mapTileProvider.tileSize
MapViewPoint(box.center, zoom) )
MapViewPoint(box.center, zoom)
}
} else {
null
} }
} else { )
null }
}
) }
val viewPoint by derivedStateOf { viewPointOverride ?: computeViewPoint(canvasSize) } val viewPoint by derivedStateOf { viewPointOverride ?: computeViewPoint(canvasSize) }
@ -123,7 +125,7 @@ actual fun MapView(
} else { } else {
val dragStart = change.position val dragStart = change.position
val dpPos = DpOffset(dragStart.x.toDp(), dragStart.y.toDp()) val dpPos = DpOffset(dragStart.x.toDp(), dragStart.y.toDp())
onClick(dpPos.toGeodetic()) onClick(MapViewPoint(dpPos.toGeodetic(), viewPoint.zoom))
drag(change.id) { dragChange -> drag(change.id) { dragChange ->
val dragAmount = dragChange.position - dragChange.previousPosition val dragAmount = dragChange.position - dragChange.previousPosition
viewPointOverride = viewPoint.move( viewPointOverride = viewPoint.move(