11package com.google.maps.android.compose.clustering
22
3+ import android.content.Context
34import android.os.Handler
45import android.os.Looper
56import androidx.compose.runtime.Composable
@@ -138,6 +139,7 @@ public fun <T : ClusterItem> Clustering(
138139 clusterContentZIndex : Float = 0.0f,
139140 clusterItemContentZIndex : Float = 0.0f,
140141 clusterRenderer : ClusterRenderer <T >? = null,
142+ clusterItemDecoration : @Composable @GoogleMapComposable (T ) -> Unit = {},
141143) {
142144 val clusterManager = rememberClusterManager(
143145 clusterContent,
@@ -158,6 +160,8 @@ public fun <T : ClusterItem> Clustering(
158160 Clustering (
159161 items = items,
160162 clusterManager = clusterManager,
163+ clusterItemDecoration = clusterItemDecoration,
164+ renderer = clusterManager.renderer,
161165 )
162166}
163167
@@ -193,6 +197,7 @@ public fun <T : ClusterItem> Clustering(
193197 clusterItemContentAnchor : Offset = Offset (0.5f, 1.0f),
194198 clusterContentZIndex : Float = 0.0f,
195199 clusterItemContentZIndex : Float = 0.0f,
200+ clusterItemDecoration : @Composable @GoogleMapComposable (T ) -> Unit = {},
196201) {
197202 Clustering (
198203 items = items,
@@ -206,6 +211,7 @@ public fun <T : ClusterItem> Clustering(
206211 clusterItemContentAnchor = clusterItemContentAnchor,
207212 clusterContentZIndex = clusterContentZIndex,
208213 clusterItemContentZIndex = clusterItemContentZIndex,
214+ clusterItemDecoration = clusterItemDecoration,
209215 onClusterManager = null ,
210216 )
211217}
@@ -244,6 +250,7 @@ public fun <T : ClusterItem> Clustering(
244250 clusterItemContentAnchor : Offset = Offset (0.5f, 1.0f),
245251 clusterContentZIndex : Float = 0.0f,
246252 clusterItemContentZIndex : Float = 0.0f,
253+ clusterItemDecoration : @Composable @GoogleMapComposable (T ) -> Unit = {},
247254 onClusterManager : ((ClusterManager <T >) -> Unit )? = null,
248255) {
249256 val clusterManager = rememberClusterManager<T >()
@@ -277,6 +284,8 @@ public fun <T : ClusterItem> Clustering(
277284 Clustering (
278285 items = items,
279286 clusterManager = clusterManager,
287+ clusterItemDecoration = clusterItemDecoration,
288+ renderer = renderer,
280289 )
281290 }
282291}
@@ -293,6 +302,24 @@ public fun <T : ClusterItem> Clustering(
293302public fun <T : ClusterItem > Clustering (
294303 items : Collection <T >,
295304 clusterManager : ClusterManager <T >,
305+ clusterItemDecoration : @Composable @GoogleMapComposable (T ) -> Unit = {},
306+ ) {
307+ Clustering (
308+ items = items,
309+ clusterManager = clusterManager,
310+ clusterItemDecoration = clusterItemDecoration,
311+ renderer = null
312+ )
313+ }
314+
315+ @Composable
316+ @GoogleMapComposable
317+ @MapsComposeExperimentalApi
318+ internal fun <T : ClusterItem > Clustering (
319+ items : Collection <T >,
320+ clusterManager : ClusterManager <T >,
321+ clusterItemDecoration : @Composable @GoogleMapComposable (T ) -> Unit = {},
322+ renderer : ClusterRenderer <T >? = null,
296323) {
297324 ResetMapListeners (clusterManager)
298325 InputHandler (
@@ -327,6 +354,13 @@ public fun <T : ClusterItem> Clustering(
327354 clusterManager.cluster()
328355 }
329356 }
357+
358+ val actualRenderer = renderer ? : clusterManager.renderer
359+ val unclusteredItems by (actualRenderer as ? ClusterRendererItemState <T >)?.unclusteredItems
360+ ? : remember { mutableStateOf(emptySet()) }
361+ unclusteredItems.forEach { item ->
362+ clusterItemDecoration(item)
363+ }
330364}
331365
332366
@@ -341,7 +375,7 @@ public fun <T : ClusterItem> rememberClusterRenderer(
341375
342376 clusterManager ? : return null
343377 MapEffect (context) { map ->
344- val renderer = DefaultClusterRenderer (context, map, clusterManager)
378+ val renderer = ReportingDefaultClusterRenderer (context, map, clusterManager)
345379 clusterRendererState.value = renderer
346380 }
347381
@@ -457,7 +491,7 @@ private fun <T : ClusterItem> rememberClusterManager(
457491 clusterItemContentZIndexState,
458492 )
459493 } else {
460- DefaultClusterRenderer (context, map, clusterManager)
494+ ReportingDefaultClusterRenderer (context, map, clusterManager)
461495 }
462496 clusterManager.renderer = renderer
463497 }
@@ -488,3 +522,19 @@ private fun ResetMapListeners(
488522 }
489523 }
490524}
525+
526+ private class ReportingDefaultClusterRenderer <T : ClusterItem >(
527+ context : Context ,
528+ map : GoogleMap ,
529+ clusterManager : ClusterManager <T >
530+ ) : DefaultClusterRenderer<T>(context, map, clusterManager), ClusterRendererItemState<T> {
531+
532+ override val unclusteredItems = mutableStateOf(emptySet<T >())
533+
534+ override fun onClustersChanged (clusters : Set <Cluster <T >>) {
535+ super .onClustersChanged(clusters)
536+ unclusteredItems.value = clusters.filter { ! shouldRenderAsCluster(it) }
537+ .flatMap { it.items }
538+ .toSet()
539+ }
540+ }
0 commit comments