Add feature group

This commit is contained in:
Alexander Nozik 2022-07-19 10:12:52 +03:00
parent 52d0d959de
commit 307e42eac2
No known key found for this signature in database
GPG Key ID: F7FCF2DD25C71357
3 changed files with 32 additions and 6 deletions

View File

@ -74,4 +74,14 @@ fun FeatureBuilder.image(
size: Size = Size(20f, 20f),
zoomRange: IntRange = defaultZoomRange,
id: FeatureId? = null,
) = addFeature(id, MapVectorImageFeature(position.toCoordinates(), image, size, zoomRange))
) = addFeature(id, MapVectorImageFeature(position.toCoordinates(), image, size, zoomRange))
fun FeatureBuilder.group(
zoomRange: IntRange = defaultZoomRange,
id: FeatureId? = null,
builder: FeatureBuilder.() -> Unit,
): FeatureId {
val map = MapFeatureBuilder(emptyMap()).apply(builder).build()
val feature = MapFeatureGroup(map, zoomRange)
return addFeature(id, feature)
}

View File

@ -16,10 +16,11 @@ import centre.sciprog.maps.wrapAll
//TODO replace zoom range with zoom-based representation change
sealed class MapFeature(val zoomRange: IntRange) {
abstract fun getBoundingBox(zoom: Int): GmcBox
abstract fun getBoundingBox(zoom: Int): GmcBox?
}
fun Iterable<MapFeature>.computeBoundingBox(zoom: Int): GmcBox? = map { it.getBoundingBox(zoom) }.wrapAll()
fun Iterable<MapFeature>.computeBoundingBox(zoom: Int): GmcBox? =
mapNotNull { it.getBoundingBox(zoom) }.wrapAll()
internal fun Pair<Double, Double>.toCoordinates() = GeodeticMapCoordinates.ofDegrees(first, second)
@ -29,7 +30,7 @@ internal val defaultZoomRange = 1..18
* A feature that decides what to show depending on the zoom value (it could change size of shape)
*/
class MapFeatureSelector(val selector: (zoom: Int) -> MapFeature) : MapFeature(defaultZoomRange) {
override fun getBoundingBox(zoom: Int): GmcBox = selector(zoom).getBoundingBox(zoom)
override fun getBoundingBox(zoom: Int): GmcBox? = selector(zoom).getBoundingBox(zoom)
}
class MapDrawFeature(
@ -79,7 +80,6 @@ class MapBitmapImageFeature(
override fun getBoundingBox(zoom: Int): GmcBox = GmcBox(position, position)
}
class MapVectorImageFeature(
val position: GeodeticMapCoordinates,
val painter: Painter,
@ -96,3 +96,13 @@ fun MapVectorImageFeature(
size: Size = Size(20f, 20f),
zoomRange: IntRange = defaultZoomRange,
): MapVectorImageFeature = MapVectorImageFeature(position, rememberVectorPainter(image), size, zoomRange)
/**
* A group of other features
*/
class MapFeatureGroup(
val children: Map<FeatureId, MapFeature>,
zoomRange: IntRange = defaultZoomRange,
) : MapFeature(zoomRange) {
override fun getBoundingBox(zoom: Int): GmcBox? = children.values.mapNotNull { it.getBoundingBox(zoom) }.wrapAll()
}

View File

@ -48,7 +48,7 @@ private val logger = KotlinLogging.logger("MapView")
/**
* A component that renders map and provides basic map manipulation capabilities
*/
@OptIn(ExperimentalComposeUiApi::class)
@Composable
actual fun MapView(
mapTileProvider: MapTileProvider,
@ -102,6 +102,7 @@ actual fun MapView(
// Selection rectangle. If null - no selection
var selectRect by remember { mutableStateOf<Rect?>(null) }
@OptIn(ExperimentalComposeUiApi::class)
val canvasModifier = modifier.pointerInput(Unit) {
forEachGesture {
awaitPointerEventScope {
@ -240,6 +241,11 @@ actual fun MapView(
val offset = feature.position.toOffset()
feature.drawFeature(this, offset)
}
is MapFeatureGroup -> {
feature.children.values.forEach {
drawFeature(zoom, it)
}
}
}
}