Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 18 additions & 23 deletions api/android-for-mappls.api
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@ public final class com.mapconductor.mappls.MapplsMapViewKt {
public static final com.mapconductor.mappls.MapplsViewController createMapplsViewController(com.mapconductor.mappls.MapplsMapViewHolderInterface, com.mapconductor.core.marker.MarkerTilingOptions, com.mapconductor.core.map.MutableMapServiceRegistry);
public static final com.mapconductor.mappls.marker.MapplsMarkerController getMarkerController(com.mapconductor.mappls.MapplsMapViewHolderInterface, com.mapconductor.core.marker.MarkerTilingOptions);
public static final com.mapconductor.mappls.polyline.MapplsPolylineController getPolylineController(com.mapconductor.mappls.MapplsMapViewHolderInterface);
public static final com.mapconductor.mappls.polygon.MapplsPolygonConductor getPolygonController(com.mapconductor.mappls.MapplsMapViewHolderInterface);
public static final com.mapconductor.mappls.polygon.MapplsPolygonController getPolygonController(com.mapconductor.mappls.MapplsMapViewHolderInterface);
public static final com.mapconductor.mappls.circle.MapplsCircleController getCircleController(com.mapconductor.mappls.MapplsMapViewHolderInterface);
public static final com.mapconductor.mappls.raster.MapplsRasterLayerController getRasterLayerController(com.mapconductor.mappls.MapplsMapViewHolderInterface);
public static final com.mapconductor.mappls.groundimage.MapplsGroundImageController getGroundImageController(com.mapconductor.mappls.MapplsMapViewHolderInterface);
Expand All @@ -116,8 +116,8 @@ public final class com.mapconductor.mappls.MapplsPolyUtilsKt {
public final class com.mapconductor.mappls.MapplsTypeAliasKt {
}
public final class com.mapconductor.mappls.MapplsViewController extends com.mapconductor.core.controller.BaseMapViewController implements com.mapconductor.mappls.MapplsViewControllerInterface,com.mappls.sdk.maps.MapplsMap$OnMapClickListener,com.mappls.sdk.maps.MapplsMap$OnMapLongClickListener,com.mappls.sdk.maps.MapplsMap$OnMoveListener,com.mappls.sdk.maps.MapplsMap$OnCameraMoveListener,com.mappls.sdk.maps.MapplsMap$OnCameraIdleListener {
public com.mapconductor.mappls.MapplsViewController(com.mapconductor.mappls.MapplsMapViewHolderInterface, com.mapconductor.mappls.marker.MapplsMarkerController, com.mapconductor.mappls.polyline.MapplsPolylineController, com.mapconductor.mappls.polygon.MapplsPolygonConductor, com.mapconductor.mappls.groundimage.MapplsGroundImageController, com.mapconductor.mappls.circle.MapplsCircleController, com.mapconductor.mappls.raster.MapplsRasterLayerController, kotlinx.coroutines.CoroutineScope, kotlinx.coroutines.CoroutineScope);
public com.mapconductor.mappls.MapplsViewController(com.mapconductor.mappls.MapplsMapViewHolderInterface, com.mapconductor.mappls.marker.MapplsMarkerController, com.mapconductor.mappls.polyline.MapplsPolylineController, com.mapconductor.mappls.polygon.MapplsPolygonConductor, com.mapconductor.mappls.groundimage.MapplsGroundImageController, com.mapconductor.mappls.circle.MapplsCircleController, com.mapconductor.mappls.raster.MapplsRasterLayerController, kotlinx.coroutines.CoroutineScope, kotlinx.coroutines.CoroutineScope, int, kotlin.jvm.internal.DefaultConstructorMarker);
public com.mapconductor.mappls.MapplsViewController(com.mapconductor.mappls.MapplsMapViewHolderInterface, com.mapconductor.mappls.marker.MapplsMarkerController, com.mapconductor.mappls.polyline.MapplsPolylineController, com.mapconductor.mappls.polygon.MapplsPolygonController, com.mapconductor.mappls.groundimage.MapplsGroundImageController, com.mapconductor.mappls.circle.MapplsCircleController, com.mapconductor.mappls.raster.MapplsRasterLayerController, kotlinx.coroutines.CoroutineScope, kotlinx.coroutines.CoroutineScope);
public com.mapconductor.mappls.MapplsViewController(com.mapconductor.mappls.MapplsMapViewHolderInterface, com.mapconductor.mappls.marker.MapplsMarkerController, com.mapconductor.mappls.polyline.MapplsPolylineController, com.mapconductor.mappls.polygon.MapplsPolygonController, com.mapconductor.mappls.groundimage.MapplsGroundImageController, com.mapconductor.mappls.circle.MapplsCircleController, com.mapconductor.mappls.raster.MapplsRasterLayerController, kotlinx.coroutines.CoroutineScope, kotlinx.coroutines.CoroutineScope, int, kotlin.jvm.internal.DefaultConstructorMarker);
public com.mapconductor.mappls.MapplsMapViewHolderInterface getHolder();
public kotlinx.coroutines.CoroutineScope getMainCoroutine();
public kotlinx.coroutines.CoroutineScope getDefaultCoroutine();
Expand Down Expand Up @@ -365,27 +365,22 @@ public class com.mapconductor.mappls.marker.MarkerLayer {
public final boolean wouldSkipDraw(java.util.List<? extends com.mapconductor.core.marker.MarkerEntityInterface<com.mappls.sdk.geojson.Feature>>);
public final void draw(java.util.List<? extends com.mapconductor.core.marker.MarkerEntityInterface<com.mappls.sdk.geojson.Feature>>, com.mappls.sdk.maps.Style);
}
public final class com.mapconductor.mappls.polygon.MapplsPolygonConductor implements com.mapconductor.core.controller.SlottedOverlayController<com.mapconductor.core.polygon.PolygonState, com.mapconductor.core.polygon.PolygonEntityInterface<com.mapconductor.core.polygon.PolygonState>> {
public com.mapconductor.mappls.polygon.MapplsPolygonConductor(com.mapconductor.mappls.polygon.MapplsPolygonOverlayRenderer, com.mapconductor.mappls.polyline.MapplsPolylineOverlayRenderer);
public final com.mapconductor.mappls.polygon.MapplsPolygonOverlayRenderer getPolygonOverlay();
public final com.mapconductor.mappls.polyline.MapplsPolylineOverlayRenderer getPolylineOverlay();
public int getZIndex();
public final kotlin.jvm.functions.Function1<com.mapconductor.core.polygon.PolygonEvent, kotlin.Unit> getClickListener();
public final void setClickListener(kotlin.jvm.functions.Function1<? super com.mapconductor.core.polygon.PolygonEvent, kotlin.Unit>);
public java.lang.Object add(java.util.List<com.mapconductor.core.polygon.PolygonState>, kotlin.coroutines.Continuation<? super kotlin.Unit>);
public java.lang.Object update(com.mapconductor.core.polygon.PolygonState, kotlin.coroutines.Continuation<? super kotlin.Unit>);
public final void dispatchClick(com.mapconductor.core.polygon.PolygonEvent);
public com.mapconductor.core.polygon.PolygonEntityInterface<com.mapconductor.core.polygon.PolygonState> find(com.mapconductor.core.features.GeoPointInterface);
public java.lang.Object clear(kotlin.coroutines.Continuation<? super kotlin.Unit>);
public com.mapconductor.core.controller.OverlayKind getKind();
public boolean has(java.lang.String);
public void setClickListenerAny(java.lang.Object);
public com.mapconductor.core.controller.OverlayHit resolveTap(com.mapconductor.core.features.GeoPointInterface);
public void destroy();
public java.lang.Object update(java.lang.Object, kotlin.coroutines.Continuation);
public java.lang.Object find(com.mapconductor.core.features.GeoPointInterface);
public final class com.mapconductor.mappls.polygon.MapplsPolygonCompositeRenderer implements com.mapconductor.core.polygon.PolygonOverlayRendererInterface<java.util.List<? extends com.mappls.sdk.geojson.Feature>> {
public com.mapconductor.mappls.polygon.MapplsPolygonCompositeRenderer(com.mapconductor.mappls.polygon.MapplsPolygonOverlayRenderer, com.mapconductor.mappls.polyline.MapplsPolylineOverlayRenderer);
public final com.mapconductor.mappls.polygon.MapplsPolygonOverlayRenderer getFill();
public final com.mapconductor.mappls.polyline.MapplsPolylineOverlayRenderer getOutline();
public java.lang.Object onAdd(java.util.List<? extends com.mapconductor.core.polygon.PolygonOverlayRendererInterface$AddParamsInterface>, kotlin.coroutines.Continuation<? super java.util.List<? extends java.util.List<com.mappls.sdk.geojson.Feature>>>);
public java.lang.Object onChange(java.util.List<? extends com.mapconductor.core.polygon.PolygonOverlayRendererInterface$ChangeParamsInterface<java.util.List<com.mappls.sdk.geojson.Feature>>>, kotlin.coroutines.Continuation<? super java.util.List<? extends java.util.List<com.mappls.sdk.geojson.Feature>>>);
public java.lang.Object onRemove(java.util.List<? extends com.mapconductor.core.polygon.PolygonEntityInterface<java.util.List<com.mappls.sdk.geojson.Feature>>>, kotlin.coroutines.Continuation<? super kotlin.Unit>);
public java.lang.Object onPostProcess(kotlin.coroutines.Continuation<? super kotlin.Unit>);
}
public final class com.mapconductor.mappls.polygon.MapplsPolygonConductorKt {
public final class com.mapconductor.mappls.polygon.MapplsPolygonCompositeRendererKt {
}
public final class com.mapconductor.mappls.polygon.MapplsPolygonController extends com.mapconductor.core.polygon.PolygonController<java.util.List<? extends com.mappls.sdk.geojson.Feature>> {
public com.mapconductor.mappls.polygon.MapplsPolygonController(com.mapconductor.mappls.polygon.MapplsPolygonCompositeRenderer);
public com.mapconductor.mappls.polygon.MapplsPolygonCompositeRenderer getRenderer();
public int getZIndex();
public com.mapconductor.core.polygon.PolygonOverlayRendererInterface getRenderer();
}
public final class com.mapconductor.mappls.polygon.MapplsPolygonLayer {
public com.mapconductor.mappls.polygon.MapplsPolygonLayer(java.lang.String, java.lang.String);
Expand Down
14 changes: 9 additions & 5 deletions src/main/java/com/mapconductor/mappls/MapplsMapView.kt
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,8 @@ import com.mapconductor.mappls.marker.MapplsMarkerController
import com.mapconductor.mappls.marker.MapplsMarkerOverlayRenderer
import com.mapconductor.mappls.marker.MarkerDragLayer
import com.mapconductor.mappls.marker.MarkerLayer
import com.mapconductor.mappls.polygon.MapplsPolygonConductor
import com.mapconductor.mappls.polygon.MapplsPolygonCompositeRenderer
import com.mapconductor.mappls.polygon.MapplsPolygonController
import com.mapconductor.mappls.polygon.MapplsPolygonLayer
import com.mapconductor.mappls.polygon.MapplsPolygonOverlayRenderer
import com.mapconductor.mappls.polyline.MapplsPolylineController
Expand Down Expand Up @@ -307,7 +308,7 @@ fun getPolylineController(holder: MapplsMapViewHolderInterface): MapplsPolylineC
return controller
}

fun getPolygonController(holder: MapplsMapViewHolderInterface): MapplsPolygonConductor {
fun getPolygonController(holder: MapplsMapViewHolderInterface): MapplsPolygonController {
val polylineLayer =
MapplsPolylineLayer(
sourceId = "polygon-outline-source",
Expand All @@ -334,9 +335,12 @@ fun getPolygonController(holder: MapplsMapViewHolderInterface): MapplsPolygonCon
holder = holder,
)

return MapplsPolygonConductor(
polygonOverlay = polygonOverlayRenderer,
polylineOverlay = polylineOverlayRenderer,
return MapplsPolygonController(
renderer =
MapplsPolygonCompositeRenderer(
fill = polygonOverlayRenderer,
outline = polylineOverlayRenderer,
),
)
}

Expand Down
4 changes: 2 additions & 2 deletions src/main/java/com/mapconductor/mappls/MapplsViewController.kt
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ import com.mapconductor.mappls.marker.MapplsMarkerController
import com.mapconductor.mappls.marker.MapplsMarkerOverlayRenderer
import com.mapconductor.mappls.marker.MarkerDragLayer
import com.mapconductor.mappls.marker.MarkerLayer
import com.mapconductor.mappls.polygon.MapplsPolygonConductor
import com.mapconductor.mappls.polygon.MapplsPolygonController
import com.mapconductor.mappls.polyline.MapplsPolylineController
import com.mapconductor.mappls.raster.MapplsRasterLayerController
import com.mappls.sdk.gestures.MoveGestureDetector
Expand All @@ -47,7 +47,7 @@ class MapplsViewController(
override val holder: MapplsMapViewHolderInterface,
internal val markerController: MapplsMarkerController,
internal val polylineController: MapplsPolylineController,
internal val polygonController: MapplsPolygonConductor,
internal val polygonController: MapplsPolygonController,
internal val groundImageController: MapplsGroundImageController,
internal val circleController: MapplsCircleController,
internal val rasterLayerController: MapplsRasterLayerController,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -81,8 +81,8 @@ internal fun MapplsViewController.setupStyle(style: Style) {
(markerController.renderer as MapplsMarkerOverlayRenderer).ensureDefaultIcon(style)

// Polygon sources only (layers will be added per zIndex)
ensureGeoJsonSource(style, polygonController.polylineOverlay.layer.sourceId)
ensureGeoJsonSource(style, polygonController.polygonOverlay.layer.sourceId)
ensureGeoJsonSource(style, polygonController.renderer.outline.layer.sourceId)
ensureGeoJsonSource(style, polygonController.renderer.fill.layer.sourceId)

// Circle cts as anchor above polygons
ensureGeoJsonSource(style, circleController.renderer.layer.sourceId)
Expand Down Expand Up @@ -157,20 +157,20 @@ internal fun MapplsViewController.setupStyle(style: Style) {
(markerController.renderer as MapplsMarkerOverlayRenderer).redraw()
circleController.renderer.redraw()
polylineController.renderer.redraw()
// polygonController.polygonOverlay.onPostProcess()
// polygonController.renderer.fill.onPostProcess()
mainCoroutine.launch {
groundImageController.reapplyStyle()
rasterLayerController.reapplyStyle()
}
}

internal fun MapplsViewController.ensurePolygonZLayers(style: Style) {
val fillSourceId = polygonController.polygonOverlay.layer.sourceId
val outlineSourceId = polygonController.polylineOverlay.layer.sourceId
val fillSourceId = polygonController.renderer.fill.layer.sourceId
val outlineSourceId = polygonController.renderer.outline.layer.sourceId
val anchorId = polylineController.renderer.layer.layerId

val zSet =
polygonController.polygonOverlay.polygonManager
polygonController.polygonManager
.allEntities()
.map { it.state.zIndex }
.toSet()
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
package com.mapconductor.mappls.polygon

import com.mapconductor.core.polygon.PolygonEntityInterface
import com.mapconductor.core.polygon.PolygonOverlayRendererInterface
import com.mapconductor.core.polygon.PolygonState
import com.mapconductor.core.polyline.PolylineEntity
import com.mapconductor.core.polyline.PolylineState
import com.mapconductor.mappls.MapplsActualPolygon
import com.mapconductor.mappls.polyline.MapplsPolylineOverlayRenderer

/**
* 塗りと輪郭を 1 つのレンダラとして [com.mapconductor.core.polygon.PolygonController] に渡すための合成レンダラ。
*
* fill レイヤーは幅 1 px の輪郭しか描けないので、`strokeWidth` を守るために輪郭は
* 別のポリライン(`outline-<id>`)として [outline] で描く。差分計算はコアの
* PolygonController に任せ、ここは「塗りへの指示を輪郭にも写す」ことだけをする。
*
* 塗りのエンティティはコントローラと同じ [fill] の polygonManager に載る。輪郭は
* [outline] の polylineManager に載り、コントローラからは見えない。
*/
class MapplsPolygonCompositeRenderer(
val fill: MapplsPolygonOverlayRenderer,
val outline: MapplsPolylineOverlayRenderer,
) : PolygonOverlayRendererInterface<MapplsActualPolygon> {
override suspend fun onAdd(data: List<PolygonOverlayRendererInterface.AddParamsInterface>): List<MapplsActualPolygon?> {
val polygons = fill.onAdd(data)
data.forEachIndexed { index, params ->
if (polygons[index] != null) putOutline(params.state)
}
return polygons
}

override suspend fun onChange(
data: List<PolygonOverlayRendererInterface.ChangeParamsInterface<MapplsActualPolygon>>,
): List<MapplsActualPolygon?> {
val polygons = fill.onChange(data)
data.forEachIndexed { index, params ->
if (polygons[index] != null) putOutline(params.current.state)
}
return polygons
}

override suspend fun onRemove(data: List<PolygonEntityInterface<MapplsActualPolygon>>) {
data.forEach { outline.polylineManager.removeEntity(outlineId(it.state.id)) }
// clear() は onPostProcess を呼ばないので、消した結果はここで描き直す。
fill.onRemove(data)
outline.onPostProcess()
}

override suspend fun onPostProcess() {
fill.onPostProcess()
outline.onPostProcess()
}

private suspend fun putOutline(state: PolygonState) {
val outlineState = state.toOutlineState() ?: return
outline.createPolyline(outlineState)?.let { polyline ->
outline.polylineManager.registerEntity(PolylineEntity(polyline = polyline, state = outlineState))
}
}
}

private fun outlineId(polygonId: String): String = "outline-$polygonId"

/** 外周だけを閉じたポリラインにする(穴の輪郭は描かない)。 */
private fun PolygonState.toOutlineState(): PolylineState? {
if (points.isEmpty()) return null
val closedPoints = if (points.first() != points.last()) points + points.first() else points
return PolylineState(
points = closedPoints,
id = outlineId(id),
strokeColor = strokeColor,
strokeWidth = strokeWidth,
geodesic = geodesic,
zIndex = zIndex,
extra = extra,
)
}
Loading
Loading