Skip to content

Commit 2bcf4c4

Browse files
masashimasashi
authored andcommitted
Revert "Revert "Fix: use setXXX() callback instead of setting callback to properties directly (#56)""
This reverts commit 22018ec.
1 parent 22018ec commit 2bcf4c4

15 files changed

Lines changed: 192 additions & 367 deletions

File tree

mapconductor-core/src/main/java/com/mapconductor/core/controller/MapViewController.kt

Lines changed: 64 additions & 205 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,6 @@ import com.mapconductor.core.circle.CircleOverlayManager
44
import com.mapconductor.core.circle.CircleRenderer
55
import com.mapconductor.core.circle.CircleState
66
import com.mapconductor.core.circle.OnCircleEventHandler
7-
import com.mapconductor.core.features.IGeoPoint
8-
import com.mapconductor.core.geocell.HexCell
9-
import com.mapconductor.core.geocell.HexCoord
107
import com.mapconductor.core.geocell.HexGeocell
118
import com.mapconductor.core.map.MapViewHolder
129
import com.mapconductor.core.map.OnCameraMoveHandler
@@ -46,27 +43,31 @@ interface MapViewController<ActualMarker, ActualCircle, ActualPolyline, ActualPo
4643

4744
suspend fun clearOverlays()
4845

46+
fun setCameraMoveListener(listener: OnCameraMoveHandler?)
47+
48+
fun setMapClickListener(listener: OnMapEventHandler?)
49+
50+
fun setMapLongClickListener(listener: OnMapEventHandler?)
51+
52+
fun setMarkerClickListener(listener: OnMarkerEventHandler?)
53+
54+
fun setMarkerDragStartListener(listener: OnMarkerEventHandler?)
55+
56+
fun setMarkerDragListener(listener: OnMarkerEventHandler?)
57+
58+
fun setMarkerDragEndListener(listener: OnMarkerEventHandler?)
59+
60+
fun setCircleClickListener(listener: OnCircleEventHandler?)
61+
62+
fun setPolylineClickListener(listener: OnPolylineEventHandler?)
63+
4964
fun setOnMarkerAnimationStart(listener: OnMarkerEventHandler?)
5065

5166
fun setOnMarkerAnimationEnd(listener: OnMarkerEventHandler?)
5267
}
5368
typealias MapViewControllerAlias = MapViewController<*, *, *, *>
5469

