From ba962acf5cd697de67dbda8df98e28bf0d2dd823 Mon Sep 17 00:00:00 2001 From: darksnake Date: Mon, 2 Jan 2023 20:28:47 +0300 Subject: [PATCH] Change the working of groups --- demo/maps/src/jvmMain/kotlin/Main.kt | 13 ++++++++++++- .../center/sciprog/maps/compose/MapViewJvm.kt | 3 ++- .../center/sciprog/maps/features/Attributes.kt | 2 +- .../kotlin/center/sciprog/maps/features/Feature.kt | 6 ++++-- .../center/sciprog/maps/features/FeatureGroup.kt | 8 +++++++- .../center/sciprog/maps/features/drawFeature.kt | 4 +++- .../center/sciprog/maps/geojson/geoJsonFeature.kt | 8 +++----- .../sciprog/maps/geojson/geoJsonFeatureJvm.kt | 6 ++++-- 8 files changed, 36 insertions(+), 14 deletions(-) diff --git a/demo/maps/src/jvmMain/kotlin/Main.kt b/demo/maps/src/jvmMain/kotlin/Main.kt index d1a72ee..b339439 100644 --- a/demo/maps/src/jvmMain/kotlin/Main.kt +++ b/demo/maps/src/jvmMain/kotlin/Main.kt @@ -63,6 +63,8 @@ fun App() { ) { geoJson(URL("https://raw.githubusercontent.com/ggolikov/cities-comparison/master/src/moscow.geo.json")) + .withAttribute(ColorAttribute, Color.Blue) + .withAttribute(AlphaAttribute, 0.4f) image(pointOne, Icons.Filled.Home) @@ -117,7 +119,16 @@ fun App() { visit { id, feature -> if (feature is PolygonFeature) { - (id as FeatureId>).onHover { + id as FeatureId> + id.onClick { + println("Click on $id") + points( + feature.points, + id = "selected", + attributes = Attributes(ZAttribute, 10f) + ).color(Color.Blue) + } + id.onHover { println("Hover on $id") points( feature.points, 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 82532d7..c9231f6 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 @@ -120,7 +120,8 @@ public actual fun MapView( ) } - featuresState.features.filter { viewPoint.zoom in it.zoomRange } + featuresState.features + .filter { viewPoint.zoom in it.zoomRange } .forEach { feature -> drawFeature(mapState, painterCache, feature) } diff --git a/maps-kt-features/src/commonMain/kotlin/center/sciprog/maps/features/Attributes.kt b/maps-kt-features/src/commonMain/kotlin/center/sciprog/maps/features/Attributes.kt index 1f14e7e..19176e3 100644 --- a/maps-kt-features/src/commonMain/kotlin/center/sciprog/maps/features/Attributes.kt +++ b/maps-kt-features/src/commonMain/kotlin/center/sciprog/maps/features/Attributes.kt @@ -9,7 +9,7 @@ public value class Attributes internal constructor(internal val map: Map get(attribute: Attribute): T? = map[attribute] as? T - public fun Attribute.invoke(value: T?): Attributes = withAttribute(this, value) + public operator fun Attribute.invoke(value: T?): Attributes = withAttribute(this, value) override fun toString(): String = "AttributeMap(value=${map.entries})" diff --git a/maps-kt-features/src/commonMain/kotlin/center/sciprog/maps/features/Feature.kt b/maps-kt-features/src/commonMain/kotlin/center/sciprog/maps/features/Feature.kt index 6469279..cc05ef9 100644 --- a/maps-kt-features/src/commonMain/kotlin/center/sciprog/maps/features/Feature.kt +++ b/maps-kt-features/src/commonMain/kotlin/center/sciprog/maps/features/Feature.kt @@ -132,8 +132,10 @@ public data class PolygonFeature( override fun getBoundingBox(zoom: Float): Rectangle? = boundingBox - override fun contains(viewPoint: ViewPoint): Boolean = - viewPoint.focus in boundingBox!!//with(space) { viewPoint.focus.isInsidePolygon(points) } + override fun contains(viewPoint: ViewPoint): Boolean { + val boundingBox = boundingBox ?: return false + return viewPoint.focus in boundingBox && with(space) { viewPoint.focus.isInsidePolygon(points) } + } override fun withAttributes(modify: (Attributes) -> Attributes): Feature = copy(attributes = modify(attributes)) } diff --git a/maps-kt-features/src/commonMain/kotlin/center/sciprog/maps/features/FeatureGroup.kt b/maps-kt-features/src/commonMain/kotlin/center/sciprog/maps/features/FeatureGroup.kt index 73e86d2..97acafa 100644 --- a/maps-kt-features/src/commonMain/kotlin/center/sciprog/maps/features/FeatureGroup.kt +++ b/maps-kt-features/src/commonMain/kotlin/center/sciprog/maps/features/FeatureGroup.kt @@ -81,6 +81,11 @@ public data class FeatureGroup( feature(this, get(this).withAttributes(modify)) } + public fun > FeatureId.withAttributes(modify: Attributes.() -> Attributes): FeatureId { + feature(this, get(this).withAttributes(modify)) + return this + } + public fun , V> FeatureId.withAttribute(key: Attribute, value: V?): FeatureId { feature(this, get(this).withAttributes { withAttribute(key, value) }) return this @@ -174,6 +179,7 @@ public data class FeatureGroup( public fun > FeatureId.color(color: Color): FeatureId = withAttribute(ColorAttribute, color) + public fun > FeatureId.zoomRange(range: FloatRange): FeatureId = withAttribute(ZoomRangeAttribute, range) @@ -181,7 +187,7 @@ public data class FeatureGroup( featureMap.values.mapNotNull { it.getBoundingBox(zoom) }.wrapRectangles() } - override fun withAttributes(modify: Attributes.() -> Attributes): Feature = copy(attributes = attributes) + override fun withAttributes(modify: Attributes.() -> Attributes): Feature = copy(attributes = modify(attributes)) public companion object { diff --git a/maps-kt-features/src/jvmMain/kotlin/center/sciprog/maps/features/drawFeature.kt b/maps-kt-features/src/jvmMain/kotlin/center/sciprog/maps/features/drawFeature.kt index 69614f8..8c4aad8 100644 --- a/maps-kt-features/src/jvmMain/kotlin/center/sciprog/maps/features/drawFeature.kt +++ b/maps-kt-features/src/jvmMain/kotlin/center/sciprog/maps/features/drawFeature.kt @@ -98,7 +98,9 @@ public fun DrawScope.drawFeature( is FeatureGroup -> { feature.featureMap.values.forEach { - drawFeature(state, painterCache, it) + drawFeature(state, painterCache, it.withAttributes { + feature.attributes + this + }) } } diff --git a/maps-kt-geojson/src/commonMain/kotlin/center/sciprog/maps/geojson/geoJsonFeature.kt b/maps-kt-geojson/src/commonMain/kotlin/center/sciprog/maps/geojson/geoJsonFeature.kt index bb7c3e4..d9673c8 100644 --- a/maps-kt-geojson/src/commonMain/kotlin/center/sciprog/maps/geojson/geoJsonFeature.kt +++ b/maps-kt-geojson/src/commonMain/kotlin/center/sciprog/maps/geojson/geoJsonFeature.kt @@ -53,15 +53,13 @@ public fun FeatureGroup.geoJsonGeometry( geoJsonGeometry(it) } } -}.apply { - withAttribute(AlphaAttribute, 0.5f) } public fun FeatureGroup.geoJsonFeature( geoJson: GeoJsonFeature, id: String? = null, -): FeatureId>? { - val geometry = geoJson.geometry ?: return null +): FeatureId> { + val geometry = geoJson.geometry ?: return group{} val idOverride = geoJson.properties?.get("id")?.jsonPrimitive?.contentOrNull ?: id val colorOverride = geoJson.properties?.get("color")?.jsonPrimitive?.intOrNull?.let { Color(it) } val jsonGeometry = geoJsonGeometry(geometry, idOverride) @@ -75,7 +73,7 @@ public fun FeatureGroup.geoJsonFeature( public fun FeatureGroup.geoJson( geoJson: GeoJson, id: String? = null, -): FeatureId>? = when (geoJson) { +): FeatureId> = when (geoJson) { is GeoJsonFeature -> geoJsonFeature(geoJson, id = id) is GeoJsonFeatureCollection -> group(id = id) { geoJson.features.forEach { diff --git a/maps-kt-geojson/src/jvmMain/kotlin/center/sciprog/maps/geojson/geoJsonFeatureJvm.kt b/maps-kt-geojson/src/jvmMain/kotlin/center/sciprog/maps/geojson/geoJsonFeatureJvm.kt index 69bab3a..4339a31 100644 --- a/maps-kt-geojson/src/jvmMain/kotlin/center/sciprog/maps/geojson/geoJsonFeatureJvm.kt +++ b/maps-kt-geojson/src/jvmMain/kotlin/center/sciprog/maps/geojson/geoJsonFeatureJvm.kt @@ -1,7 +1,9 @@ package center.sciprog.maps.geojson import center.sciprog.maps.coordinates.Gmc +import center.sciprog.maps.features.Feature import center.sciprog.maps.features.FeatureGroup +import center.sciprog.maps.features.FeatureId import kotlinx.serialization.json.Json import kotlinx.serialization.json.jsonObject import java.net.URL @@ -12,10 +14,10 @@ import java.net.URL public fun FeatureGroup.geoJson( geoJsonUrl: URL, id: String? = null, -) { +): FeatureId> { val jsonString = geoJsonUrl.readText() val json = Json.parseToJsonElement(jsonString).jsonObject val geoJson = GeoJson(json) - geoJson(geoJson, id) + return geoJson(geoJson, id) } \ No newline at end of file