Add feature group
This commit is contained in:
parent
52d0d959de
commit
307e42eac2
@ -74,4 +74,14 @@ fun FeatureBuilder.image(
|
|||||||
size: Size = Size(20f, 20f),
|
size: Size = Size(20f, 20f),
|
||||||
zoomRange: IntRange = defaultZoomRange,
|
zoomRange: IntRange = defaultZoomRange,
|
||||||
id: FeatureId? = null,
|
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)
|
||||||
|
}
|
@ -16,10 +16,11 @@ import centre.sciprog.maps.wrapAll
|
|||||||
|
|
||||||
//TODO replace zoom range with zoom-based representation change
|
//TODO replace zoom range with zoom-based representation change
|
||||||
sealed class MapFeature(val zoomRange: IntRange) {
|
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)
|
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)
|
* 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) {
|
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(
|
class MapDrawFeature(
|
||||||
@ -79,7 +80,6 @@ class MapBitmapImageFeature(
|
|||||||
override fun getBoundingBox(zoom: Int): GmcBox = GmcBox(position, position)
|
override fun getBoundingBox(zoom: Int): GmcBox = GmcBox(position, position)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
class MapVectorImageFeature(
|
class MapVectorImageFeature(
|
||||||
val position: GeodeticMapCoordinates,
|
val position: GeodeticMapCoordinates,
|
||||||
val painter: Painter,
|
val painter: Painter,
|
||||||
@ -96,3 +96,13 @@ fun MapVectorImageFeature(
|
|||||||
size: Size = Size(20f, 20f),
|
size: Size = Size(20f, 20f),
|
||||||
zoomRange: IntRange = defaultZoomRange,
|
zoomRange: IntRange = defaultZoomRange,
|
||||||
): MapVectorImageFeature = MapVectorImageFeature(position, rememberVectorPainter(image), size, zoomRange)
|
): 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()
|
||||||
|
}
|
||||||
|
@ -48,7 +48,7 @@ private val logger = KotlinLogging.logger("MapView")
|
|||||||
/**
|
/**
|
||||||
* A component that renders map and provides basic map manipulation capabilities
|
* A component that renders map and provides basic map manipulation capabilities
|
||||||
*/
|
*/
|
||||||
@OptIn(ExperimentalComposeUiApi::class)
|
|
||||||
@Composable
|
@Composable
|
||||||
actual fun MapView(
|
actual fun MapView(
|
||||||
mapTileProvider: MapTileProvider,
|
mapTileProvider: MapTileProvider,
|
||||||
@ -102,6 +102,7 @@ actual fun MapView(
|
|||||||
// Selection rectangle. If null - no selection
|
// Selection rectangle. If null - no selection
|
||||||
var selectRect by remember { mutableStateOf<Rect?>(null) }
|
var selectRect by remember { mutableStateOf<Rect?>(null) }
|
||||||
|
|
||||||
|
@OptIn(ExperimentalComposeUiApi::class)
|
||||||
val canvasModifier = modifier.pointerInput(Unit) {
|
val canvasModifier = modifier.pointerInput(Unit) {
|
||||||
forEachGesture {
|
forEachGesture {
|
||||||
awaitPointerEventScope {
|
awaitPointerEventScope {
|
||||||
@ -240,6 +241,11 @@ actual fun MapView(
|
|||||||
val offset = feature.position.toOffset()
|
val offset = feature.position.toOffset()
|
||||||
feature.drawFeature(this, offset)
|
feature.drawFeature(this, offset)
|
||||||
}
|
}
|
||||||
|
is MapFeatureGroup -> {
|
||||||
|
feature.children.values.forEach {
|
||||||
|
drawFeature(zoom, it)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user