55-
data class SearchRangeAnalysis(
56-
val clickPosition: IGeoPoint,
57-
val zoom: Double,
58-
val tolerancePixels: Double,
59-
val toleranceMeters: Double,
60-
val clickedCell: HexCell,
61-
val hexSideLength: Double,
62-
val hexDistance: Double,
63-
val searchRadiusHexUnits: Int,
64-
val searchCells: List<HexCoord>,
65-
val outlineCells: List<HexCoord>,
66-
val markersInRange: List<MarkerState>,
67-
)
68-
69-
abstract class BaseMapViewController<ActualCamera, ActualMarker, ActualCircle, ActualPolyline, ActualPolygon> :
70+
abstract class BaseMapViewController<ActualMarker, ActualCircle, ActualPolyline, ActualPolygon> :
7071
MapViewController<ActualMarker, ActualCircle, ActualPolyline, ActualPolygon> {
7172
abstract val markerRenderer: MarkerRenderer<ActualMarker>
7273

@@ -120,201 +121,59 @@ abstract class BaseMapViewController<ActualCamera, ActualMarker, ActualCircle, A
120121

121122
protected abstract fun createCircleOverlayManager(): CircleOverlayManager<ActualCircle>
122123

123-
var cameraMoveListener: (OnCameraMoveHandler<ActualCamera>)? = null
124-
var mapClickListener: OnMapEventHandler? = null
125-
var mapLongClickListener: OnMapEventHandler? = null
126-
var markerClickListener: OnMarkerEventHandler? = null
127-
var markerDragStartListener: OnMarkerEventHandler? = null
128-
var markerDragListener: OnMarkerEventHandler? = null
129-
var markerDragEndListener: OnMarkerEventHandler? = null
130-
var circleClickListener: OnCircleEventHandler? = null
131-
var polylineClickListener: OnPolylineEventHandler? = null
124+
protected var cameraMoveCallback: OnCameraMoveHandler? = null
125+
protected var mapClickCallback: OnMapEventHandler? = null
126+
protected var mapLongClickCallback: OnMapEventHandler? = null
127+
protected var markerClickCallback: OnMarkerEventHandler? = null
128+
protected var markerDragStartCallback: OnMarkerEventHandler? = null
129+
protected var markerDragCallback: OnMarkerEventHandler? = null
130+
protected var markerDragEndCallback: OnMarkerEventHandler? = null
131+
protected var circleClickCallback: OnCircleEventHandler? = null
132+
protected var polylineClickCallback: OnPolylineEventHandler? = null
132133

133134
abstract fun setupListeners()
134135

136+
override fun setCameraMoveListener(listener: OnCameraMoveHandler?) {
137+
this.cameraMoveCallback = listener
138+
}
139+
140+
override fun setMapClickListener(listener: OnMapEventHandler?) {
141+
this.mapClickCallback = listener
142+
}
143+
144+
override fun setMapLongClickListener(listener: OnMapEventHandler?) {
145+
this.mapClickCallback = listener
146+
}
147+
148+
override fun setMarkerClickListener(listener: OnMarkerEventHandler?) {
149+
this.markerClickCallback = listener
150+
}
151+
152+
override fun setMarkerDragStartListener(listener: OnMarkerEventHandler?) {
153+
this.markerDragStartCallback = listener
154+
}
155+
156+
override fun setMarkerDragListener(listener: OnMarkerEventHandler?) {
157+
this.markerDragCallback = listener
158+
}
159+
160+
override fun setMarkerDragEndListener(listener: OnMarkerEventHandler?) {
161+
this.markerDragEndCallback = listener
162+
}
163+
164+
override fun setCircleClickListener(listener: OnCircleEventHandler?) {
165+
this.circleClickCallback = listener
166+
}
167+
168+
override fun setPolylineClickListener(listener: OnPolylineEventHandler?) {
169+
this.polylineClickCallback = listener
170+
}
171+
135172
override fun setOnMarkerAnimationStart(listener: OnMarkerEventHandler?) =
136173
markerRenderer
137174
.setOnMarkerAnimationStart(listener)
138175

139176
override fun setOnMarkerAnimationEnd(listener: OnMarkerEventHandler?) =
140177
markerRenderer
141178
.setOnMarkerAnimationEnd(listener)
142-
143-
// protected fun analyzeSearchRange(
144-
// position: IGeoPoint,
145-
// zoom: Double,
146-
// tolerancePixels: Double,
147-
// ): SearchRangeAnalysis {
148-
// val toleranceMeters =
149-
// markerOverlayManager.markerManager.metersPerPixel(
150-
// position, zoom, tolerancePixels,
151-
// )
152-
//
153-
// val clickedCell = hexGeocell.latLngToHexCell(position, zoom)
154-
//
155-
// // Hex metrics
156-
// val scale = 1.0 / (2.0.pow(zoom))
157-
// val latScale = kotlin.math.cos(position.latitude * kotlin.math.PI / 180).coerceAtLeast(0.01)
158-
// val hexSideLength = hexGeocell.baseHexSideLength * scale / latScale
159-
// val hexDistance = hexSideLength * kotlin.math.sqrt(3.0)
160-
// val searchRadiusHexUnits = kotlin.math.ceil(toleranceMeters / hexDistance).toInt()
161-
//
162-
// // Search cells
163-
// val searchCells = hexGeocell.hexRange(clickedCell.coord, searchRadiusHexUnits)
164-
// val outlineCells = findOutlineCells(searchCells)
165-
//
166-
// // Find markers in range
167-
// val markersInRange = findMarkersInSearchRange(position, searchCells, toleranceMeters, zoom)
168-
//
169-
// return SearchRangeAnalysis(
170-
// clickPosition = position,
171-
// zoom = zoom,
172-
// tolerancePixels = tolerancePixels,
173-
// toleranceMeters = toleranceMeters,
174-
// clickedCell = clickedCell,
175-
// hexSideLength = hexSideLength,
176-
// hexDistance = hexDistance,
177-
// searchRadiusHexUnits = searchRadiusHexUnits,
178-
// searchCells = searchCells,
179-
// outlineCells = outlineCells,
180-
// markersInRange = markersInRange,
181-
// )
182-
// }
183-
//
184-
// /**
185-
// * 検索範囲内のマーカーを特定
186-
// */
187-
// protected fun findMarkersInSearchRange(
188-
// clickPosition: IGeoPoint,
189-
// searchCells: List<HexCoord>,
190-
// toleranceMeters: Double,
191-
// zoom: Double,
192-
// ): List<MarkerState> {
193-
// val cellSet = searchCells.toSet()
194-
// val markersInRange = mutableListOf<MarkerState>()
195-
//
196-
// markerOverlayManager.markerManager.allEntities().forEach { markerEntity ->
197-
// val markerCell = hexGeocell.latLngToHexCell(markerEntity.state.position, zoom)
198-
//
199-
// if (markerCell.coord in cellSet) {
200-
// val distance = haversineDistance(clickPosition, markerEntity.state.position)
201-
// if (distance <= toleranceMeters) {
202-
// markersInRange.add(markerEntity.state)
203-
// }
204-
// }
205-
// }
206-
//
207-
// return markersInRange
208-
// }
209-
210-
// /**
211-
// * 検索範囲の外郭セルを特定
212-
// */
213-
// protected fun findOutlineCells(searchCells: List<HexCoord>): List<HexCoord> {
214-
// val cellSet = searchCells.toSet()
215-
//
216-
// return searchCells.filter { cell ->
217-
// // 近隣セルのいずれかが検索範囲外なら、これは外郭セル
218-
// cell.neighbors().any { neighbor ->
219-
// neighbor !in cellSet
220-
// }
221-
// }
222-
// }
223-
224-
// /**
225-
// * 円形の近似ポイントを生成
226-
// */
227-
// protected fun createCirclePoints(
228-
// center: IGeoPoint,
229-
// radiusMeters: Double,
230-
// numPoints: Int = 32,
231-
// ): List<IGeoPoint> {
232-
// val points = mutableListOf<IGeoPoint>()
233-
// val earthRadius = 6371000.0 // 地球半径(メートル)
234-
//
235-
// for (i in 0 until numPoints) {
236-
// val angle = 2.0 * kotlin.math.PI * i / numPoints
237-
// val deltaLat = radiusMeters * kotlin.math.cos(angle) / earthRadius * 180.0 / kotlin.math.PI
238-
// val deltaLng =
239-
// radiusMeters * kotlin.math.sin(angle) / earthRadius * 180.0 / kotlin.math.PI /
240-
// kotlin.math.cos(center.latitude * kotlin.math.PI / 180.0)
241-
//
242-
// points.add(
243-
// object : IGeoPoint {
244-
// override val latitude = center.latitude + deltaLat
245-
// override val longitude = center.longitude + deltaLng
246-
// override val altitude = center.altitude
247-
// },
248-
// )
249-
// }
250-
//
251-
// // 円を閉じる
252-
// if (points.isNotEmpty()) {
253-
// points.add(points[0])
254-
// }
255-
//
256-
// return points
257-
// }
258-
259-
// protected fun drawDistanceCircles(analysis: SearchRangeAnalysis) {
260-
// // 距離サークルの近似(正n角形として)
261-
// val circlePoints =
262-
// createCirclePoints(
263-
// center = analysis.clickPosition,
264-
// radiusMeters = analysis.toleranceMeters,
265-
// numPoints = 32,
266-
// )
267-
// drawPolyline(circlePoints)
268-
// }
269-
//
270-
// /**
271-
// * 各種可視化モード
272-
// */
273-
// protected fun drawClickedCell(analysis: SearchRangeAnalysis) {
274-
// val points =
275-
// hexGeocell.hexToPolygonLatLng(
276-
// coord = analysis.clickedCell.coord,
277-
// latHint = analysis.clickPosition.latitude,
278-
// zoom = analysis.zoom,
279-
// )
280-
// drawPolyline(points)
281-
// }
282-
283-
// protected fun drawFullSearchRange(analysis: SearchRangeAnalysis) {
284-
// val allPoints = mutableListOf<IGeoPoint>()
285-
//
286-
// analysis.searchCells.take(50).forEach { coord ->
287-
// // パフォーマンス制限
288-
// val cellPoints =
289-
// hexGeocell.hexToPolygonLatLng(
290-
// coord,
291-
// analysis.clickPosition.latitude,
292-
// analysis.zoom,
293-
// )
294-
// allPoints.addAll(cellPoints)
295-
// allPoints.add(cellPoints[0]) // 閉じる
296-
// }
297-
//
298-
// if (allPoints.isNotEmpty()) {
299-
// drawPolyline(allPoints)
300-
// }
301-
// }
302-
//
303-
// protected fun drawSearchOutline(analysis: SearchRangeAnalysis) {
304-
// val outlinePoints = mutableListOf<IGeoPoint>()
305-
//
306-
// analysis.outlineCells.forEach { coord ->
307-
// val cellPoints =
308-
// hexGeocell.hexToPolygonLatLng(
309-
// coord,
310-
// analysis.clickPosition.latitude,
311-
// analysis.zoom,
312-
// )
313-
// outlinePoints.addAll(cellPoints)
314-
// }
315-
//
316-
// if (outlinePoints.isNotEmpty()) {
317-
// drawPolyline(outlinePoints)
318-
// }
319-
// }
320179
}

