Skip to content

Commit

Permalink
feat!: add custom ClusterRenderer (#360)
Browse files Browse the repository at this point in the history
* feat!: added custom ClusterRenderer

* doc: remove excess dependencies from install instructions in README
  • Loading branch information
kikoso committed Oct 2, 2023
1 parent 16cd89e commit 3ebb6fd
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 18 deletions.
7 changes: 3 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,13 +18,12 @@ This repository contains [Jetpack Compose][jetpack-compose] components for the [

## Installation

You no longer need to specify the Maps SDK for Android or its Utility Library as separate dependencies, since `maps-compose` and `maps-compose-utils` pull in the appropriate versions of these respectively.

```groovy
dependencies {
implementation 'com.google.maps.android:maps-compose:2.15.0'
// Make sure to also include the latest version of the Maps SDK for Android
// See latest version at https://goo.gle/android-maps-sdk-version
// Optionally, you can include the Compose utils library for Clustering, etc.
implementation 'com.google.maps.android:maps-compose-utils:2.15.0'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import com.google.android.gms.maps.GoogleMap
import com.google.maps.android.clustering.Cluster
import com.google.maps.android.clustering.ClusterItem
import com.google.maps.android.clustering.ClusterManager
import com.google.maps.android.clustering.view.ClusterRenderer
import com.google.maps.android.clustering.view.DefaultClusterRenderer
import com.google.maps.android.collections.MarkerManager
import com.google.maps.android.compose.GoogleMapComposable
Expand All @@ -39,6 +40,7 @@ import kotlinx.coroutines.launch
* window of a non-clustered item
* @param clusterContent an optional Composable that is rendered for each [Cluster].
* @param clusterItemContent an optional Composable that is rendered for each non-clustered item.
* @param clusterRenderer an optional ClusterRenderer that can be used to specify the algorithm used by the rendering.
*/

@Composable
Expand All @@ -52,9 +54,11 @@ public fun <T : ClusterItem> Clustering(
onClusterItemInfoWindowLongClick: (T) -> Unit = { },
clusterContent: @[UiComposable Composable] ((Cluster<T>) -> Unit)? = null,
clusterItemContent: @[UiComposable Composable] ((T) -> Unit)? = null,
clusterRenderer: ClusterRenderer<T>? = null
) {

val clusterManager = rememberClusterManager(clusterContent, clusterItemContent) ?: return
val clusterManager = rememberClusterManager(clusterContent, clusterItemContent, clusterRenderer) ?: return

ResetMapListeners(clusterManager)
SideEffect {
clusterManager.setOnClusterClickListener(onClusterClick)
Expand Down Expand Up @@ -95,6 +99,7 @@ public fun <T : ClusterItem> Clustering(
private fun <T : ClusterItem> rememberClusterManager(
clusterContent: @Composable ((Cluster<T>) -> Unit)?,
clusterItemContent: @Composable ((T) -> Unit)?,
clusterRenderer: ClusterRenderer<T>? = null
): ClusterManager<T>? {
val clusterContentState = rememberUpdatedState(clusterContent)
val clusterItemContentState = rememberUpdatedState(clusterItemContent)
Expand All @@ -109,19 +114,20 @@ private fun <T : ClusterItem> rememberClusterManager(
clusterContentState.value != null || clusterItemContentState.value != null
}
.collect { hasCustomContent ->
val renderer = if (hasCustomContent) {
ComposeUiClusterRenderer(
context,
scope = this,
map,
clusterManager,
viewRendererState,
clusterContentState,
clusterItemContentState,
)
} else {
DefaultClusterRenderer(context, map, clusterManager)
}
val renderer = clusterRenderer
?: if (hasCustomContent) {
ComposeUiClusterRenderer(
context,
scope = this,
map,
clusterManager,
viewRendererState,
clusterContentState,
clusterItemContentState,
)
} else {
DefaultClusterRenderer(context, map, clusterManager)
}
clusterManager.renderer = renderer
}
}
Expand Down

0 comments on commit 3ebb6fd

Please sign in to comment.