mapconductor-core/src/main/java/com/mapconductor/core/map/MapViewBase.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ import kotlinx.coroutines.flow.collectLatest
4040
import kotlinx.coroutines.flow.debounce
4141

4242
typealias OnMapEventHandler = (GeoPoint) -> Unit
43-
typealias OnCameraMoveHandler<CameraPosition> = (CameraPosition) -> Unit
43+
typealias OnCameraMoveHandler = (MapCameraPosition) -> Unit
4444

4545
@OptIn(FlowPreview::class)
4646
@Composable
@@ -70,7 +70,7 @@ fun <
7070
) {
7171
val isResourceProviderReady by ResourceProvider.initialized.collectAsState()
7272
val initState by state.isInitialized.collectAsState()
73-
val cameraPosition by state.mapCameraPosition.collectAsState()
73+
val cameraPosition by state.cameraPosition.collectAsState()
7474
val bubbles by scope.bubbleFlow.collectAsState()
7575
val controller = controllerRef.value
7676

@@ -172,7 +172,7 @@ fun <
172172
}
173173
}
174174

175-
if (controller != null && cameraPosition != null && bubbles.isNotEmpty()) {
175+
if (controller != null && bubbles.isNotEmpty()) {
176176
Box(
177177
modifier =
178178
Modifier

mapconductor-core/src/main/java/com/mapconductor/core/map/MapViewState.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ interface MapViewState<T> {
2525
val id: String
2626
val initCameraPosition: MapCameraPosition
2727
val isInitialized: StateFlow<InitState>
28-
val mapCameraPosition: StateFlow<MapCameraPosition?>
28+
val cameraPosition: StateFlow<MapCameraPosition>
2929
val mapDesignType: MapDesignType<T>
3030

3131
fun initAsync(init: suspend () -> Boolean)

mapconductor-for-arcgis/src/main/java/com/mapconductor/arcgis/ArcGISMapView.kt

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -61,21 +61,21 @@ fun ArcGISMapView(
6161
state.controller = controller
6262
controller.holder.mapView.onCreate(owner)
6363
controller.holder.mapView.onResume(owner)
64-
controller.cameraMoveListener = state::OnCameraChange
65-
controller.mapClickListener = onMapClick
66-
controller.markerClickListener = onMarkerClick
67-
controller.markerDragStartListener = onMarkerDragStart
68-
controller.markerDragListener = onMarkerDrag
69-
controller.markerDragEndListener = onMarkerDragEnd
70-
controller.circleClickListener = onCircleClick
71-
controller.polylineClickListener = onPolylineClick
64+
controller.setCameraMoveListener(state::onCameraChange)
65+
controller.setMapClickListener(onMapClick)
66+
controller.setMarkerClickListener(onMarkerClick)
67+
controller.setMarkerDragStartListener(onMarkerDragStart)
68+
controller.setMarkerDragListener(onMarkerDrag)
69+
controller.setMarkerDragEndListener(onMarkerDragEnd)
70+
controller.setCircleClickListener(onCircleClick)
71+
controller.setPolylineClickListener(onPolylineClick)
7272
controller.setOnMarkerAnimationStart(onMarkerAnimateStart)
7373
controller.setOnMarkerAnimationEnd(onMarkerAnimateEnd)
7474

7575
state.controller = controller
7676

7777
val restoreCameraPosition =
78-
state.mapCameraPosition.value
78+
state.cameraPosition.value
7979
?: MapCameraPosition.from(state.initCameraPosition)
8080
controller.moveCamera(restoreCameraPosition)
8181

0 commit comments

Comments
 (0)